本文是基于刘建平老师的关于Adaboost的博文为模板,就其中损失函数的推导部分加以细化。网上基本所有关于Adaboost推导过程中都有假设: wki’=wki,个人之前在看到这一步的时候总是理解不了这个假设的由来,网上也一直找不到相关的解释。本文的推导过程就舍弃这个假设,并详细推导了两者之间到底是什么关系。
如果对基本原理比较熟悉的同鞋,可以直接跳到本文第3部分了解详细推导过程。
集成学习按照个体学习器之间是否存在依赖关系可以分为两类,第一个是个体学习器之间存在强依赖关系,另一类是个体学习器之间不存在强依赖关系。前者的代表算法就是boosting系列算法。在boosting系列算法中, Adaboost是最著名的算法之一。Adaboost既可以用作分类,也可以用作回归。本文就对Adaboost算法做一个总结。
1. 回顾boosting算法的基本原理
boosting算法系列的基本思想,如下图:
从图中可以看出,Boosting算法的工作机制是首先从训练集用初始权重训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重,使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2,如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。
不过有几个具体的问题Boosting算法没有详细说明。
1)如何计算学习误差率e?
2)如何得到弱学习器权重系数α?
3)如何更新样本权重D?
4)使用何种结合策略?
只要是boosting大家族的算法,都要解决这4个问题。那么Adaboost是怎么解决的呢?
2. Adaboost算法的基本思路
我们这里讲解Adaboost是如何解决上一节这4个问题的。
假设我们的训练集样本是:
T={(x,y1),(x2,y2),...(xm,ym)}
训练集的在第k个弱学习器的输出权重为:
D(k)=(wk1,wk2,...wkm);w1i=m1;i=1,2...m
首先我们看看Adaboost的分类问题:
分类问题的误差率很好理解和计算。由于多元分类是二元分类的推广,这里假设我们是二元分类问题,输出为{-1,1},则第k个弱分类器Gk(x)在训练集上的加权误差率为:
ek=P(Gk(xi)=yi)=i=1∑mwkiI(Gk(xi)=yi)
接着我们看弱学习器权重系数,对于二元分类问题,第k个弱分类器Gk(x)的权重系数为:
αk=21logek1−ek
为什么这样计算弱学习器权重系数?从上式可以看出,如果分类误差率ek越大,则对应的弱分类器权重系数ak越小。也就是说,误差率小的弱分类器权重系数越大。具体为什么采用这个权重系数公式,我们在讲Adaboost的损失函数优化时再讲。
第三个问题,更新样本权重D。假设第k个弱分类器的样本集权重系数为:D(k)=(wk1,wk2,...wkm),则对应的第k+1个弱分类器的样本集权重系数为:
wk+1,i=Zkwkiexp(−αkyiGk(xi))
这里Zk是规范化因子:
Zk=i=1∑mwkiexp(−αkyiGk(xi))
从wk+1,i计算公式可以看出,如果第i个样本分类错误,则yiGk(xi)<0,导致样本的权重在第k+1个弱分类器中增大,如果分类正确,则权重在第k+1个弱分类器中减少.具体为什么采用样本权重更新公式,我们在讲Adaboost的损失函数优化时再讲。
最后一个问题是集合策略。Adaboost分类采用的是加权表决法,最终的强分类器为:
f(x)=sign(k=1∑KαkGk(x))
接着我们看看Adaboost的回归问题:
由于Adaboost的回归问题有很多变种,这里我们以Adaboost R2算法为准。
我们先看看回归问题的误差率的问题,对于第k个弱学习器,计算他在训练集上的最大误差:
Ek=max∣yi−Gk(xi)∣i=1,2...m
然后计算每个样本的相对误差:
eki=Ek∣yi−Gk(xi)∣
这里是误差损失为线性时的情况,如果我们用平方误差,则eki=Ek2(yi−Gk(xi))2,如果我们用的是指数误差,则eki=1−exp(Ek−yi+Gk(xi)))
最终得到第k个弱学习器的误差率:
ek=i=1∑mwkieki
我们再来看看如何得到弱学习器权重系数α。这里有:
αk=1−ekek
对于更新样本权重D,第k+1个弱学习器的样本集权重系数为:
wk+1,i=Zkwkiαk1−eki
这里Zk是规范化因子:
Zk=i=1∑mwkiαk1−eki
最后是结合策略,和分类问题稍有不同,采用的是对加权的弱学习器取权重中位数对应的弱学习器作为强学习器的方法,最终的强回归器为:
f(x)=Gk∗(x)
其中,Gk∗(x)是所有lnαk1,k=1,2,....K的中位数值对应序号k∗对应的弱学习器。
3. AdaBoost分类问题的损失函数优化
刚才上一节我们讲到了分类Adaboost的弱学习器权重系数公式和样本权重更新公式。但是没有解释选择这个公式的原因,让人觉得是魔法公式一样。其实它可以从Adaboost的损失函数推导出来。
从另一个角度讲,Adaboost是模型为加法模型,学习算法为前向分步学习算法,损失函数为指数函数的分类问题。
模型为加法模型好理解,我们的最终的强分类器是若干个弱分类器加权平均而得到的。
前向分步学习算法也好理解,我们的算法是通过一轮轮的弱学习器学习,利用前一个强学习器的结果和当前弱学习器来更新当前的强学习器的模型。也就是说,第k-1轮的强学习器为:
fk−1(x)=i=1∑k−1αiGi(x)
而第k轮的强学习器为:
fk(x)=i=1∑kαiGi(x)
上两式一比较可以得到:
fk(x)=fk−1(x)+αkGk(x)
可见强学习器的确是通过前向分步学习算法一步步而得到的。
Adaboost损失函数为指数函数,即定义损失函数为:
α,Gargmini=1∑mexp(−yifk(x))
利用前向分步学习算法的关系可以得到损失函数为:
(αk,Gk(x))=α,Gargmini=1∑mexp[(−yi)(fk−1(x)+αG(x))]
令wki’=exp(−yifk−1(x)), 它的值不依赖于α,G,因此与最小化无关,仅仅依赖于fk−1(x),随着每一轮迭代而改变。
将这个式子带入损失函数,损失函数转化为:
(αk,Gk(x))=α,Gargmini=1∑mwki’exp[−yiαG(x)]
损失函数进一步转换:
i=1∑mwki’exp[−yiαG(x)]=yi=Gm(xi)∑wki′e−α+yi=Gm(xi)∑wki′eα=e−αyi=Gm(xi)∑wki′+eαyi=Gm(xi)∑wki′=e−αi=1∑mwki’I(yi=Gk(xi))+eαi=1∑mwki’I(yi=Gk(xi))=e−αi=1∑mwki’+(eα−e−α)i=1∑mwki’I(yi=Gk(xi))
其中: wki’=exp(−yifk−1(x))
因: ek=i=1∑mwkiI(Gk(xi)=yi)
坑位:在很多博客的推导过程中,都假设: wki’=wki。
个人认为这个假设不太严谨,原因如下:
wki是第k个分类器各样本的权重,是规范化后的权重系数,所以有
i=1∑mwki=1
而wki’的加和是不一定为1的。
下面我们来探索下wki’和wki的关系:
我们知道第k+1个弱分类器的样本集权重系数为: wk+1,i=ZKwkiexp(−αkyiGk(xi))
这里Zk是规范化因子: Zk=i=1∑mwkiexp(−αkyiGk(xi))
推导:
wk,i=Zk−1wk−1,iexp(−αk−1yiGk−1(xi)=Zk−1exp(−yiαk−1Gk−1(xi))Zk−2wk−2,iexp(−yiαk−2Gk−2(xi))=…=Zk−1Zk−2…Z1exp(−yiαk−1Gk−1(xi))exp(−yiαk−2Gk−2(xi))…exp(−yiα1G1(xi))w1,i=k=1∏k−1Zkexp(−yiαk−1Gk−1(xi)+−yiαk−2Gk−2(xi)+…+−yiα1G1(xi))m1=k=1∏k−1Zkexp(−yifk−1(xi))m1
因为:wki’=exp(−yifk−1(x)),故wki=k=1∏k−1Zkwki’m1
对第k个弱分类器来说,前面k-1个弱分类器已经产生,因此每个弱分类器对应的规范化因子Zk都是常数,而m为总样本数。
假设常数:b=mk=1∏k−1Zk,则有:wki’=bwki
这里两者的关系就搞清楚了。
下面继续推导上面的损失函数:
由:wki’=bwki
得损失函数:
g(α)=i=1∑mwki’exp[−yiαG(x)]=e−αi=1∑mwki’+(eα−e−α)i=1∑mwki’I(yi=Gk(xi))=e−αi=1∑mbwki+(eα−e−α)i=1∑mbwkiI(yi=Gk(xi))
对g(α)求导得:
∂α∂g(α)=−e−αi=1∑mbwki+(eα+e−α)i=1∑mbwkiI(yi=Gk(xi))=0
得:(eα+e−α)i=1∑mbwkiI(yi=Gk(xi))=e−αi=1∑mbwki
因:
ek=i=1∑mwkiI(Gk(xi)=yi)
i=1∑mwki=1
得:
(eα+e−α)bek=e−αb
(eα+e−α)ek=e−α
故得:α=21lnek1−ek
其中:ek=i=1∑mwkiI(Gk(xi)=yi)
由上面推导的:
wki=k=1∏k−1Zkexp(−yifk−1(xi))m1
得:
wk+1,i=k=1∏kZkexp(−yifk(xi))m1=k=1∏kZkexp(−yi(fk−1(xi)+αkGk)m1=Zkwkiexp(−yiαkGk(xi))
这里Zk是规范化因子
Zk=i=1∑mwkiexp(−yiαkGk(xi))
4. AdaBoost二元分类问题算法流程
这里我们对AdaBoost二元分类问题算法流程做一个总结。
输入为样本集T={(x,y1),(x2,y2),...(xm,ym)},输出为{-1, +1},弱分类器算法, 弱分类器迭代次数K。
输出为最终的强分类器f(x)。
1)初始化样本集权重为:
D(1)=(w11,w12,...w1m);w1i=m1;i=1,2...m
2)对于k=1,2,…,K:
a)使用具有权重Dk的样本集来训练数据,得到弱分类器Gk(x)
b)计算Gk(x)的分类误差率:
ek=P(Gk(xi)=yi)=i=1∑mwkiI(Gk(xi)=yi)
c)计算弱分类器的系数:
αk=21logek1−ek
d)更新样本集的权重分布:
wk+1,i=ZKwkiexp(−αkyiGk(xi))i=1,2,...m
这里Zk是规范化因子:
Zk=i=1∑mwkiexp(−αkyiGk(xi))
3)构建最终分类器为:
f(x)=sign(k=1∑KαkGk(x))
对于Adaboost多元分类算法,其实原理和二元分类类似,最主要区别在弱分类器的系数上。比如Adaboost SAMME算法,它的弱分类器的系数:
αk=21logek1−ek+log(R−1)
其中R为类别数。从上式可以看出,如果是二元分类,R=2,则上式和我们的二元分类算法中的弱分类器的系数一致。
5. Adaboost回归问题的算法流程
这里我们对AdaBoost回归问题算法流程做一个总结。AdaBoost回归算法变种很多,下面的算法为Adaboost R2回归算法过程。
输入为样本集T={(x,y1),(x2,y2),...(xm,ym)},弱学习器算法, 弱学习器迭代次数K。
输出为最终的强学习器f(x)。
1)初始化样本集权重为:
D(1)=(w11,w12,...w1m);w1i=m1;i=1,2...m
2)对于k=1,2,…,K:
a)使用具有权重Dk的样本集来训练数据,得到弱学习器Gk(x)
b)计算训练集上的最大误差
Ek=max∣yi−Gk(xi)∣i=1,2...m
c)计算每个样本的相对误差:
如果是线性误差,则eki=Ek∣yi−Gk(xi)∣;
如果是平方误差,则eki=Ek2(yi−Gk(xi))2;
如果是指数误差,则eki=1−exp(Ek−∣yi−Gk(xi)∣)
d) 计算回归误差率
ek=i=1∑mwkieki
c)计算弱学习器的系数
αk=1−ekek
d)更新样本集的权重分布为
wk+1,i=Zkwkiαk1−eki
这里Zk是规范化因子:
Zk=i=1∑mwkiαk1−eki
3)构建最终强学习器为:
f(x)=Gk∗(x)
其中,Gk∗(x)是所有lnαk1,k=1,2,....K的中位数值对应序号k∗对应的弱学习器。
6. Adaboost算法的正则化
为了防止Adaboost过拟合,我们通常也会加入正则化项,这个正则化项我们通常称为步长(learning rate)。定义为ν,对于前面的弱学习器的迭代:
fk(x)=fk−1(x)+αkGk(x)
如果我们加上了正则化项,则有:
fk(x)=fk−1(x)+ναkGk(x)
ν的取值范围为0<ν≤1。对于同样的训练集学习效果,较小的ν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。
7. Adaboost小结
到这里Adaboost就写完了,前面有一个没有提到,就是弱学习器的类型。理论上任何学习器都可以用于Adaboost.但一般来说,使用最广泛的Adaboost弱学习器是决策树和神经网络。对于决策树,Adaboost分类用了CART分类树,而Adaboost回归用了CART回归树。
这里对Adaboost算法的优缺点做一个总结。
Adaboost的主要优点有:
1)Adaboost作为分类器时,分类精度很高
2)在Adaboost的框架下,可以使用各种回归分类模型来构建弱学习器,非常灵活。
3)作为简单的二元分类器时,构造简单,结果可理解。
4)不容易发生过拟合
Adaboost的主要缺点有:
对异常样本敏感,异常样本在迭代中可能会获得较高的权重,影响最终的强学习器的预测准确性。