AdaBoost
基本思想
对于分类问题而言,给定一个训练样本集,求比较粗糙的分类规则(弱分类器)要比求精确的分类规则(强分类器)容易的多,提升方法就是从弱学习算法出发,反复学习,得到一系列弱分类器(基本分类器),然后组合这些弱分类器,构成一个强分类器。大多数的提升方法都是改变训练数据的概率分布,针对不同的训练数据分布调用弱学习算法学习一系列弱分类器。
对于提升方法来说,有两个问题需要回答:一是在每一轮如何改变训练数据的权值或概率分布;二是如何将弱分类器组合成一个强分类器。关于第一个问题,Adaboost的做法是,提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值。这样,那些没有得到正确分类的数据,由于其权值加大而受到后一轮的弱分类器的更大关注;对于第二个问题,Adaboost采取了加权多数表决的方法,具体的做法是加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用,见效分类误差率大的弱分类器的权值,使其在表决中起较小的作用。
Adaboost算法
假设给定一个二分类的训练数据集:
T={(x1,y1),(x2,y2),...,(xN,yN)}
在数据集中,每个样本点由实例与标记组成,实例xi∈X⊆R,标记yi∈Y⊆{−1,1},其中X、Y分别表示实例空间与标记组合。
下面让我们来看一下算法的流程(流程中会有很多疑惑,下文中会一一解释)
**输入:**训练数据集T={(x1,y1),(x2,y2),...,(xN,yN)},其中xi∈X⊆R,yi∈Y⊆{−1,1};弱学习算法。
**输出:**最终分类器G(X)。
(1)初始化训练数据的权值分布:
D1=(w11,...,w1i,...,w1N),w1i=N1,i=1,2,...,N
(2)对m=1,2,...,M
- (a)使用具有权值分布Dm的训练数据集学习,得到基分类器:
Gm(x):X→{−1,1}
- (b)计算Gm(x)在训练数据集上的分类误差率(第m次迭代的期望损失):
em=P(Gm(xi)=yi)=∑i=1NwmiI(Gm(xi)=yi)
注:其中I(⋅)为指示函数,函数中的内容为真时,函数值为1;为假时,函数值为0。
- ©计算Gm(x)的系数(它代表Gm(xi)在最终的强分类器G(x)中的比重):
αm=21lnem1−em
注:为什么系数是这种形式,我们下文中会进行说明。
Dm+1=(wm+1,1,...,wm+1,i,...,wm+1,N)
wm+1,i=zmwmi∗{exp(−αm),Gm(xi)=yiexp(αm),Gm(xi)=yi
等价于下式:
wm+1,i=Zmwmiexp(−αmyiGm(xi)),i=1,2,...,N
这里面的值是一个规范化因子,为了保证所有元素的新的权重之和为1的归一化项。
Zm=∑i=1Nwmiexp(−αmyiGm(xi))
它也使得Dm+1成为一个概率分布。
(3)构建基本分类器的线性组合:
f(x)=∑m=1MαmGm(x)
得到最终分类器
G(x)=sign(f(x))=sign(∑m=1MαmGm(x))
我们用一张图来展示一下最终分类器的形式:

数学原理
上面我们了解了adaboost算法的工作流程,本节再让我们来解释一下上文中的一些数学原理。
系数αm的设定
我们为什么要把系数设定为αm=21lnem1−em的形式呢?
简单的说,我们主要是为了让一个关于Gm(xi)的损失函数最小化,该损失函数的定义如下:
L(Gm)=∑i=1Nwm,iexp(−yiGm(xi))
其中Gm(x)为第m次迭代后得到的强分类器
Gm(x)=∑i=1mαiGi(x)=∑i=1m−1αiGi(x)+αmGm(x)
对于上式,我们知道这是一个迭代的过程,所以可以认为m项以前的数值我们都已经确定了,因此我们只需要考虑αmGm(x),所以损失函数可简化为:
L(Gm)=∑i=1Nwm,iexp(−αmyiGm(xi))
=∑yi=Gm(xi)wm,ie−αm+∑yi=Gm(xi)wm,ieαm
=e−αm∑yi=Gm(xi)wm,i+eαm∑yi=Gm(xi)wm,i
再根据我们上面迭代的式子可以得到(em是我们第m次迭代的期望损失):
L(Gm)=e−αm(1−em)+eαmem
我们再把L(Gm)对αm进行求导并令其等于0得到:
αm=21lnem1−em
这就是我们为什么对系数进行了这样一个设定的原因所在。
损失函数的设定
我们了解了系数的设定,但是系数中用到了一个损失函数,那么对于这个损失函数我们为什么这样定义呢?
若损失函数达到最小时,G(x)可以达到最佳分类效果,我们就可以解释损失函数为什么要这样去定义了。
我们先将损失函数重写为分布的形式:
L(G)=Ex∼D[e−yG(x)]
这里的D就是我们权重的集合,我们写成这种分布的形式的时候,道理都是一样的,上式的意思是x服从D的分布时,e−yG(x)的期望。则我们求导有:
δGδL(G)=−P(y=1∣x)e−G(x)+P(y=−1∣x)eG(x)
对于上式:
当y=1时δGδL(G)=−e−G(x)
当y=-1时δGδL(G)=eG(x)
结合我们x的分布,就可以写出上述的求导式,式子中的P(y=1∣x)就代表y=1时,所有x的权重之和,也就是分布概率之和,P(y=−1∣x)同理。
令求导式为0 我们可以得到:
G(x)=21lnP(y=−1∣x)P(y=1∣x)
而sign{G(x)}={1,ifP(y=1∣x)>P(y=−1∣x)−1,ifP(y=1∣x)<P(y=−1∣x)
所以当L(G)达到了关于G(x)的极小时,sign{G(x)}是最小错误率贝叶斯情况下的分类器。这就说明了这样选择损失函数的原因。
Adaboost例子
这里拿李航博士《统计学习方法》中的例子来说明一下:
我们有下表所示的训练数据,假设弱分类器由x<v或x>v产生,其阈值v使该分类器在训练数据集上分类误差率最低,我们尝试使用Adaboost来学习一个强分类器。
| 序号 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
| x |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
| y |
1 |
1 |
1 |
-1 |
-1 |
-1 |
1 |
1 |
1 |
-1 |
初始化数据权值分布:
D1=(w11,w12,...,w110)
w1i=0.1,i=1,2,...,10
(a)在权值分布为D1的训练数据上,阈值v取2.5时分类误差率最低,此时的基本分类器为:
G1(x)={1,x<2.5−1,x>2.5
(b)G1(x)在训练数据集上的误差率e1=P(G1(xi)=yi)=0.3
©计算系数:α1=0.4236
(d)更新训练数据的权值分布:
D2=(w21,w22,...,w210)
w2i=Z1w1iexp(−α1yiG1(xi)),i=1,2,...,10
D2=(0.07143,0.07143,0.07143,0.07143,0.07143,0.07143,0.16667,0.16667,0.16667,0.07143)
f1(x)=0.4236G1(x)
分类器sign[f1(x)]在训练数据集上有3个误分类点。
(a)在权值分布为D2的训练数据上,阈值v取8.5时分类误差率最低,此时的基本分类器为:
G2(x)={1,x<8.5−1,x>8.5
(b)G2(x)在训练数据集上的误差率e2=P(G2(xi)=yi)=0.2143
©计算系数:α2=0.6496
(d)更新训练数据的权值分布:
D3=(0.0455,0.0455,0.0455,0.1667,0.1667,0.1667,0.1060,0.1060,0.1060,0.0455)
f2(x)=0.4236G1(x)+0.6496G2(x)
分类器sign[f2(x)]在训练数据集上有3个误分类点。
(a)在权值分布为D3的训练数据上,阈值v取5.5时分类误差率最低,此时的基本分类器为:
G3(x)={1,x<5.5−1,x>5.5
(b)G3(x)在训练数据集上的误差率e3=P(G3(xi)=yi)=0.1820
©计算系数:α3=0.7514
(d)更新训练数据的权值分布:
D4=(0.125,0.125,0.125,0.102,0.102,0.102,0.065,0.065,0.065,0.0125)
f3(x)=0.4236G1(x)+0.6496G2(x)+0.7514G3(x)
分类器sign[f3(x)]在训练数据集上有0个误分类点。
于是我们得到最终的分类器为:
G(x)=sign[f3(x)]=sign[0.4236G1(x)+0.6496G2(x)+0.7514G3(x)]
