1. foreword

第一次看书上boosting算法,几个简单的模型组合起来,就可以将非线性划分的数据完美地划分开来,颇为神奇。回想起TSA比赛中使用的GBDT(梯度提升决策树),lightGBM(轻量级梯度提升机),这些名词中闪耀着“梯度”“提升”“决策树”,这说明要理解boosting这一堆东西,得从这几个点入手。李航老师的书的第8章着重讲了Adaboost算法和提升树,西瓜书讲的点稍多。

2. 提升方法思路

boosting方法是一种常用的统计学习方法,在分类问题中,通过改变训练样本的权重,学习多个分类器,并将这些分类器线性组合,能够提高分类性能。

注意,另一种策略方法是bagging。对数据集采样生成若干个不同子集,从每个子集中训练一个基学习器。另一篇另说。总之这两种方法统一为集成学习

本节专看boosting。对于复杂任务,将多个专家的判断进行适当综合,要比其中任何一个专家单独判断好,即三个臭皮匠顶个诸葛亮。

如果一个问题,在概率近似正确学习的框架中,存在一个多项式学习算法可学习它,并且正确率很高,称其是强可学习的;相反,若多项式算法学习的正确率仅比随机猜测好,那么称其是弱可学习的。可证明:强可学习等价于弱可学习。

这说明:如果我们发现了弱学习算法,那么理论上可以找到强学习算法。而boosting就是解决这个问题的。给定一个训练集,求较粗糙的分类规则,比精确分类规则容易,则boosting从弱学习算法出发,反复学习,得到一系列弱分类器/基本分类器,然后构成强分类器。

boosting大多是通过改变训练集中数据的概率分布(数据的权值分布),针对不同数据分布调用学习算法,学习一系列弱分类器。

那么需要考虑两个问题:
(1)每一轮如何改变训练数据的权值?
(2)如何组合这些弱分类器?

3. Adaboost算法

1995年,AdaBoost算法提出。

我们通过分析算法流程,将清楚看到该算法是如何完美地解决上述两个问题。

输入:训练集{...(xN,yN)},yi{1,+1},弱学习算法(例如x<v

输出:最终分类器G(x)

(1)初始化训练数据的权值分布。

D1=(w11,w12,...,w1i,w1N,)

w1i=1N,i=1,2,...,N

(2)对m=1,2,...,M个分类器分别有:

(2-a)使用具有权值分布的Dm的训练集学习,得到基本分类器Gm(x)

(2-b)计算Gm(x)在训练集的分类误差率:

em=P(Gm(xi)yi)=i=1NwmiI(Gm(xi)yi)

可看出Gm(x)Dm上的分类误差率是被其误分类样本的权值之和。

(2-c)计算Gm(x)的系数:

αm=12log1emem

《统计学习方法》笔记08:boosting(1)
横轴为分类器错误率,纵轴为分类器系数;

后面推导会知道为何系数这样计算,此处先略去。该式可知,分类误差率越小,分类器系数越大,该分类器在最终结果中起的作用越大。

本轮得到的分类器线性组合为:

fm(x)=i=1mαmGm(x)

(2-d)更新训练集下次的权值分布:

Dm+1=(wm+1,1,wm+1,2,...,wm+1,i,wm+1,N)

wm+1,i=wm,iZmexp(αmyiGm(xi))

看起来不明显,展开来看:
wm+1,i=wm,iZmeαm,G(mi)=yiwm,iZmeαm,G(mi)yi

Zm=i=1Nwm,iexp(αmyiGm(xi))

Zm的作用是归一化因子,保证Dm+1是一个概率分布,其包含的N个权值之和为1。

很清晰,当分类正确时,下次该数据权值会变小;当分类错误时,下次该数据权值会增大。我们计算分类误差率em时,实际计算的是误分类样本权值之和。误差率要求越小越好,所以分类器总会尽量照顾权值大的数据,努力将其分类正确,权值小的分错也没关系。所以我们说:

提高本轮中那些分类错误样本的权值,使得误分类样本在下一轮起更大作用。分类器将优先考虑他们,努力将其分类正确。

(3)将M个基本分类器进行线性组合:

f(x)=i=1MαmGm(x)

最终分类器为:
G(x)=sign(f(x))=sign(i=1MαmGm(x))

核心:boosting不改变训练集,不断改变每一轮中的权值分布,使得训练集数据在基本分类器中的学习中起到不同作用。

可参看P140的例8.1,简单例子有直观感受。

4. Adaboost训练误差分析

如上,AdaBoost能在学习过程中不断减少训练误差。

P142的定理8.1(AdaBoost的训练误差界)指出:最终分类器的训练误差有上界。我们可以在每一轮选取适当的Gm使得Zm最小,从而使得训练误差下降最快,迭代次数最少。

这就是为何我们要在例8.1中,每一轮总会选取分类误差率最小的分类器,因这样可以最快的迭代至最终分类器。

定理8.2表明在特定条件下,AdaBoost算法的训练误差以指数速率下降。

AdaBoost算法不需要知道下界。

该算法具有适应性:可以使用弱分类器各自的训练误差率。名称由来:Adaptive-Ada。

5. Adaboost算法解释

加法模型:f(x)=Mm=1βmb(x,γm)

对照AdaBoost模型,其基本分类器的线性组合

f(x)=i=1MαmGm(x)

AdaBoost算法可看做:模型为加法模型,损失函数为指数函数,学习算法为前向分步算法的二类分类学习方法。

给定训练集及损失函数L(y,f(x))下,学习加法模型f(x)的过程称为经验风险最小化,即损失函数最小化:

minβ,γi=1NL(yi,m=1Mβmb(xi,γm))

该学习问题较为复杂。

前向分布算法的求解思路:因为学习的是加法模型,我们可以从前向后,每一步只学习一个基函数及其系数,逐步逼近目标函数式,则可简化复杂度。

即我们可以每步只需优化损失函数:

minβ,γi=1NL(yi,βb(xi,γ))

这样,我们可以写出前向分步算法。

算法:前向分步算法

输入:训练集T,损失函数L,基函数集{b(x,γ)}
输出:加法模型f(x)
过程:
(1)初始化f0(x)=0
(2)对m=1,...,M
(2-a)极小化损失函数

(βm,γm)=argminβ,γi=1NL(yi,fm1(xi)+βb(xi,γ))

观式中本轮迭代是在上轮迭代基础上进行。
(2-b)更新
f(x)=fm1(x)+βmb(x,γm)

(3)得到加法模型:
f(x)=m=1Mβmb(x,γm)

由上述算法过程可以看出,AdaBoost是前向分步算法的特例。这时,模型是由基本分类器组成的加法模型,损失函数是指数函数。

下面讨论当前向分步算法的损失函数是指数函数

L(y,f(x))=exp[yf(x)]

时,其学习过程将等价于AdaBoost算法学习。

假设现在经过m-1轮迭代,前向分步算法已得到

fm1(x)=fm2(x)+αm1Gm1(x)

在第m轮迭代中得到αm,Gm(x),可得到fm(x)

我们现在的目标是前向分步算法得到的αm,Gm(x),能使得fm(x)在T上的指数函数最小,即:

(αm,Gm(x))=argminα,Gi=1Nexp[yi(fm1(xi)+αG(xi))]

=argminα,Gi=1Nw¯m,iexp[yiαG(xi)]

其中,w¯m,i不依赖于这俩变量,与最小化无关,但它依赖于fm1(x),随着每一轮迭代而发生区别。

现在我们要证明上式的最优解就是我们在AdaBoost中用的αm,Gm(x)

首先求Gm(x)。对任意α>0,使上式最小的G(x)由下式计算:

Gm(x)=argminGi=1Nw¯m,iI(yiG(xi))

这个分类器就是我们在AdaBoost中使用的基本分类器。它是使第m轮加权训练数据分类误差率最小的基本分类器。

然后再求αm。将上式展开:

i=1Nw¯m,iexp[yiαG(xi)]=yi=Gm(xi)w¯m,ieα+yiGm(xi)w¯m,ieα

=(eαeα)i=1Nw¯m,iI(yiG(xi))+eαi=1Nw¯m,i

两端除以常数Ni=1w¯m,i,不影响。第一项除以常数后得到分类误差率。
em=Ni=1w¯m,iI(yiG(xi))Ni=1w¯m,i=i=1Nwm,iI(yiG(xi)

则有:
=(eαeα)em+eα

该式对α求导,并令其为0,则可得到:
αm=12log1emem

这就是AdaBoost算法中设定αm的道理,从此推导而来。
w¯m,i=exp[yi(fm1(xi))]

fm(x)=fm1(x)+αmGm(x)

w¯m+1,i=exp[yi(fm1(xi)+αmGm(xi))]

=w¯m,iexp[yiαmGm(xi)]

这就是AdaBoost算法中权值更新的道理,此处只相差归一化常量因子,因此是等价的。

总结

(1)boosting方法通过改变训练集T中数据的权值,在每一轮迭代中训练基本分类器。最终将各轮得到的基本分类器线性加和。

(2)boosting方法的典型代表是AdaBoost算法。每一轮迭代中,将本轮分错类的样本,提高下一轮训练时的权值。因为我们每一轮要选择分类误差率最小的基本分类器,所以会额外关注这个权值较大的样本,尽量把他们下一轮分对。最终线性组合时,某基本分类器分类误差率越小,其权重越大,起的作用越大。

(3)AdaBoost算法可看做是模型为加法模型,损失函数为指数函数,学习算法为前向分步算法的二类分类方法。推导证明,前向分步算法中,当我们把基本分类器模型设定为简单分类模型,损失函数设为指数函数时,其数据更新权重,各基本分类器的权重等推出来就是AdaBoost算法中用的那几个。所以,AdaBoost算法是前向分步算法的特例。

相关文章: