3月机器学习在线课程第九课笔记--Boosting
机器学习
特别感谢@肖雅夫提供的word版本笔记。此篇笔记是在其word版本笔记基础上修改的。
Boosting的由来
古语云:三个臭皮匠,顶一个诸葛亮。而在机器学习领域,集成算法Boosting就是一个活生生的实例。Boosting和之前介绍过的Bagging相似,都是集成算法之一。Boosting通过整合多个弱分类器,从而形成一个强分类器。具体如何构造,还需要有严谨的理论基础。
在1990年,RobertSchapire最先构造出了一种多项式级的算法,该算法可将若分类器组合成强分类器,即Boosting算法。一年后,Yoav Freund提出了一种效率更高的Boosting算法。但是这两个最初的Boosting算法存在缺陷:都要求实现知道弱学习算法学习正确率的下限。到了1995年,Freund和Schapire改进了Boosting算法,提出了AdaBoost(Adaptive Boosting)算法。该算法的优点:效率和Freund与1991年提出的Boosting算法几乎相同,但不需要任何关于弱学习器的先验知识,因而更加容易应用到实际问题中。
随后,两位创始人更进一步提出了AdaBoost.M1,AdaBoost.M2等算法,在机器学习领域受到了极大关注。Boosting在人脸识别、文本分类中应用较多。
Boosting的思想及流程
Boosting的思想是这样的:给定一份训练数据集(各样本权重是一样的,之后会有变化),然后进行M次迭代,每次迭代后,对分类错误的样本加大权重,对正确分类的样本减少权重,在下一次的迭代中更加关注错分的样本。
可以通过下面的图来了解其中的思想(假设训练集数据有三维特征:X、Y、Z):
从上图可以看到,每一次迭代过后都会对训练集中的样本给予不同的权重。红色框框部分绿色面积较小的样本表示的是权重较小,表明在此次迭代中它被正确划分了。可以看到弱学习机的弱假设每一次都是针对某一特征进行假设,实际上就像是一个偏科的小孩(如语文好,数学英语较差,总体成绩较差)。但是有3个偏科的小孩,他们每人都有擅长的学科,那么经过分工合作,作为一个整体是有可能达到一个好成绩的。术业有专攻,就是这个道理。
流程如下:
- 给出任意一个弱学习算法和训练集(x1,y1),(x2,y2),...,(xn,yn),xi∈X,X表示某个特征空间,yi∈Y={+1,−1}。
- 初始化时,需要根据特征空间中原始训练集的分布D来给每一个样本分配权值。(AdaBoost为训练样本指定分布为1/n,即每个训练样本的权重都相同)。
- 调用弱学习算法进行T次迭代,每次迭代后,按照训练结果更新训练集上的分布,对训练失败的训练样本赋予较大的权重,使得下一次迭代更加关注这些样本,从而得到一个基本分类器序列k1,k2,...,kt,每个基本分类器ki也赋予一个权重,预测效果好的,相应的权重越大。
- T次迭代之后,在分类问题中最终的分类器K采用带权重的投票法产生。
通过流程可以知道,迭代的过程有两个权重值得注意:一个是每一次都更新的训练样本的权重w(m)i,一个是基本分类器hm的权重αm。单个基本分类器的学习准确率并不高,经过运用Boosting算法之后,最终的结果准确率将得到提高。
由于采用的Loss函数不同,Boosting算法也因此有了不同的类型,AdaBoost就是其中一类,更多的还有:
其中的符号稍有差异:
可以看到,L2Boosting、Gradient Boosting、AdaBoost和LogitBoost正是因为分别采用了Squared error、Absolute error、Exponential loss以及Logloss类型的Loss函数,而导致了算法的不一致。
AdaBoost的算法推导--前向算法解释
以AdaBoost为例,让我们来推导具体的算法过程及原理。观察上表,发现AdaBoost采用的是Exponential loss--L(y~,f)=exp(−y~f),其中y~∈{−1,+1}。也就是说,当错分的时候,cost为ef;而正确分类时,cost为e−f。我们现在还无法确定预测函数f的具体表达形式,但是可以知道潜在的要求是f>0,因为我们必须令错分时候的cost大一些,即满足ef>e−f。
假设在第m次迭代中,我们已经选出了m-1个基本分类器,这些分类器的线性组合表达形式如下:
Cm−1(xi)=α1k1(xi)+α2k2(xi)+...+αm−1km−1(xi).
假设各参数具体表达形式已知,其中αi表示基本分类器的权重,基本分类器ki(xi)∈{−1,+1}。现在我们想要选择第m个基本分类器,将线性组合形式拓展为:
Cm(xi)=C(m−1)(xi)+αmkm(xi)
但此时的αm,km并没有确定,需要通过最优算法求解得到。这个线性组合(强分类器)的Loss函数为:
E=∑i=1ne−y~i(C(m−1)(xi)+αmkm(xi))
可以重写上式为另一种形式:
E=∑i=1nw(m)ie−y~iαmkm(xi)
其中
w(m)i=e−y~iC(m−1)(xi)。
将上式拆分为两个表达式的和:
E=e−αm∑y~i=km(xi)w(m)i+eαm∑y~i≠km(xi)w(m)i
这意味着总的Loss函数是正确分类的Loss加上错误分类的Loss。进一步转化为:
E=(eαm−e−αm)∑i=1Nw(m)i1(y~i≠km(xi))+e−αm∑i=1Nw(m)i
现在需要求出
αm,km的表达形式。对上式加以分析,可以知道,
e−αm∑Ni=1w(m)i项与
km没有关系,那么此时取能够令Loss函数最小的
km为:
km=argminkm∑i=1Nw(m)i1(y~i≠km(xi))
也就是第m个基本分类器选择的标准是使得第m次分类中错分的Loss最小的那个基本分类器。
关于αm的确定,我们对表达式E求解关于αm的导数,并且令导数为0,可以得到最优的αm为:
αm=12log1−errmerrm,其中errm=∑Ni=1w(m)i1(y~i≠km(xi))∑Ni=1w(m)i
由此,关于AdaBoost的具体过程可以写成如下:
- 对于第m个分类器,m=1,...,M:
- a) 选择使得第m次分类中错分的Loss最小的基本分类器km;
b) 计算errm=∑Ni=1w(m)i1(y~i≠km(xi))∑Ni=1w(m)i;
c) 计算此时的第m个基本分类器权重αm=12log1−errmerrm;
d) 更新此时的样本权重,wi:=wi⋅exp(2αm1(y~i≠km(xi))−αm)。
- 得到最终预测结果f(x)=sign(∑Mm=1αmkm(x))。
实际上根据Adaboost的构造过程,权值调整公式为:
(wm+1,i)=⎧⎩⎨⎪⎪⎪⎪wm,iZme−αm,km(xi)=yiwm,iZmeαm,,km(xi)≠yi
其中的
Zm是正则化因子,它的目的仅仅是使
Dm+1成为一个概率分布,具体表达式为:
Zm=∑i=1Nwm,i⋅exp(−αmyikm(xi))
最终的结果是多个基本分类器加权之后再通过sign函数将结果判断出来,因为强分类器最终也是要区分两类结果{−1,1},用sign函数很符合常理。
AdaBoost实例演示
给定训练样本:
求解步骤:
(1) 初始化权值分布
D1=(w11,w12,...,w1i,...,w1n)
其中,
w1i=1N,i=1,2,...N
由于
N=10,所以
w1i=0.1,i=1,2,...N
(2)训练第一个基本分类器
a) 观察数据,发现'0,1,2'、'3,4,5'、'6,7,8'是三类不同的数据,而'9'则是单身汉;直观上推测可知,需要找到对应的数据分界点,比如2.5、5.5、8.5等,将这十个数分为两类。我们能够发现当阈值
v=2.5时,即分类器认为小于2.5的为正样本,大于2.5的为负样本。观察得知此时的
误差率最低(0.3),表格中阴影部分表示分错的记录:
此时的基本分类器为:
k1(x)={1,x<2.5−1,x≥2.5
b) 通过表格可以看出,训练样本有10个数据,分类器
k1(x)分错了3个,因此
k1(x)在训练样本上的分类误差率为:
e1=P(k1(xi)≠yi)=0.1+0.1+0.1=0.3
c) 根据分类误差率来计算
k1(x)的系数,有:
α1=12log(1−e1e1)=0.4236
d) 更新训练样本的权值分布(错分的样本6,7,8的权值增大),得到
D2:
D2=(0.0715,0.0715,0.0715,0.0715,0.0715,0.0715,0.1666,0.1666,0.1666,0.0715)
e) 得到当前的强分类器,由于目前只有一个基本分类器,所以当前的强分类器只有一项:
f1(x)=∑m=1Mαmkm(x)=0.4236⋅k1(x)
可以看出:错分样本的加权之和影响误差率,误差率影响基本分类器在最终分类器中所占的权重。
(3) 训练第二个分类器
a) 观察数据,此时取
v=8.5时误差率最低,表格中阴影部分表示分错的记录:
此时的基本分类器
k2为:
k2(x)={1,x<8.5−1,x≥8.5
b) 计算分类误差率,有:
e2=P(k2(xi)≠yi)=0.0715+0.0715+0.0715=0.2143
c) 根据分类误差率来计算
k2(x)的系数,有:
α2=12log(1−e2e2)=0.6496
d) 更新训练样本的权值分布,得到
D3:
D3=(0.0455,0.0455,0.0455,0.1667,0.1667,0.1667,0.106,0.106,0.106,0.0455)
对应的强分类器为:
f2(x)=∑m=1Mαmkm(x)=0.4236⋅k1(x)+0.6496⋅k2(x)
此时,将所有样本都代入到
sign(f2(x)),可以知道此时强分类器的错误率为30%。与
sign(f1(x))的错误率一致。
(4) 训练第三个分类器
a) 类似的步骤,在分布
D3中,当取
v=8.5时误差率最低,此时的基本分类器
k3为:
k3(x)={1,x<5.5−1,x≥5.5
b) 计算分类误差率,有:
e3=0.182
c) 根据分类误差率来计算
k3(x)的系数,有:
α3=12log(1−e3e3)=0.7514
d) 更新训练样本的权值分布,得到
D4:
D4=(0.125,0.125,0.125,0.102,0.102,0.102,0.065,0.065,0.065,0.125)
对应的强分类器为:
f3(x)=∑m=1Mαmkm(x)=0.4236⋅k1(x)+0.6496⋅k2(x)+0.7514⋅k3(x)
这个时候,我们将所有训练样本都代入到强分类器
f3(x)中,可以发现,在这个强分类器里面,所有的样本都被正确分类了,错误率为0!!!果然,三个臭皮匠顶上了一个诸葛亮!我们可以停止迭代了。通常迭代停止的条件有两种:一是判断强分类器的错误率是否已经达到预期设定的标准;二是判断总的迭代次数是否达到了预期设定的次数。
AdaBoost的误差界
通过上面的例子可知,Adaboost在学习的过程中不断减少训练误差,直到各个弱分类器组合成最终分类器,那这个最终分类器的误差界到底是多少呢?
相关专家已经证明,Adaboost 最终分类器的训练误差的上界为:
1N∑i=1N1(sign(fM(xi))≠yi)≤1N∑i=1Nexp(−yifM(xi))=∏m=1MZm
也就是说,随着证明过程如下:
当强分类器
sign(fm(xi))≠yi时,有
yifm(xi)≤0,因而
exp(−yifm(xi))≥1,因此前半部分得证。
关于后半部分,由之前的知识可知:
wm+1,i=wm,iZmexp(−αmyikm(xi))Zmwm+1,i=wm,iexp(−αmyikm(xi))
整个推导过程如下:
1N∑i=1Nexp(−yifM(xi))=1N∑i=1Nexp(−yi∑m=1Mαmkm(xi))=∑i=1N1Nexp(−yi∑m=1Mαmkm(xi))=∑i=1Nw1i⋅exp(−yi∑m=1Mαmkm(xi))=∑i=1Nw1i∏m=1Mexp(−yiαmkm(xi))=∑i=1Nw1,i⋅exp(−yiα1k1(xi))∏m=2Mexp(−yiαmkm(xi))
将之前的
Zmwm+1,i=wm,i⋅exp(−αmyikm(xi))代入可知:
=∑i=1NZ1⋅w2,i∏m=2Mexp(−yiαmkm(xi))=Z1∑i=1Nw2,i∏m=2Mexp(−yiαmkm(xi))=Z1Z2∑i=1Nw3,i∏m=3Mexp(−yiαmkm(xi))=Z1Z2⋅⋅⋅ZM−1∑i=1NwM,iexp(−yiαMkM(xi))=∏m=1MZm
这个结果表明:在每一轮选择适当的
km(x)使得
Zm最小,从而使得训练误差下降最快。这和之前的推导是一致的。接下来,我们来看看上述结果的上界。
对于二分类而言,有如下结论:
∏m=1MZm=∏m=1M(2em(1−em)−−−−−−−−−√)=∏m=1M1−4γ2m−−−−−−−√≤exp(−2∑m=1Mγ2m)
其中,
γm=12−em。证明如下:
根据
Zm以及分类误差
em的定义式:
Zm=∑i=1Nwm,i⋅exp(−αmyikm(xi))=∑yi=km(xi)wm,i⋅e−αm+∑yi=km(xi)wm,i⋅eαm=(1−em)e−αm+emeαm=2em(1−em)−−−−−−−−−√=1−4γ2m−−−−−−−√
而最后的不等式
∏Mm=11−4γ2m−−−−−−−√≤exp(−2∑Mm=1γ2m)可先由
ex和
1−x−−−−√在点
x=0处的泰勒展开式推出不等式
(1−4γ2)−−−−−−−−√≤exp(−2γ2m),进而得到。
推论:如果存在
γ>0,对所有
m有
γm>γ,则
1N∑i=1N1(sign(fM(xi)≠yi)))≤exp(−2Mγ2)
这表明在此条件下AdaBoost算法的训练误差是以指数速率下降的。这一性质是很有吸引力的。注意,AdaBoost算法不需要知道下界
γ,这真是Freund与Schapire设计AdaBoost时所考虑的,也就是说它具有适应性,即它能够适应弱分类器各自的训练误差率,这也就是它的名称的由来。