在往期文章机器学习进阶之路:集成学习带你走向巅峰和揭秘Bagging与随机森林:构建更强大预测模型的秘密中,我们总结了集成学习的原理,并展开介绍了集成学习中Bagging和随机森林这一分枝算法,在本篇博客中,我们继续介绍另一个分枝——Boosting,并对Boosting系列中的经典算法Adaboost展开分析。
一 Boosting
Boosting是一种串行的工作机制,即基学习器的训练存在依赖关系,必须一步一步序列化进行。其基本思想是:增加前一个基学习器在训练训练过程中预测错误样本的权重,使得后续基学习器更加关注这些打标错误的训练样本,尽可能纠正这些错误,一直向下串行直至产生需要的T个基学习器,Boosting最终对这T个学习器进行加权结合,产生学习器委员会。
Boosting系列算法又称为提升学习算法,算法目标就是将弱分类器提升为强分类器。这里的弱分类器和强分类器是根据准确率对学习器进行的一种划分,弱分类器准确率较低(高于50%即可),强分类器则需要有一个有令人满意准确率。很明显,强分类器是机器学习的最终目标,但在很多场景下,直接训练获取一个强分类器有时候是非常困难的,相比之下,但弱分类器通常通过简单训练即可获得,通过反复学习获得大量弱分类器进行组合也可以获得一个性能优异的强分类器。如果只是这样的话,那么Boosting与Bagging系列的集成算法也就没什么太大区别,在上一篇博客中,我们说过集成学习的所有基本分类器满足符合以下两个条件:
(1)基本分类器之间应该有差异性。如果基本分类器将没有差异,那么集成起来的结果是没有变化的。
(2)每个基本分类器的精度必须大于0.5。
用一句话说就是所有的基本分类器必须“好而不同”,为了达到这一目的,Boosting使用了加法模型和前向分步算法。
加法模型是指强学习器是由一个个弱分类器累加组合而来:
H M ( x ) = ∑ m = 1 M α m h m ( x ) {H_M}(x) = \sum\limits_{m = 1}^M {{\alpha _m}{h_m}(x)} HM(x)=m=1∑Mαmhm(x)
其中, h m ( x ) {{h_m}(x)} hm(x)是指第 m m m个弱分类器, α m {\alpha _m} αm是 h m ( x ) {{h_m}(x)} hm(x)在 M M M个分类器中的权重。
前向分步算法是指在算法迭代过程中,每一个分类器是又上一次迭代产生的分类器基础上进行训练获得。数学表示如下:
H m ( x ) = H m − 1 ( x ) + α m h m ( x ) {H_m}(x) = {H_{m - 1}}(x) + {\alpha _m}{h_m}(x) Hm(x)=Hm−1(x)+αmhm(x)
Boosting在集成思想上结合加法模型和前向分步算法的一种集成学习方法:首先从初始训练集中训练一个初始基本分类器,在根据初始分类器的表现对训练样本分布进行调整,使得训练下一个分类器时对上一个学习器误分类样本更加关注,通过此种方式不同循环训练一系列分类器,直到分类器达到指定数量亦或者累加后的强分类器达到指定精度。
前向分步算法决定了在Boosting系列算法中,所有分类器间只能是一种串行的结构,每一个分类器只能在上一个的学习器基础上进行学习,这是与Bagging系列算法分类器间的并行结构最大的不同。
建立在这一思想的基础上,很多Boosting系列算法相继提出,AdaBoost算法就是其中之一。本文接下来内容对AdaBoost算法展开介绍。
二 Adaboost
2.1 算法原理
AdaBoost,是英文Adaptive Boosting的缩写,可直接翻译为自适应提升算法,由Yoav Freund和Robert Schapire在1995年提出。
AdaBoost使用的是指数损失函数,因此AdaBoost的权值与样本分布的更新都是围绕着最小化指数损失函数进行的。看到这里回想一下之前的机器学习算法,不难发现机器学习的大部分带参模型只是改变了最优化目标中的损失函数:如果是Square loss,那就是最小二乘了;如果是Hinge Loss,那就是著名的SVM了;如果是log-Loss,那就是Logistic Regression了。
定义基学习器的集成为加权结合,则有:
AdaBoost算法的指数损失函数定义为:
AdaBoost算法在每一次迭代中根据训练集之中每个样本的分类正确与否,以及上次的总体分类的准确率,来为每个样本设置一个权值,通过增加在上一个弱分类器中被误分类的样本的权值使得该样本在下一次迭代训练弱分类器时得到更多的重视,通过这种方式,每一次迭代都前面弱分类器分类结果基础上训练新的分类器,最终将弱分类器融合起来,作为强分类器进行决策使用,如下图所示。细致一点来说,AdaBoost就可以分为以下三个步骤:
-
初始化训练数据的权值分布。如果有N个样本,则每一个训练样本最开始时都被赋予相同的权值:1/N。
-
训练弱分类器。具体训练过程中,如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它的权值就被降低;相反,如果某个样本点没有被准确地分类,那么它的权值就得到提高。然后,权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。
-
将各个训练得到的弱分类器组合成强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。
整个AdaBoost的算法流程如下所示:
算法在每次迭代都会更新样本的分布权重 D m D_m Dm,在下一次迭代前会根据 D m D_m Dm进行一次训练样本的重采样。
从偏差-方差分解来看:Boosting算法主要关注于降低偏差,每轮的迭代都关注于训练过程中预测错误的样本,将弱学习提升为强学习器。
从AdaBoost的算法流程来看,标准的AdaBoost只适用于二分类问题。
Boosting算法要求基学习器能对特定分布的数据进行学习,即每次都更新样本分布权重,这里书上提到了两种方法:“重赋权法”(re-weighting)和“重采样法”(re-sampling),书上的解释有些晦涩,这里进行展开一下:
重赋权法 : 对每个样本附加一个权重,这时涉及到样本属性与标签的计算,都需要乘上一个权值。
重采样法 : 对于一些无法接受带权样本的及学习算法,适合用“重采样法”进行处理。方法大致过程是,根据各个样本的权重,对训练数据进行重采样,初始时样本权重一样,每个样本被采样到的概率一致,每次从N个原始的训练样本中按照权重有放回采样N个样本作为训练集,然后计算训练集错误率,然后调整权重,重复采样,集成多个基学习器。
即,如下图流程所示:
可以看出:AdaBoost的核心步骤就是计算基学习器权重和样本权重分布。
三 adaboost实现过程简单举例
下面我们举一个简单的例子来看看adaboost的实现过程:
图中,“+”和“-”分别表示两种类别,在这个过程中,我们使用水平或者垂直的直线作为分类器,来进行分类。
Step 1:
根据分类的正确率,得到一个新的样本分布 D 2 D_2 D2,一个子分类器 h 1 h_1 h1
其中划圈的样本表示被分错的。在右边的途中,比较大的“+”表示对该样本做了加权。
Step 2:
根据分类的正确率,得到一个新的样本分布 D 3 D_3 D3,一个子分类器 h 2 h_2 h2
Step 3:
得到一个子分类器 h 3 h_3 h3
整合所有子分类器:
因此可以得到整合的结果,从结果中看,及时简单的分类器,组合起来也能获得很好的分类效果,在例子中所有的。
四 AdaBoost多分类问题
详细介绍,请看李航的《统计学习方法》 第8章 提升方法
五 总结
最后对AdaBoost算法进行一下总结。AdaBoost主要有如下特性:
-
简单易用,需要进行调节的参数很少;
-
原始的AdaBoost算法只适用于二分类任务;
-
对于噪声数据较为敏感,这是因为AdaBoost算法倾向于对噪声数据进行拟合,容易造成过拟合;
-
弱学习器可以使用任何算法进行构建,例如可使用逻辑回归、决策树、线性回归等;
-
可以用来做特征选择,例如进行人群信用风险评估时,特征属性宝库年龄、居住地址、收入、有无不动产等等,用AdaBoost算法金信诺迭代时,每一次迭代需要用一个弱分类器划分数据样本,假设用的是决策树算法,我们只能选择一个特征属性进行划分数据样本,在建模完成后,看看弱分类器都是使用那些特征属性进行决策就可以知道哪些特征属性重要,方便做出特征选择。
AdaBoost 算法还有另一个 解释, 即可以认为 AdaBoost 算法是模型为加法模型、 损失函数为指数函数、 学习算法为前向分步算法时的二类分类学习方法。