AdaBoost是Boosting这类算法中的著名代表,它有多种推导方式,比较容易理解的就是基学习器的线性组合来最小化指数损失函数。
【AdaBoost算法过程】
输入:训练数据集
T={(x1,y1),(x2,y2),...,(xN,yN)}
,其中
xi∈X⊆Rn
,标记
yi∈Y={−1,+1}
输出:最终分类器
G(x)
(1)初始化原始训练数据集的权值分布
D1
;
D1=(w11,w12,...,w1N)
,
w1i=1N
假设原始训练数据集具有均匀的权值分布
(2)对
m=1,2,...,M
①使用具有权值分布
Dm
的训练数据集学习,得到基分类器
Gm(x):X→{−1,+1}
②计算
Gm(x)
在训练数据集上的分类误差率
em
em=∑i=1NP(Gm(xi)≠yi)=∑Gm(xi)≠yiwmi∑i=1Nwmi=∑i=1NwmiI(Gm(xi)≠yi)
wmi表示第m轮中第i个实例的权值,我们定义分类误差率em为被Gm(x)
误分类的样本对应的权值之和除以所有样本权值之和,由于所有样本权值
之和为1,即∑i=1Nwmi=1,所以em即为∑Gm(xi)≠yiwmi
③计算
Gm(x)
的系数
αm
αm=12ln1−emem
系数αm表示着对应的基分类器Gm(x)在最终分类器中的重要性,当em≤12时,
αm≥0,并且αm随着em的减小而增大,也就是说分类误差率越小的基分类器
在最终分类器中的作用越大
④更新训练数据集的权值分布
Dm+1
Dm+1=(wm+1,1,wm+1,2,...,wm+1,N)
更新权值分布即更新每一个样本的权重,可以写成下面这种形式:
wm+1,i= {wmiZme−αm,wmiZmeαm,Gm(xi)=yiGm(xi)≠yi
我们也可以把条件项写到式子里,因为yi和Gm(xi)的取值都为−1或+1,也就
是说当Gm(xi)=yi时,yiGm(xi)=1;当Gm(xi)≠yi时,yiGm(xi)=−1
因此上式可以写为:
wm+1,i=wmiZme−αmyiGm(xi)
上式中的Zm是规范化因子,它使Dm+1成为一个概率分布
Zm=∑i=1Nwmie−αmyiGm(xi)
(3)对第(2)步中学习到的M个基分类器进行线性组合得到最终分类器
线性组合:
f(x)=∑m=1MαmGm(x)
最终分类器:
G(x)=sign(f(x))=sign(∑m=1MαmGm(x))
算法过程如下图:
【AdaBoost算法的训练误差分析】
AdaBoost算法最基本的性质就是在学习过程中不断减少训练误差,即减少训练数据集上的分类误差率。对于AdaBoost算法来说,其最终分类器的训练误差是有上界的。而对于下界,我们不需要知道。
其训练误差界为:
1N∑i=1NI(G(xi)≠yi)≤1N∑i=1Ne−yif(xi)=∏m=1MZm
1N∑i=1NI(G(xi)≠yi)即N个样本中被误分类的样本个数N,对上式的证明如下:
前半部分:
1N∑i=1NI(G(xi)≠yi)≤1N∑i=1Ne−yif(xi)
当G(xi)≠yi时,yif(xi)<0,则e−yif(xi)≥1,由此可得前半部分
后半部分:
1N∑i=1Ne−yif(xi)=∏m=1MZm
已知
f(xi)=∑m=1MαmGm(xi)
,
Zmwm+1,i=wmie−αmyiGm(xi)
1N∑i=1Ne−yif(xi)=1N∑i=1Ne−∑m=1MαmyiGm(xi)=1N∑i=1N∏m=1Me−αmyiGm(xi)
=∑i=1Nw1i∏m=1Me−αmyiGm(xi)
此处我们将1N看成w1i,因为w1i就是均匀的权值分布
=∑i=1Nw1ie−α1yiG1(xi)∏m=2Me−αmyiGm(xi)
(观察∑i=1Nw1ie−α1yiG1(xi)可以发现就等于Z1∑i=1Nw2i)
=Z1∑i=1Nw2i∏m=2Me−αmyiGm(xi)=Z1∑i=1Nw2ie−α2yiG2(xi)∏m=3Me−αmyiGm(xi)
=Z1Z2∑i=1Nw3i∏m=3Me−αmyiGm(xi)
=...=Z1Z2...ZM−1∑i=1NwMie−αMyiGM(xi)=∏m=1MZm
我们根据这样的结论可以在每一轮选取适当的
Gm
使得
Zm
最小,从而使训练误差下降最快。
注意,这里是只对每一轮的Zm使其最小化,不是对Zm的乘积最小化
对于二类分类的AdaBoost的训练误差界为:
由于
Zm=∑i=1Nwmie−αmyiGm(xi)=∑yi=Gm(xi)wmie−αm+∑yi≠Gm(xi)wmieαm
∑yi=Gm(xi)wmi=1−em
∑yi≠Gm(xi)wmi=em
e−αm=e−12ln1−emem=em1−em−−−−√
eαm=e12ln1−emem=1−emem−−−−√
所以
Zm=2em(1−em)−−−−−−−−−√
,令
γm=12−em
,则
Zm=1−4γ2m−−−−−−−√
因此∏m=1MZm=∏m=1M2em(1−em)−−−−−−−−−√=∏m=1M1−4γ2m−−−−−−−√≤e−2∑m=1Mγ2m
此处的e−2∑m=1Mγ2m是通过ex和1−x−−−−−√在点x=0的泰勒展开式推出的,推导如下:
ex在x=0处泰勒展开:
ex=1+x+12x2+o(x2)
e−2γ2m=1−2γ2m+12(−2γ2m)2=1−2γ2m+2γ4m
1−x−−−−−√在x=0处泰勒展开:
1−x−−−−−√=1−12x−18x2+o(x2)
1−4γ2m−−−−−−−√=1−124γ2m−18(4γ2m)2=1−2γ2m−2γ4m
因此1−4γ2m−−−−−−−√≤e−2γ2m
如果存在γ>0,对所有m有γm≥γ,则1N∑i=1NI(G(xi)≠yi)≤e−2Mγ2
在此条件下,我们可以发现AdaBoost的训练误差是以指数速率下降的
下一篇会讨论前向分步算法和提升树,其实感觉前向分步算法加基函数线性组合就是一个框架,而AdaBoost算法和提升树都是利用这个框架来实现的。它们的不同点大多在于损失函数,而对于难以优化的损失函数我们会用梯度提升(最速下降的近似方法)来求解,这也就是梯度提升树的由来。
参考文献:《统计学习方法》