[转]Adaboost 算法的原理与推导

看了不少篇解释关于Adaboost的博文,以为这篇写得很好,所以转载来本身的博客中,以便学习和查阅。php

原文地址:《Adaboost 算法的原理与推导》,主要内容可分为三块,Adaboost介绍、实例以及公式推导。html

1 Adaboost的原理

1.1 Adaboost是什么    

AdaBoost,是英文"Adaptive Boosting"(自适应加强)的缩写,由Yoav Freund和Robert Schapire在1995年提出。它的自适应在于:前一个基本分类器分错的样本会获得增强,加权后的全体样本再次被用来训练下一个基本分类器。同时,在每一轮中加入一个新的弱分类器,直到达到某个预约的足够小的错误率或达到预先指定的最大迭代次数。算法

具体说来,整个Adaboost 迭代算法就3步:api

  1. 初始化训练数据的权值分布。若是有N个样本,则每个训练样本最开始时都被赋予相同的权值:1/N。
  2. 训练弱分类器。具体训练过程当中,若是某个样本点已经被准确地分类,那么在构造下一个训练集中,它的权值就被下降;相反,若是某个样本点没有被准确地分类,那么它的权值就获得提升。而后,权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。
  3. 将各个训练获得的弱分类器组合成强分类器。各个弱分类器的训练过程结束后,加大分类偏差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定做用,而下降分类偏差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定做用。换言之,偏差率低的弱分类器在最终分类器中占的权重较大,不然较小。

1.2 Adaboost算法流程

   给定一个训练数据集T={(x1,y1), (x2,y2)…(xN,yN)},其中实例,而实例空间,yi属于标记集合{-1,+1},Adaboost的目的就是从训练数据中学习一系列弱分类器或基本分类器,而后将这些弱分类器组合成一个强分类器。函数

    Adaboost的算法流程以下:学习

  • 步骤1. 首先,初始化训练数据的权值分布。每个训练样本最开始时都被赋予相同的权值:1/N。

  • 步骤2. 进行多轮迭代,用m = 1,2, ..., M表示迭代的第多少轮

a. 使用具备权值分布Dm的训练数据集学习,获得基本分类器(选取让偏差率最低的阈值来设计基本分类器):优化

b. 计算Gm(x)在训练数据集上的分类偏差率spa

由上述式子可知,Gm(x)在训练数据集上的偏差率em就是被Gm(x)误分类样本的权值之和。.net

c. 计算Gm(x)的系数,am表示Gm(x)在最终分类器中的重要程度(目的:获得基本分类器在最终分类器中所占的权重。注:这个公式 写成 am=1/2ln((1-em)/em) 更准确,由于底数是天然对数e,故用In,写成log容易让人误觉得底数是2或别的底数,下同):

由上述式子可知,em <= 1/2时,am >= 0,且am随着em的减少而增大,意味着分类偏差率越小的基本分类器在最终分类器中的做用越大。设计

d. 更新训练数据集的权值分布(目的:获得样本的新的权值分布),用于下一轮迭代

使得被基本分类器Gm(x)误分类样本的权值增大,而被正确分类样本的权值减少。就这样,经过这样的方式,AdaBoost方法能“重点关注”或“聚焦于”那些较难分的样本上。

其中,Zm是规范化因子,使得Dm+1成为一个几率分布:

  • 步骤3. 组合各个弱分类器

从而获得最终分类器,以下:

1.3 Adaboost的一个例子

下面,给定下列训练样本,请用AdaBoost算法学习一个强分类器。

   

求解过程:初始化训练数据的权值分布,令每一个权值W1i = 1/N = 0.1,其中,N = 10,i = 1,2, ..., 10,而后分别对于m = 1,2,3, ...等值进行迭代。

    拿到这10个数据的训练样本后,根据 X 和 Y 的对应关系,要把这10个数据分为两类,一类是“1”,一类是“-1”,根据数据的特色发现:“0 1 2”这3个数据对应的类是“1”,“3 4 5”这3个数据对应的类是“-1”,“6 7 8”这3个数据对应的类是“1”,9是比较孤独的,对应类“-1”。抛开孤独的9不讲,“0 1 2”、“3 4 5”、“6 7 8”这是3类不一样的数据,分别对应的类是一、-一、1,直观上推测可知,能够找到对应的数据分界点,好比2.五、5.五、8.5 将那几类数据分红两类。固然,这只是主观臆测,下面实际计算下这个具体过程。

迭代过程1

对于m=1,在权值分布为D1(10个数据,每一个数据的权值皆初始化为0.1)的训练数据上,通过计算可得:

    1. 阈值v取2.5时偏差率为0.3(x < 2.5时取1,x > 2.5时取-1,则6 7 8分错,偏差率为0.3),
    2. 阈值v取5.5时偏差率最低为0.4(x < 5.5时取1,x > 5.5时取-1,则3 4 5 6 7 8皆分错,偏差率0.6大于0.5,不可取。故令x > 5.5时取1,x < 5.5时取-1,则0 1 2 9分错,偏差率为0.4),
    3. 阈值v取8.5时偏差率为0.3(x < 8.5时取1,x > 8.5时取-1,则3 4 5分错,偏差率为0.3)。

能够看到,不管阈值v取2.5,仍是8.5,总得分错3个样本,故可任取其中任意一个如2.5,弄成第一个基本分类器为:

上面说阈值v取2.5时则6 7 8分错,因此偏差率为0.3,更加详细的解释是:由于样本集中

    1. 0 1 2对应的类(Y)是1,因它们自己都小于2.5,因此被G1(x)分在了相应的类“1”中,分对了。
    2. 3 4 5自己对应的类(Y)是-1,因它们自己都大于2.5,因此被G1(x)分在了相应的类“-1”中,分对了。
    3. 但6 7 8自己对应类(Y)是1,却因它们自己大于2.5而被G1(x)分在了类"-1"中,因此这3个样本被分错了。
    4. 9自己对应的类(Y)是-1,因它自己大于2.5,因此被G1(x)分在了相应的类“-1”中,分对了。

从而获得G1(x)在训练数据集上的偏差率(被G1(x)误分类样本“6 7 8”的权值之和)e1=P(G1(xi)≠yi) = 3*0.1 = 0.3

而后根据偏差率e1计算G1的系数:

这个a1表明G1(x)在最终的分类函数中所占的权重,为0.4236。 接着更新训练数据的权值分布,用于下一轮迭代:

值得一提的是,由权值更新的公式可知,每一个样本的新权值是变大仍是变小,取决于它是被分错仍是被分正确。

即若是某个样本被分错了,则yi * Gm(xi)为负,负负得正,结果使得整个式子变大(样本权值变大),不然变小。

第一轮迭代后,最后获得各个数据的权值分布D2 = (0.0715, 0.0715, 0.0715, 0.0715, 0.0715,  0.0715, 0.1666, 0.1666, 0.1666, 0.0715)。由此能够看出,由于样本中是数据“6 7 8”被G1(x)分错了,因此它们的权值由以前的0.1增大到0.1666,反之,其它数据皆被分正确,因此它们的权值皆由以前的0.1减少到0.0715。

分类函数f1(x)= a1*G1(x) = 0.4236G1(x)。

此时,获得的第一个基本分类器sign(f1(x))在训练数据集上有3个误分类点(即6 7 8)。

从上述第一轮的整个迭代过程能够看出:被误分类样本的权值之和影响偏差率,偏差率影响基本分类器在最终分类器中所占的权重

迭代过程2

对于m=2,在权值分布为D2 = (0.0715, 0.0715, 0.0715, 0.0715, 0.0715,  0.0715, 0.1666, 0.1666, 0.1666, 0.0715)的训练数据上,通过计算可得:

    1. 阈值v取2.5时偏差率为0.1666*3(x < 2.5时取1,x > 2.5时取-1,则6 7 8分错,偏差率为0.1666*3),
    2. 阈值v取5.5时偏差率最低为0.0715*4(x > 5.5时取1,x < 5.5时取-1,则0 1 2 9分错,偏差率为0.0715*3 + 0.0715),
    3. 阈值v取8.5时偏差率为0.0715*3(x < 8.5时取1,x > 8.5时取-1,则3 4 5分错,偏差率为0.0715*3)。

因此,阈值v取8.5时偏差率最低,故第二个基本分类器为:

面对的仍是下述样本:

很明显,G2(x)把样本“3 4 5”分错了,根据D2可知它们的权值为0.0715, 0.0715,  0.0715,因此G2(x)在训练数据集上的偏差率e2=P(G2(xi)≠yi) = 0.0715 * 3 = 0.2143。

计算G2的系数:

更新训练数据的权值分布:

D3 = (0.0455, 0.0455, 0.0455, 0.1667, 0.1667,  0.01667, 0.1060, 0.1060, 0.1060, 0.0455)。被分错的样本“3 4 5”的权值变大,其它被分对的样本的权值变小。 f2(x)=0.4236G1(x) + 0.6496G2(x)

此时,获得的第二个基本分类器sign(f2(x))在训练数据集上有3个误分类点(即3 4 5)。

迭代过程3

对于m=3,在权值分布为D3 = (0.0455, 0.0455, 0.0455, 0.1667, 0.1667,  0.01667, 0.1060, 0.1060, 0.1060, 0.0455)的训练数据上,通过计算可得:

    1. 阈值v取2.5时偏差率为0.1060*3(x < 2.5时取1,x > 2.5时取-1,则6 7 8分错,偏差率为0.1060*3),
    2. 阈值v取5.5时偏差率最低为0.0455*4(x > 5.5时取1,x < 5.5时取-1,则0 1 2 9分错,偏差率为0.0455*3 + 0.0715),
    3. 阈值v取8.5时偏差率为0.1667*3(x < 8.5时取1,x > 8.5时取-1,则3 4 5分错,偏差率为0.1667*3)。

因此阈值v取5.5时偏差率最低,故第三个基本分类器为:

依然仍是原样本:

此时,被误分类的样本是:0 1 2 9,这4个样本所对应的权值皆为0.0455,

因此G3(x)在训练数据集上的偏差率e3 = P(G3(xi)≠yi) = 0.0455*4 = 0.1820。

计算G3的系数:

更新训练数据的权值分布:

D4 = (0.125, 0.125, 0.125, 0.102, 0.102,  0.102, 0.065, 0.065, 0.065, 0.125)。被分错的样本“0 1 2 9”的权值变大,其它被分对的样本的权值变小。

f3(x)=0.4236G1(x) + 0.6496G2(x)+0.7514G3(x)

此时,获得的第三个基本分类器sign(f3(x))在训练数据集上有0个误分类点。至此,整个训练过程结束。

如今,我们来总结下3轮迭代下来,各个样本权值和偏差率的变化,以下所示(其中,样本权值D中加了下划线的表示在上一轮中被分错的样本的新权值):

  1. 训练以前,各个样本的权值被初始化为D1 = (0.1, 0.1,0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1);
  2. 第一轮迭代中,样本“6 7 8”被分错,对应的偏差率为e1=P(G1(xi)≠yi) = 3*0.1 = 0.3,此第一个基本分类器在最终的分类器中所占的权重为a1 = 0.4236。第一轮迭代事后,样本新的权值为D2 = (0.0715, 0.0715, 0.0715, 0.0715, 0.0715,  0.0715, 0.1666, 0.1666, 0.1666, 0.0715);
  3. 第二轮迭代中,样本“3 4 5”被分错,对应的偏差率为e2=P(G2(xi)≠yi) = 0.0715 * 3 = 0.2143,此第二个基本分类器在最终的分类器中所占的权重为a2 = 0.6496。第二轮迭代事后,样本新的权值为D3 = (0.0455, 0.0455, 0.0455, 0.1667, 0.1667,  0.01667, 0.1060, 0.1060, 0.1060, 0.0455);
  4. 第三轮迭代中,样本“0 1 2 9”被分错,对应的偏差率为e3 = P(G3(xi)≠yi) = 0.0455*4 = 0.1820,此第三个基本分类器在最终的分类器中所占的权重为a3 = 0.7514。第三轮迭代事后,样本新的权值为D4 = (0.125, 0.125, 0.125, 0.102, 0.102,  0.102, 0.065, 0.065, 0.065, 0.125)。

从上述过程当中能够发现,若是某些个样本被分错,它们在下一轮迭代中的权值将被增大,同时,其它被分对的样本在下一轮迭代中的权值将被减少。就这样,分错样本权值增大,分对样本权值变小,而在下一轮迭代中,老是选取让偏差率最低的阈值来设计基本分类器,因此偏差率e(全部被Gm(x)误分类样本的权值之和)不断下降。

综上,将上面计算获得的a一、a二、a3各值代入G(x)中,G(x) = sign[f3(x)] = sign[ a1 * G1(x) + a2 * G2(x) + a3 * G3(x) ],获得最终的分类器为:

G(x) = sign[f3(x)] = sign[ 0.4236G1(x) + 0.6496G2(x)+0.7514G3(x) ]。

 

2 Adaboost的偏差界

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

事实上,Adaboost 最终分类器的训练偏差的上界为:

 

   

下面,我们来经过推导来证实下上述式子。

 当G(xi)≠yi时,yi*f(xi)<0,于是exp(-yi*f(xi))≥1,所以前半部分得证。

 关于后半部分,别忘了:

 

 

整个的推导过程以下:

 

这个结果说明,能够在每一轮选取适当的Gm使得Zm最小,从而使训练偏差降低最快。接着,我们来继续求上述结果的上界。

对于二分类而言,有以下结果:

 

 

其中,

继续证实下这个结论。

由以前Zm的定义式跟本节最开始获得的结论可知:

 

 

而这个不等式可先由e^x和1-x的开根号,在点x的泰勒展开式推出。

值得一提的是,若是取γ1, γ2… 的最小值,记作γ(显然,γ≥γi>0,i=1,2,...m),则对于全部m,有:

 

 

这个结论代表,AdaBoost的训练偏差是以指数速率降低的。另外,AdaBoost算法不须要事先知道下界γ,AdaBoost具备自适应性,它能适应弱分类器各自的训练偏差率 。

最后,Adaboost 还有另一种理解,便可以认为其模型是加法模型、损失函数为指数函数、学习算法为前向分步算法的二类分类学习方法,下个月即12月份会再推导下,而后更新此文。而在此以前,有兴趣的能够参看《统计学习方法》第8.3节或其它相关资料。

3 Adaboost 指数损失函数推导

事实上,在上文1.2节Adaboost的算法流程的步骤3中,咱们构造的各个基本分类器的线性组合

 

 

是一个加法模型,而Adaboost算法实际上是前向分步算法的特例。那么问题来了,什么是加法模型,什么又是前向分步算法呢?

3.1 加法模型和前向分步算法

以下图所示的即是一个加法模型

 

 

其中,称为基函数,称为基函数的参数,称为基函数的系数。

在给定训练数据及损失函数的条件下,学习加法模型成为经验风险极小化问题,即损失函数极小化问题:

 

 

随后,该问题能够做如此简化:从前向后,每一步只学习一个基函数及其系数,逐步逼近上式,即:每步只优化以下损失函数:

这个优化方法便就是所谓的前向分步算法。

下面,我们来具体看下前向分步算法的算法流程:

  • 输入:训练数据集
  • 损失函数:
  • 基函数集:
  • 输出:加法模型
  • 算法步骤:
    • 1. 初始化
    • 2. 对于m=1,2,..M
  • a)极小化损失函数

获得参数

  • b)更新

    • 3. 最终获得加法模型

    就这样,前向分步算法将同时求解从m=1到M的全部参数()的优化问题简化为逐次求解各个(1≤m≤M)的优化问题。

3.2 前向分步算法与Adaboost的关系

    在上文第2节最后,咱们说Adaboost 还有另一种理解,便可以认为其模型是加法模型、损失函数为指数函数、学习算法为前向分步算法的二类分类学习方法。其实,Adaboost算法就是前向分步算法的一个特例,Adaboost 中,各个基本分类器就至关于加法模型中的基函数,且其损失函数为指数函数。

    换句话说,当前向分步算法中的基函数为Adaboost中的基本分类器时,加法模型等价于Adaboost的最终分类器

 

 

    你甚至能够说,这个最终分类器其实就是一个加法模型。只是这个加法模型由基本分类器及其系数组成,m = 1, 2, ..., M。前向分步算法逐一学习基函数的过程,与Adaboost算法逐一学习各个基本分类器的过程一致。

    下面,我们便来证实:当前向分步算法的损失函数是指数损失函数

    时,其学习的具体操做等价于Adaboost算法的学习过程

     假设通过m-1轮迭代,前向分步算法已经获得

    然后在第m轮迭代获得。其中,为:

 

    而未知。因此,如今我们的目标即是根据前向分步算法训练,使得最终在训练数据集T上的指数损失最小,即

    针对这种须要求解多个参数的状况,能够先固定其它参数,求解其中一两个参数,而后逐一求解剩下的参数。例如咱们能够固定,只针对作优化。

    换言之,在面对 这2m个参数都未知的状况下,能够:

  1. 先假定已知,求解出
  2. 而后再逐一求解其它未知参数。

    且考虑到上式中的既不依赖也不依赖G,因此是个与最小化无关的固定值,记为,即,则上式能够表示为(后面要屡次用到这个式子,简记为):

    值得一提的是,虽然与最小化无关,但依赖于,随着每一轮迭代而发生变化。

    接下来,即是要证使得上式达到最小的就是Adaboost算法所求解获得的

    为求解上式,我们先求再求

    首先求。对于任意,使上式最小的G(x)由下式获得:

    别忘了,

    跟1.2节所述的偏差率的计算公式对比下:

 

 

    可知,上面获得的即是Adaboost算法的基本分类器,由于它是在第m轮加权训练数据时,使分类偏差率最小的基本分类器。换言之,这个即是Adaboost算法所要求的,别忘了,在Adaboost算法的每一轮迭代中,都是选取让偏差率最低的阈值来设计基本分类器。

    而后求。仍是回到以前的这个式子上:

    这个式子的后半部分能够进一步化简,得:

 

    接着将上面求得的

    代入上式中,且对求导,令其求导结果为0,即获得使得一式最小的,即为:

    这里的跟上文1.2节中的计算公式彻底一致。

    此外,毫无疑问,上式中的即是偏差率:

    即就是被Gm(x)误分类样本的权值之和。

   就这样,结合模型,跟,能够推出

   从而有:

    与上文1.2节介绍的权值更新公式

    相比,只相差一个规范化因子,即后者多了一个

    因此,整个过程下来,咱们能够看到,前向分步算法逐一学习基函数的过程,确实是与Adaboost算法逐一学习各个基本分类器的过程一致,二者彻底等价。

    综上,本节不但提供了Adaboost的另外一种理解:加法模型,损失函数为指数函数,学习算法为前向分步算法,并且也解释了最开始1.2节中基本分类器及其系数的由来,以及对权值更新公式的解释,你甚至能够认为本节就是对上文整个1.2节的解释。

 

 

4 参考文献与推荐阅读

  1. wikipedia上关于Adaboost的介绍:http://zh.wikipedia.org/zh-cn/AdaBoost
  2. 邹博之决策树与Adaboost PPT:http://pan.baidu.com/s/1hqePkdY
  3. 邹博讲Adaboost指数损失函数推导的PPT:http://pan.baidu.com/s/1kTkkepD(第85页~第98页);
  4. 《统计学习方法 李航著》第8章;
  5. 关于adaboost的一些浅见:http://blog.sina.com.cn/s/blog_6ae183910101chcg.html
  6. A Short Introduction to Boosting:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.93.5148&rep=rep1&type=pdf
  7. 南大周志华教授作的关于boosting 25年的报告PPT:http://vdisk.weibo.com/s/FcILTUAi9m111
  8. 《数据挖掘十大算法》第7章 Adaboost;
  9. http://summerbell.iteye.com/blog/532376
  10. 统计学习那些事:http://cos.name/2011/12/stories-about-statistical-learning/
  11. 统计学习基础学习笔记:http://www.loyhome.com/%E2%89%AA%E7%BB%9F%E8%AE%A1%E5%AD%A6%E4%B9%A0%E7%B2%BE%E8%A6%81the-elements-of-statistical-learning%E2%89%AB%E8%AF%BE%E5%A0%82%E7%AC%94%E8%AE%B0%EF%BC%88%E5%8D%81%E5%9B%9B%EF%BC%89/
  12. PRML第十四章组合模型读书笔记:http://vdisk.weibo.com/s/DmxNcM5_IaUD
  13. 顺便推荐一个很是实用的在线编辑LaTeX 公式的网页:http://www.codecogs.com/latex/eqneditor.php?lang=zh-cn
相关文章
相关标签/搜索