[关闭]
@frank-shaw 2015-08-03T10:40:47.000000Z 字数 10526 阅读 12153

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):
boosting演示图
从上图可以看到,每一次迭代过后都会对训练集中的样本给予不同的权重。红色框框部分绿色面积较小的样本表示的是权重较小,表明在此次迭代中它被正确划分了。可以看到弱学习机的弱假设每一次都是针对某一特征进行假设,实际上就像是一个偏科的小孩(如语文好,数学英语较差,总体成绩较差)。但是有3个偏科的小孩,他们每人都有擅长的学科,那么经过分工合作,作为一个整体是有可能达到一个好成绩的。术业有专攻,就是这个道理。

流程如下:

  • 给出任意一个弱学习算法和训练集(x1,y1),(x2,y2),...,(xn,yn),xiX,X表示某个特征空间,yiY={+1,1}
  • 初始化时,需要根据特征空间中原始训练集的分布D来给每一个样本分配权值。(AdaBoost为训练样本指定分布为1/n,即每个训练样本的权重都相同)。
  • 调用弱学习算法进行T次迭代,每次迭代后,按照训练结果更新训练集上的分布,对训练失败的训练样本赋予较大的权重,使得下一次迭代更加关注这些样本,从而得到一个基本分类器序列k1,k2,...,kt,每个基本分类器ki也赋予一个权重,预测效果好的,相应的权重越大。
  • T次迭代之后,在分类问题中最终的分类器K采用带权重的投票法产生。

通过流程可以知道,迭代的过程有两个权重值得注意:一个是每一次都更新的训练样本的权重w(m)i,一个是基本分类器hm的权重αm。单个基本分类器的学习准确率并不高,经过运用Boosting算法之后,最终的结果准确率将得到提高。

由于采用的Loss函数不同,Boosting算法也因此有了不同的类型,AdaBoost就是其中一类,更多的还有:
不同Boosting算法类型
其中的符号稍有差异:
符号差异解释
可以看到,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为ef。我们现在还无法确定预测函数f的具体表达形式,但是可以知道潜在的要求是f>0,因为我们必须令错分时候的cost大一些,即满足ef>ef

假设在第m次迭代中,我们已经选出了m-1个基本分类器,这些分类器的线性组合表达形式如下:
Cm1(xi)=α1k1(xi)+α2k2(xi)+...+αm1km1(xi).
假设各参数具体表达形式已知,其中αi表示基本分类器的权重,基本分类器ki(xi){1,+1}。现在我们想要选择第m个基本分类器,将线性组合形式拓展为:
Cm(xi)=C(m1)(xi)+αmkm(xi)
但此时的αmkm并没有确定,需要通过最优算法求解得到。这个线性组合(强分类器)的Loss函数为:

E=i=1ney~i(C(m1)(xi)+αmkm(xi))

可以重写上式为另一种形式:
E=i=1nw(m)iey~iαmkm(xi)

其中w(m)i=ey~iC(m1)(xi)

将上式拆分为两个表达式的和:

E=eαmy~i=km(xi)w(m)i+eαmy~ikm(xi)w(m)i

这意味着总的Loss函数是正确分类的Loss加上错误分类的Loss。进一步转化为:
E=(eαmeαm)i=1Nw(m)i1(y~ikm(xi))+eαmi=1Nw(m)i

现在需要求出αmkm的表达形式。对上式加以分析,可以知道,eαmNi=1w(m)i项与km没有关系,那么此时取能够令Loss函数最小的km为:
km=argminkmi=1Nw(m)i1(y~ikm(xi))

也就是第m个基本分类器选择的标准是使得第m次分类中错分的Loss最小的那个基本分类器。

关于αm的确定,我们对表达式E求解关于αm的导数,并且令导数为0,可以得到最优的αm为:

αm=12log1errmerrm,errm=Ni=1w(m)i1(y~ikm(xi))Ni=1w(m)i

由此,关于AdaBoost的具体过程可以写成如下:

  • 对于第m个分类器,m=1,...,M:
    • a) 选择使得第m次分类中错分的Loss最小的基本分类器km
      b) 计算errm=Ni=1w(m)i1(y~ikm(xi))Ni=1w(m)i;
      c) 计算此时的第m个基本分类器权重αm=12log1errmerrm;
      d) 更新此时的样本权重,wi:=wiexp(2αm1(y~ikm(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,iexp(αmyikm(xi))

最终的结果是多个基本分类器加权之后再通过sign函数将结果判断出来,因为强分类器最终也是要区分两类结果{1,1},用sign函数很符合常理。

AdaBoost实例演示

给定训练样本:
ad演示1
求解步骤:
(1) 初始化权值分布

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

其中,w1i=1N,i=1,2,...N
由于N=10,所以 w1i=0.1i=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),表格中阴影部分表示分错的记录:
ad演示2
此时的基本分类器为:
k1(x)={1,x<2.51,x2.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(1e1e1)=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.4236k1(x)

可以看出:错分样本的加权之和影响误差率,误差率影响基本分类器在最终分类器中所占的权重。
(3) 训练第二个分类器
a) 观察数据,此时取v=8.5时误差率最低,表格中阴影部分表示分错的记录:
ad3
此时的基本分类器k2为:
k2(x)={1,x<8.51,x8.5

b) 计算分类误差率,有:
e2=P(k2(xi)yi)=0.0715+0.0715+0.0715=0.2143

c) 根据分类误差率来计算k2(x)的系数,有:
α2=12log(1e2e2)=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.4236k1(x)+0.6496k2(x)

此时,将所有样本都代入到sign(f2(x)),可以知道此时强分类器的错误率为30%。与sign(f1(x))的错误率一致。
(4) 训练第三个分类器
a) 类似的步骤,在分布D3中,当取v=8.5时误差率最低,此时的基本分类器k3为:
k3(x)={1,x<5.51,x5.5

b) 计算分类误差率,有:
e3=0.182

c) 根据分类误差率来计算k3(x)的系数,有:
α3=12log(1e3e3)=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.4236k1(x)+0.6496k2(x)+0.7514k3(x)

这个时候,我们将所有训练样本都代入到强分类器f3(x)中,可以发现,在这个强分类器里面,所有的样本都被正确分类了,错误率为0!!!果然,三个臭皮匠顶上了一个诸葛亮!我们可以停止迭代了。通常迭代停止的条件有两种:一是判断强分类器的错误率是否已经达到预期设定的标准;二是判断总的迭代次数是否达到了预期设定的次数。

AdaBoost的误差界

通过上面的例子可知,Adaboost在学习的过程中不断减少训练误差,直到各个弱分类器组合成最终分类器,那这个最终分类器的误差界到底是多少呢?

相关专家已经证明,Adaboost 最终分类器的训练误差的上界为:

1Ni=1N1(sign(fM(xi))yi)1Ni=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))

整个推导过程如下:
1Ni=1Nexp(yifM(xi))=1Ni=1Nexp(yim=1Mαmkm(xi))=i=1N1Nexp(yim=1Mαmkm(xi))=i=1Nw1iexp(yim=1Mαmkm(xi))=i=1Nw1im=1Mexp(yiαmkm(xi))=i=1Nw1,iexp(yiα1k1(xi))m=2Mexp(yiαmkm(xi))

将之前的Zmwm+1,i=wm,iexp(αmyikm(xi))代入可知:
=i=1NZ1w2,im=2Mexp(yiαmkm(xi))=Z1i=1Nw2,im=2Mexp(yiαmkm(xi))=Z1Z2i=1Nw3,im=3Mexp(yiαmkm(xi))=Z1Z2ZM1i=1NwM,iexp(yiαMkM(xi))=m=1MZm

这个结果表明:在每一轮选择适当的km(x)使得Zm最小,从而使得训练误差下降最快。这和之前的推导是一致的。接下来,我们来看看上述结果的上界。
对于二分类而言,有如下结论:
m=1MZm=m=1M(2em(1em))=m=1M14γ2mexp(2m=1Mγ2m)

其中,γm=12em。证明如下:
根据Zm以及分类误差em的定义式:
Zm=i=1Nwm,iexp(αmyikm(xi))=yi=km(xi)wm,ieαm+yi=km(xi)wm,ieαm=(1em)eαm+emeαm=2em(1em)=14γ2m

而最后的不等式Mm=114γ2mexp(2Mm=1γ2m)可先由ex1x在点x=0处的泰勒展开式推出不等式(14γ2)exp(2γ2m),进而得到。
推论:如果存在γ>0,对所有mγm>γ,则
1Ni=1N1(sign(fM(xi)yi)))exp(2Mγ2)

这表明在此条件下AdaBoost算法的训练误差是以指数速率下降的。这一性质是很有吸引力的。注意,AdaBoost算法不需要知道下界γ,这真是Freund与Schapire设计AdaBoost时所考虑的,也就是说它具有适应性,即它能够适应弱分类器各自的训练误差率,这也就是它的名称的由来。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注