@toc
1、提升方法(Boosting)
1.1、相关知识
提升方法(Boosting),是一种可以用来减小监督式学习中偏差的机器学习算法。面对的问题是迈可·肯斯(Michael Kearns)提出的:一组“弱学习者”的集合能否生成一个“强学习者”?弱学习者一般是指一个分类器,它的结果只比随机分类好一点点;强学习者指分类器的结果非常接近真值。
在提升方法中,给每个训练元组一个权重。在迭代学习k个基分类器的过程中,学习得到分类器
Mi之后,更新元组的权重。使其后的分类器更关注
Mi误分类的训练元组。最终提升的分类器
M∗组合每个分类器的表决,其中每个分类器投票的权重是其准确率的函数。
1.2 Boosting提出
提升方法是一个迭代的过程:
- 通过改变样本分布,使得分类器聚集在那些很难分的样本上,对那些容易错分的数据加强学习,增加错分数据的权重;
- 这样错分的数据再下一轮的迭代就有更大的作用(对错分数据进行提升)。
1.3 示例
假如我们现在有如下两种类别的数据:
首先,学习了第一个线性分类器
很明显,这个线性分类器存在数据被错分的情况,那么我们在学习第二个模型的时候,那么我们在第二个线性分类器中就要尽可能把第一个线性分类器中分错的数据要分对。
生成第二个线性分类器:
第二个线性分类器尽管把前面分错的数据分对了,但是又产生了新的错误数据。
针对新的错误再学习生成一个分类器,再尽可能把错误的数据分对。
这样我们就得到了三个基分类器,越往后的分类器越能关心疑难杂症,对很难分对的数据它能够分对,说明它的分类能力很强,因此给它更高的权重。
2、AdaBoost算法
2.1 算法
Boosting算法之一:AdaBoost算法,算法步骤如下
2.2 Adaboost例1
假设我们有如下数据训练样本,假设初始时样本权重相同
可以看到,123789为同一类,4,5,6,10为同一类。
根据x>v和x<v来分类。
第一次迭代
以2.5为数据的分类界限,x<2.5时预测为正类,x>2,5时预测为负类
G1(x)={1,x<2.5−1,x>2.5
我们发现有三条数据被越策错了。
G1(x)误差:
e1=P(G1(xi)=yi)=∑G1(xi)=yiW1i=0.1+0.1+0.1=0.3
G1(x)权重:
α1=21lne11−e1=21ln0.31−0.3≈0.42365
分类函数:
f1(x)=α1G1(x)=0.42365G1(x)
根据错分的样本调整权值:
w2i=Z1w1iexp(−yiα1G1(xi))=⎩⎪⎨⎪⎧0.91650.1exp(−[1×0.4236×1])0.91650.1exp(−[(−1)×0.4236×(−1)])0.91650.1exp(−[1×0.4236×(−1)])i=1,2,3i=4,5,6,10i=7,8,9≈⎩⎪⎨⎪⎧0.071430.071430.16666i=1,2,3i=4,5,6,10i=7,8,9
更新后的权重为:
第二次迭代
G2(x)={1,x<8.5−1,x>8.5
再次对错分的数据计算误差和权重:
G2(x)误差:$e_2=P(G_2(x_i)\ne y_i)= {\textstyle \sum_{G_2(x_i)\ne y_i}^{}W_{2i}}=0.07143+0.07143+0.07143=0.21429 $
G2(x)权重:
α2=21lne21−e2=21ln0.214291−0.21429≈0.64963
分类函数:
f2(x)=α1G2(x)=0.64963G2(x)
根据错分的样本调整权值:
w2i=Z2w2iexp(−yiα2G2(xi))=⎩⎪⎪⎪⎨⎪⎪⎪⎧0.820650.07143exp(−[1×0.64963×1])0.820650.07143exp(−[(−1)×0.64963×1])0.820650.07143exp(−[1×0.64963×1])0.820650.07143exp(−[(−1)×0.64963×(−1)])i=1,2,3i=4,5,6i=7,8,9i=10≈⎩⎪⎪⎪⎨⎪⎪⎪⎧0.045460.166670.106060.04546i=1,2,3i=4,5,6i=7,8,9i=10
更新后的权重为:
第三次迭代
G3(x)={−1,x<5.51,x>5.5
再次对错分的数据计算误差和权重:
G3(x)误差:
e3=P(G3(xi)=yi)=∑G3(xi)=yiW3i=0.04546+0.04546+0.04546+0.04546=0.18184
G3(x)权重:
α3=21lne31−e3=21ln0.181841−0.18188≈0.75197
分类函数:
f3(x)=α1G3(x)=0.75197G3(x)
更新后的权值:
最终分类器
Gm(x)=sign(0.42365G1(x)+0.64963G2(x)+0.75197G3(x))
G1(x)={1,x<2.5−1,x>2.5
G2(x)={1,x<8.5−1,x>8.5
G3(x)={−1,x<5.51,x>5.5
2.3 Adaboost例2
假设有训练数据集:
第一次迭代:
第二次迭代:
第三次迭代:
最终分类器:
3、其他Boosting算法
不同的损失函数和极小化损失函数方法决定了boosting的最终效果。
4、实战
使用Python
语言编程,使用 iris 数据集训练一个 AdaBoostClassifier
分类器。AdaBoostClassifier
在 scikit-learn
库的 ensemble
包之中。AdaBoostClassifier
使用很简单,三步:
- 创建 AdaBoostClassifier 对象
- 调用 fit 函数
- 调用 predict 函数进行预测
from sklearn.ensemble import AdaBoostClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris
import numpy as np
iris = load_iris()
X = iris["data"]
y = iris["target"]
np.random.seed(0)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
clf = AdaBoostClassifier(n_estimators=100)
clf.fit(X_train,y_train)
print('训练集准确率:', accuracy_score(y_train, clf.predict(X_train)))
print('测试集准确率:', accuracy_score(y_test, clf.predict(X_test)))
评论(0)