AdaBoost (Adaptive Boosting)

Table of Contents

1. 提升方法简介

提升(Boosting)方法是一种常用的统计学习方法,应用广泛且有效。在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的性能。

提升方法是多种学习方法的集成,属于“集成学习(Ensemble learning)”。

参考:
本文主要摘自:《统计学习方法,李航著》第 8 章 提升方法
The Elements of Statistical Learning(2nd), Chapter 10 Boosting and Additive Trees

1.1. 提升方法的基本思路

提升算法基于这样一种思路:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好。实际上,就是“三个臭皮匠顶个诸葛亮”的道理。

历史上,Kearns 和 Valiant 首先提出了“强可学习(strongly learnable)”和“弱可学习(weakly learnable)”的概念。指出:在概率近似正确(probably approximately correct,PAC)学习框架中,一个概念(一个类),如果存在一个多项式的学习算法能够学习它,并且正确率很高,那么就称这个概念是强可学习的;一个概念,如果存在一个多项式的学习算法能够学习它,学习的正确率仅比随机猜测略好,那么就称这个概念是弱可学习的。非常有趣的是 Schapire 后来证明 强可学习与弱可学习是等价的 ,也就是说,在 PAC 学习的框架下,一个概念是强可学习的充分必要条件是这个概念是弱可学习的。
这样一来,问题便成为,在学习中,如果已经发现了“弱学习算法”,那么能否将它提升(boost)为“强学习算法”。大家知道, 发现弱学习算法通常要比发现强学习算法容易得多。那么如何具体实施提升,便成为开发提升方法时所要解决的问题。 关于提升方法的研究很多,有很多算法被提出。最具代表性的是 AdaBoost 算法(AdaBoost algorithm)。

2. AdaBoost

对于分类问题而言,提升方法通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的性能。这样,有两个问题需要回答:一是在每一轮如何改变训练数据的权值分布;二是如何将弱分类器组合成为一个强分类器。

关于第 1 个问题,AdaBoost 算法的做法是,提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值。这样一来,那些没有得到正确分类的数据,由于其权值的加大而受到后轮的弱分类器的更大关注。于是,分类问题被一系列的弱分类器“分而治之”。至于第 2 个问题,即弱分类器的组合,AdaBoost 采取加权多数表决的方法。具体地,加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用,减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用。

AdaBoost 是如何实践上面的思路,请看下文分解。

2.1. AdaBoost 算法

AdaBoost 算法描述如下:
输入:训练数据集 T=(x1,y1),(x2,y2),(xN,yN) ,其中 xiXRn,yiY={1,+1},i=1,2,,N ,其中 yixi 的类标记;弱学习算法。
输出:最终分类器 G(x)
第 1 步,初始化训练数据的权值分布:
D1={w1,1,w1,2,,w1,i,,w1,N},w1,i=1N,i=1,2,,N
第 2 步,对 m=1,2,,MM 表示迭代的次数,即基本分类器个数)依次执行下面过程:
(a) 使用具有权值分布 Dm 的训练数据集学习,得到基本分类器:
Gm:X{1,+1}
(b) 计算 Gm(x) 在训练数据集上的分类误差率:
em=P(Gm(xi)yi)=i=1Nwm,iI(Gm(xi)yi)
注:上式中 I(Gm(xi)yi) 是指示函数,当参数为真(即不等号成立)时其值为 1,否则为 0。
(c) 计算基本分类器 Gm(x) 的系数:
αm=12ln1emem
(d) 更新训练数据集的权值分布:
Dm+1={wm+1,1,wm+1,2,,wm+1,i,,wm+1,N}
其中:
wm+1,i={wm,iZmeαm,Gm(xi)=yi注:即当该样本被正确分类时wm,iZmeαm,Gm(xi)yi注:即当该样本被错误分类时
利用 yi{1,+1} ,上式还可以写为:
wm+1,i=wm,iZmeαmyiGm(xi),i=1,2,,N
这里, Zm 是规范化因子,为:
Zm=i=1Nww,ieαmyiGm(xi)
它使 Dm+1 成为一个概率分布。
第 3 步,构建基本分类器的线性组合:
f(x)=m=1MαmGm(x)
得到最终分类器:
G(x)=sign(f(x))=sign(m=1MαmGm(x))
算法完。

说明 1:上面算法中, wm+1,i={wm,iZmeαm,Gm(xi)=yiwm,iZmeαm,Gm(xi)yi 使得被基本分类器 Gm(x) 误分类样本的权值得以扩大,而被正确分类样本的权值却得以缩小。两相比较, 误分类样本的权值被放大 e2αm=em1em 。因此,误分类样本在下一轮学习中起更大的作用。不改变所给的样本数据,而不断改变训练数据权值的分布,使得训练数据在基本分类器的学习中起不同的作用,这是 AdaBoost 的一个特点。
说明 2:线性组合 f(x) 实现 M 个基本分类器的 加权表决 。系数 αm 表示了基本分类器 Gm(x) 的重要性,这里,所有 αm 之和并不为 1。 f(x) 的符号决定实例 x 的类别, f(x) 的绝对值表示分类的确信度。利用基本分类器的线性组合构建最终分类器是 AdaBoost 的另一特点。

AdaBoost 算法的实践过程可以形象地用图 1 (图片摘自“The Elements of Statistical Learning(2nd), Chapter 10 Boosting and Additive Trees”)展示。

adaboost_schematic.jpg

Figure 1: AdaBoost 算法图示

2.2. AdaBoost 应用实例

给定如表 1 所示训练数据。假设弱分类器由 x<vx>v 产生,其阈值 v 使该分类器在训练数据集上分类误差率最低。试用 AdaBoost 算法学习一个强分类器。

Table 1: 训练数据
序号 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=(w1,1,w1,2,,w1,10)
其中, w1,i=0.1,i=1,2,,10
迭代过程 1,对 m=1 ,有
(a) 在权值分布为 D1 的训练数据上,容易求得阈值 v 取 2.5 时的分类误差率最低(这时误差点为 x=6,7,8 ),故第 1 个基本分类器为:
G1(x)={1,x<2.51,x>2.5
(b) G1(x) 在训练数据集上的误差率: e1=P(G1(xi)yi)=0.3
(c) 计算 G1(x) 的系数:
α1=12ln1e1e1=0.4236
(d) 更新训练数据的权值分布:
w2,i=w1,iZ1eα1yiG1(x),i=1,2,,10D2=(w2,1,w2,2,,w2,10)=(0.0715,0.0715,0.0715,0.0715,0.0715,0.0715,0.1666,0.1666,0.1666,0.0715)f1(x)=0.4236G1(x)
分类器 sign[f1(x)] 在训练数据集上有 3 个误分类点。
迭代过程 2,对 m=2 ,有
(a) 在权值分布为 D2 的训练数据上,容易求得阈值 v 取 8.5 时的分类误差率最低,故第 2 个基本分类器为:
G2(x)={1,x<8.51,x>8.5
(b) G2(x) 在训练数据集上的误差率: e2=P(G2(xi)yi)=0.2143
(c) 计算 G2(x) 的系数:
α2=12ln1e2e2=0.6496
(d) 更新训练数据的权值分布:
D3=(0.0455,0.0455,0.0455,0.1667,0.1667,0.01667,0.1060,0.1060,0.1060,0.0455)f2(x)=0.4236G1(x)+0.6496G2(x)
分类器 sign[f2(x)] 在训练数据集上有 3 个误分类点。
迭代过程 3,对 m=3 ,有
(a) 在权值分布为 D3 的训练数据上,容易求得阈值 v 取 5.5 时的分类误差率最低,故第 2 个基本分类器为:
G3(x)={1,x<5.51,x>5.5
(b) G3(x) 在训练数据集上的误差率: e3=0.1820
(c) 计算 G3(x) 的系数:
α3=0.7514
(d) 更新训练数据的权值分布:
D4=(0.125,0.125,0.125,0.102,0.102,0.102,0.065,0.065,0.065,0.125)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)]

2.3. AdaBoost 算法缺点

AdaBoost 算法缺点:对异常点非常敏感。 它不断增加误分类样本的权重(指数上升),但如果数据样本是异常点(outlier),则可能极大的干扰后面基本分类器的学习。

3. 加法模型及 AdaBoost 算法解释

AdaBoost 算法可以看作是“模型为加法模型、损失函数为指数函数、学习算法为前向分布算法”时的二类分类学习方法。

3.1. 加法模型和前向分布算法

考虑加法模型(additive model):
f(x)=m=1Mβmb(x;γm)
其中, b(x;γm) 为基函数, γm 为基函数的参数, βm 为基函数的系数。显然, AdaBoost 算法最终分类器是一个加法模型。

在给定训练数据及损失函数 L(y,f(x)) 的条件下,学习加法模型 f(x) 就是损失函数极小化问题:
minβm,γmi=1NL(yi,m=1Mβmb(xi;γm))
通常这是一个复杂的优化问题。前向分布算法(forward stagewise algorithm)求解这一优化问题的想法是:因为学习的是加法模型,那如果能够从前向后,每一步只学习一个基函数及其系数,然后逐步逼近上面的优化目标式,那么就可以简化优化的复杂度。具体的,每步只需优化如下损失函数:
minβ,γi=1NL(yi,βb(xi;γ))
这样, 前向分布算法将同时求解从 m=1M 的所有参数 βm,γm 的优化问题简化为逐次求解各个 βm,γm 的优化问题。

3.1.1. 前向分布算法

给定训练数据集 T=(x1,y1),(x2,y2),(xN,yN) ,其中 xiXRn,yiY={1,+1},i=1,2,,N 。损失函数 L(y,f(x)) 和基函数的集合 {b(x;γ)} 。学习加法模型 f(x) 的前向分步算法描述如下。

前向分布算法:
输入:训练数据集 T=(x1,y1),(x2,y2),(xN,yN) ;损失函数 L(y,f(x)) 和基函数的集合 {b(x;γ)}
输出:加法模型 f(x)
第 1 步,初始化 f0(x)=0
第 2 步,迭代执行下面步骤,对 m=1,2,,M
(a) 极小化损失函数:
(βm,γm)=argminβ,γi=1NL(yi,fm1(xi)+βb(xi;γ))
得到参数 βm,γm
(b) 利用上步求得的 βm,γm 更新下面式子:
fm(x)=fm1(x)+βmb(x;γm)
第 3 步,得到加法模型:
f(x)=fM(x)=m=1Mβmb(x;γ)

3.2. AdaBoost 算法的推导

AdaBoost 算法可以看作是损失函数为指数损失时的前向分布算法。关于它的推导可参考:
(1) 《统计学习方法,李航著》 8.3.2 前向分步算法与 AdaBoost
(2) The Elements of Statistical Learning(2nd), 10.4 Exponential Loss and AdaBoost

3.3. 不同损失函数及相应的 Boost 方法

按照损失函数的不同,表 2 给出了 4 种不同的 Boost 方法。

Table 2: 几种不同 Boost 方法(假设 yi{0,+1},y~i{1,+1}
Name Loss Algorithm
平方损失 12(yif(xi))2 L2Boosting (Least Squares Boosting)
绝对损失 yif(xi) Gradient boosting
指数损失 e(y~if(xi)) AdaBoost
对数损失 log(1+ey~if(xi)) LogitBoost

参考:Machine Learning - A Probabilistic Perspective, 16.4 Boosting

Author: cig01

Created: <2016-01-02 Sat>

Last updated: <2017-11-22 Wed>

Creator: Emacs 27.1 (Org mode 9.4)