AdaBoost算法可以从一个训练集中产生多个分类器,并将它们组合起来,提高分类性能,是一种常用的学习方法。本文尝试对AdaBoost算法的过程进行解释,希望能对大家理解AdaBoost算法有所帮助。
注:1.文中出现的一些数学结论,只提供了简单、便于理解的证明,并非严谨、详细的证明。
2.文中对AdaBoost算法的解释方式,只是个人观念上认为这样解释比较便于理解,当然AdaBoost算法还有其他各种解释方式。
3.文中所述仅是个人理解,难免有些错误和不足的地方,还请大家见谅。
一、算法简介
在做一个重要的决定时,我们通常会听取多个人的意见,并将这些意见进行权衡之后得出最终的判断,提升方法就是基于同样的一种思想。
一般来说,从样本中获得一个弱分类器很简单,但是弱分类器的分类效果一般不好,正确率仅比随机猜测好一些。如表1,可以很简单的得到一个分类器:,用该分类器分类样本结果为:1,1,-1,-1,-1,-1,-1,错误率为1/6。
样本一 | 样本二 | 样本三 | 样本四 | 样本五 | 样本六 | |
---|---|---|---|---|---|---|
特征值X | 1 | 2 | 3 | 4 | 5 | 6 |
分类Y | 1 | 1 | -1 | -1 | 1 | -1 |
提升算法希望将多个弱分类器组合成为一个强分类器,从而提升分类效果。在各种提升算法中,最具代表性的就是AdaBoost算法。
二、AdaBoost算法基本模型
假设为k个弱分类器,现在给每个弱分类器一个系数,组成一个线性组合:
这里的可以理解为每个弱分类器在最终投票时所占的权重,如果将每个弱分类器的分类结果映射为1和-1,则若f(x)>0,代表各个弱分类器经过加权后,在最终投票过程中,多数投1,少数投-1,所以最终得到的分类器可以用单位阶跃函数表示:
那么,为了得到最终分类器H(x),现在需要确定的参数为:弱分类器个数k、弱分类器h(x)、系数。
三、损失函数
常见的损失函数为0/1损失函数,即若样本预测正确,则损失为0,否则,损失为1。损失函数的作用就是:以训练样本中的整体损失值达到最小为目标,来确定分类器的各项参数。
adaBoost算法的损失函数为指数损失函数:
其中,y为样本的实际分类(1或-1),f(x)为第二节中提到的线性组合(注意,并不是最终分类器H(x))。
使得训练样本整体损失值达到最小的优化目标为:
其中,代表损失函数在分布上的数学期望,这里先解释一下分布直观的含义:对于某一样本,表达式代表其在整体样本中所占的比例,若该比例越大,则其分类错误时,产生的损失就越大,换句话说,就是该样本应该受到分类器更多的“关注”。
如第二节所说,为了得到最终分类器H(x),需要确定的参数为:弱分类器个数k、弱分类器h(x)、系数,现在有了损失函数,它提供了确定参数所依靠的准则:参数应当使得优化目标最小。接下来,我们用这个准则来一步一步计算出各个分类器所需条件及其相关系数。
四、确定第一个弱分类器h1(x)及其系数
第一个弱分类器,可以从样本中直接生成,例如第一节给出的表1。
接下来确定其系数,方便起见,令
则,此时优化目标,对于任一样本,有
注意,这里的弱分类器以及训练集合中的分类标识都应用1和-1表示。则由上式可得,
其中,即弱分类器的分类错误率,因为已经确定,所以是一确定值,结合上节中分布D的概念,有:
得到后,求最小值,先求对的导数:
令导数等于零,可解得:
至此,已经解出,但是实际上对分类结果没有任何改善,因为现在只有一个弱分类器参与了最终的“投票”,所以现在需要添加新的弱分类器并给其相应的系数,每多增加一项,都会计算一次最终分类器的错误率,若错误率达到指定的标准,则算法停止,此时总共添加的弱分类器个数即为k。
五、确定第k个分类器及其系数
现在有了第一个分类器及其参数,用数学归纳法的思想,假设已经求出,来求及系数。此时对于,优化目标为:
根据假设,已知,所以在分布上的数学期望为一个常数,则根据数学期望的定义,有以下关系:
其中n为样本个数,易知,则上式可写为:。
其中,令,结合上式可以看出为原始分布经过某种变形之后的另一种分布,所以有:
因为为常数,所以最小化等同于最小化,所以有:
可以看到,当>0时,弱分类器在分布上的分类正确率越高,则的值越小;当<0时,分类的错误率越高,目标值越小,这与分类器的目标相矛盾。所以,当>0时,有:
其中代表在分布上弱分类器分类正确的概率。上式代表的意义就是,理想的弱分类器为在分布上分类正确率最高的分类器,具体的正确率则受限于所选择的学习算法。这里的各个弱分类器,可以用同一算法在分布上生成,也可以用不同算法在分布上生成。
接下来求,类似上一节中求的方法(事实上,可以看到此时的优化目标和上一节中求时的优化目标非常相近,只是在训练集的分布上有所不同),可以得到:
其中,为弱分类器在分布上分类的错误率,可以看到求解的公式是上述公式k=1时的情况。
最后,求分布,由之前的讨论可知,其中为一常数,记为,则有:
根据,同理可得
将代入上式,可得
其中为一个常数,它保证了为一个分布,即,由此可得:
所以,
这里的。
对于第一个弱分类器,为了算法统一,令其训练样本的分布为,它和原始分布相同,有,根据,可以直接求出,不难验证符合上述公式。
六、算法流程总结
综上所述,已经求出算法各个环节所需要的参数,现在来总结一下具体的流程,假设现在有n个训练样本:,其中,为了得到最终分类器H(x),需要以下步骤:
1.初始化样本分布为,即。
2.在样本分布上,通过最小化训练误差,得到弱分类器。
3.计算在上的误差,若误差>0.5,则算法结束,否则,根据公式,求得的系数。
4.计算最终分类器,在原始分布D上的错误率,若=0或小于某一指定值,则算法结束,否则进入下一步。
5.根据公式,以及前3步中分别得到的、、,求出。
6.对于分布重复上述步骤,直到满足算法停止条件或指定的循环次数。
七、一个例子
本节给出adaBoost算法的一个例子,数据为第一节中的表1,数据简单,仅有一个特征值,各个弱分类器训练方式均为简单的二分法。
样本一 | 样本二 | 样本三 | 样本四 | 样本五 | 样本六 | |
---|---|---|---|---|---|---|
特征值X | 1 | 2 | 3 | 4 | 5 | 6 |
分类Y | 1 | 1 | -1 | -1 | 1 | -1 |
第一次循环:
1.初始化分布D1=(1/6,1/6,1/6,1/6,1/6,1/6)。注:本例之后的分数均以小数形式表示。
2.在样本集合中,当分割点为2时,误差率最低,得到分类器。
3.对于,样本5分类错误,得到的误差率=0*1/6+0*1/6+0*1/6+0*1/6+1*1/6+0*1/6=0.1667。
4.计算,得到=0.8047。
5.,分类错误率为0.1667。
6.计算D2=(0.1,0.1,0.1,0.1,0.5,0.1)
第二次循环:
1.根据D2,在样本集合中,当分割点为5时,误差率最低,得到分类器。
2.对于,样本3、4分类错误,得到的误差率=0*0.1+0*0.1+1*0.1+1*0.1+0*0.5+0*0.1=0.2。
3.计算。
4.,分类错误率为0.1667。
5.计算D3=(0.0625,0.0625,0.25,0.25,0.3125,0.0625)
第三次循环:
1.根据D3,在样本集合中,当分割点为4时,误差率最低,得到分类器。
2.样本1、2、6分类错误,得到的误差率=1*0.0625+1*0.0625+0*0.25+0*0.25+0*0.3125+1*0.0625=0.1875。
3.计算。
4.,分类错误率为0。
5.算法结束,得到最终分类器。
以上就是我个人对AdaBoost算法的理解,希望能对大家理解AdaBoost算法有所帮助。