注:本篇博文是根据其他优秀博文编写的,我只是对其改变了知识的排序,另外代码是《机器学习实战》中的。转载请标明出处及参考资料。
Adaboost是英文"AdaptiveBoosting"(自适应增强)的缩写,它的自适应在于:前一个基本分类器被错误分类的样本的权值会增大,而正确分类的样本的权值会减小,并再次用来训练下一个基本分类器。同时,在每一轮迭代中,加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数才确定最终的强分类器。通俗地讲就是,将若干带有权值的弱分类器累加得到强分类器的过程。
Adaboost算法可以简述为三个步骤:(1)首先,是初始化训练数据的权值分布D1。假设有N个训练样本数据,则每一个训练样本最开始时,都被赋予相同的权值:w1=1/N。(2)然后,训练弱分类器hi。具体训练过程中是:如果某个训练样本点,被弱分类器hi准确地分类,那么在构造下一个训练集中,它对应的权值要减小;相反,如果某个训练样本点被错误分类,那么它的权值就应该增大。权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。(3)最后,将各个训练得到的弱分类器组合成一个强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换而言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。
给定一个训练数据集T={(x1,y1),(x2,y2)…(xN,yN)},其中实例x属于Rn,yi属于标记集合{-1,+1},Adaboost的目的就是从训练数据中学习一系列弱分类器或基本分类器,然后将这些弱分类器组合成一个强分类器。
Adaboost算法流程如下:
步骤1.首先,初始化训练数据的权值分布。每一个训练样本最开始时都被赋予相同的权值:1/N。
步骤2.进行多轮迭代,用m=1,2,...,M表示迭代的第多少轮。
a.使用具有权值分布Dm的训练数据集学习,得到基本分类器(选取让误差率最低的阈值来设计基本分类器):
b.计算Gm(x)在训练数据集上的分类误差率:
由上述式子可知,Gm(x)在训练数据集上的误差率em就是被Gm(x)误分类样本的权值之和。c.计算Gm(x)的系数,αm表示Gm(x)在最终分类器中的重要程度(目的:得到基本分类器在最终分类器中所占的权重):
由上述式子可知,em<=1/2时,αm>=0,且αm随着em的减小而增大,意味着分类误差率越小的基本分类器在最终分类器中的作用越大。d.更新训练数据集的权值分布(目的:得到样本的新的权值分布),用于下一轮迭代
步骤3.组合各个弱分类器
从而得到最终分类器,如下:
其中,sign()是符号函数,取值为{-1,0,1}。
如下图所示的便是一个加法模型
其中,称为b(x;γm)基函数,γm称为基函数的参数,βm称为基函数的系数。在给定训练数据及损失函数L(y;f(x))的条件下,学习加法模型f(x)成为经验风险极小化问题,即损失函数极小化问题:
随后,该问题可以作如此简化:从前向后,每一步只学习一个基函数及其系数,逐步逼近上式,即:每步只优化如下损失函数:
这个优化方法便就是所谓的前向分步算法。下面,咱们来具体看下前向分步算法的算法流程:
输入:训练数据集损失函数:基函数集:输出:加法模型算法步骤:
得到参数和。
在上文第2.1节最后,我们说Adaboost还有另外一种理解,即可以认为其模型是加法模型、损失函数为指数函数、学习算法为前向分步算法的二类分类学习方法。其实,Adaboost算法就是前向分步算法的一个特例,Adaboost中,各个基本分类器就相当于加法模型中的基函数,且其损失函数为指数函数。换句话说,当前向分步算法中的基函数为Adaboost中的基本分类器时,加法模型等价于Adaboost的最终分类器
你甚至可以说,这个最终分类器其实就是一个加法模型。只是这个加法模型由基本分类器及其系数组成,m=1,2,...,M。前向分步算法逐一学习基函数的过程,与Adaboost算法逐一学习各个基本分类器的过程一致。
下面,咱们便来证明:当前向分步算法的损失函数是指数损失函数
时,其学习的具体操作等价于Adaboost算法的学习过程。
假设经过m-1轮迭代,前向分步算法已经得到:
而后在第m轮迭代得到、和。其中,为:
而和未知。所以,现在咱们的目标便是根据前向分步算法训练和,使得最终在训练数据集T上的指数损失最小,即
针对这种需要求解多个参数的情况,可以先固定其它参数,求解其中一两个参数,然后逐一求解剩下的参数。例如我们可以固定和,只针对和做优化。
换言之,在面对和这2m个参数都未知的情况下,可以:
且考虑到上式中的既不依赖也不依赖G,所以是个与最小化无关的固定值,记为,即,则上式可以表示为(后面要多次用到这个式子,简记为):
值得一提的是,虽然与最小化无关,但依赖于,随着每一轮迭代而发生变化。
接下来,便是要证使得上式达到最小的和就是Adaboost算法所求解得到的和。
为求解上式,咱们先求再求。
首先求。对于任意,使上式最小的G(x)由下式得到:
别忘了,。
跟1.3节所述的误差率的计算公式对比下:
可知,上面得到的便是Adaboost算法的基本分类器,因为它是在第m轮加权训练数据时,使分类误差率最小的基本分类器。换言之,这个便是Adaboost算法所要求的,别忘了,在Adaboost算法的每一轮迭代中,都是选取让误差率最低的阈值来设计基本分类器。
然后求。还是回到之前的这个式子上:
这个式子的后半部分可以进一步化简,得:
接着将上面求得的
代入上式中,且对求导,令其求导结果为0,即得到使得一式最小的,即为:
这里的跟上文1.3节中的计算公式完全一致。
此外,毫无疑问,上式中的便是误差率:
即就是被Gm(x)误分类样本的权值之和。
就这样,结合模型,跟,可以推出
从而有:
与上文1.3节介绍的权值更新公式
相比,只相差一个规范化因子,即后者多了一个Zm
所以,整个过程下来,我们可以看到,前向分步算法逐一学习基函数的过程,确实是与Adaboost算法逐一学习各个基本分类器的过程一致,两者完全等价。
Adaboost在学习的过程中不断减少训练误差e,直到各个弱分类器组合成最终分类器,那这个最终分类器的误差界到底是多少呢?事实上,Adaboost最终分类器的训练误差的上界为:
下面,咱们来通过推导来证明下上述式子。
当G(xi)≠yi时,yi*f(xi)<0,因而exp(-yi*f(xi))≥1,因此前半部分得证。
关于后半部分,别忘了:
整个的推导过程如下:
这个结果说明,可以在每一轮选取适当的Gm使得Zm最小,从而使训练误差下降最快。接着,咱们来继续求上述结果的上界。
对于二分类而言,有如下结果:
其中,。
继续证明下这个结论。
由之前Zm的定义式跟本节最开始得到的结论可知:
而这个不等式可先由e^x和1-x的开根号,在点x的泰勒展开式推出。值得一提的是,如果取γ1,γ2…的最小值,记做γ(显然,γ≥γi>0,i=1,2,...m),则对于所有m,有:
这个结论表明,AdaBoost的训练误差是以指数速率下降的。另外,AdaBoost算法不需要事先知道下界γ,AdaBoost具有自适应性,它能适应弱分类器各自的训练误差率。
这里的数据是《机器学习实战》的马疝病数据,包括:训练集的名称'horseColicTraining2.txt',测试集的名称'horseColicTest2.txt'。具体数据如下:
优点:
(1)Adaboost提供一种框架,在框架内可以使用各种方法构建子分类器。可以使用简单的弱分类器,不用对特征进行筛选,也不存在过拟合的现象。
(2)Adaboost算法不需要弱分类器的先验知识,最后得到的强分类器的分类精度依赖于所有弱分类器。无论是应用于人造数据还是真实数据,Adaboost都能显著的提高学习精度。
(3)Adaboost算法不需要预先知道弱分类器的错误率上限,且最后得到的强分类器的分类精度依赖于所有弱分类器的分类精度,可以深挖分类器的能力。Adaboost可以根据弱分类器的反馈,自适应地调整假定的错误率,执行的效率高。
(4)Adaboost对同一个训练样本集训练不同的弱分类器,按照一定的方法把这些弱分类器集合起来,构造一个分类能力很强的强分类器,即“三个臭皮匠赛过一个诸葛亮”。