【机器学习】AdaBoost算法详解

一、Boosting简介


    Boosting算法是一种通过多次学习来提升算法精度的方法,它采用的是综合的原则使得算法的效率明显改善,是一种将弱分类器提升为强分类器的方法。通俗点讲,就是“三个臭皮匠赛过诸葛亮”,臭皮匠就好比弱分类器,综合起来就是一个强分类器。

    Boosting算法是一种集成学习方案。何谓集成学习?在理解集成学习之前,我们先介绍传统的学习方法,就是通过单个分类器来做决策,例如朴素贝叶斯分类器,SVM,人工神经网络等。集成学习方法却是需要多个分类器来投票进行最终的决策。好比领导开会,说:“赞成的请举手”,每个决策者就好比一个弱分类器进行投票,如果纷纷举手,结果自然没有什么悬念,这对于决策层而言,是最喜欢看到的,直接通过。

    说了这么久的弱分类器,到底什么是弱分类器?先说弱学习算法吧。它通常是对一定分布的训练样本给出的假设(给出假设的准确率仅仅强于随机猜测)。它的思想起源于Valiant提出的计算学习理论一PAC (Probably Approximately Correct) 学习模型。在Valiant的PAC模型中,一个性能仅比随机猜测稍好的弱学习算法是否能被提升为一个具有任意精度的强学习算法呢?这个问题困扰着很多研究机器学习的研究者,而且很长一段时间都没有一个切实可行的办法来实现这个理想。终于功夫不负有心人,Schapire先是在1990年证明了,如果将多个PAC分类器集成在一起,它将具有PAC强分类器的泛化能力,然后在1996年提出一个有效的算法来验证,它就是叫AdaBoost(Adaptive Boosting)。


二、AdaBoost原理介绍


    AdaBoost方法的自适应在于:前一个分类器分错的样本会被用来训练下一个分类器。AdaBoost方法是一种迭代算法,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率。每一个训练样本都被赋予一个权重,表明它被某个分类器选入训练集的概率。如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它被选中的概率就被降低;相反,如果某个样本点没有被准确地分类,那么它的权重就得到提高。通过这样的方式,AdaBoost方法能“聚焦于”那些较难分(更富信息)的样本上。虽然AdaBoost方法对于噪声数据和异常数据很敏感。但相对于大多数其它学习算法而言,却又不会很容易出现过拟合现象。

    在具体实现上,最初令每个样本的权重都相等,对于第k次迭代操作,我们就根据这些权重来选取样本点,进而训练分类器Ck。然后就根据这个分类器,来提高被它分错的的样本的权重,并降低被正确分类的样本权重。然后,权重更新过的样本集被用于训练下一个分类器Ck。整个训练过程如此迭代地进行下去。最后,把所有的分类器Ck线性组合起来。伪代码如下图所示。

    这个过程就像是做练习题,刚开始的时候对于所有题目一视同仁,一遍做完之后,对一下答案,把对的和错的分开,然后把错题转移到错题集去,下次做题的时候就不是对所有题目等同对待了,应该重点关注错题集,和错题集类似的题目应该引起更大关注,反复去做,对于简单的题目,可以简单带过。这样做了很多的题目之后,简单题目和易错题目都解决了。话说但年高考复习就是这样子做的。


    看了伪代码,可能还是云里雾里的,不要紧。下面有一个很好的具体例子来解释说明AdaBoost。

    首先,有正样本和负样本,分布如下图,图中,“+”和“-”分别表示正样本和负样本。显然,我们是无法直接用一条直线把两类分来的,最好的分割线,只能是曲线。在这个过程中,每次我们都使用最好的水平或者垂直的直线作为分类器,来进行分类。


    第一步:初始化权值,用垂直的的直线作为分类器。根据分类的正确率,得到一个新的样本分布D2­,一个子分类器h1。



      

    然后,这里的参数是怎么计算得来的呢?这里总共有10个样本,所以每一个的权值为0.1,从上图可以看出,有三个正样本(蓝色+)被错分类负样本了(红色-),根据所以误差为三个错误样本的权值之和,即ɛ1=(0.1+0.1+0.1)=0.3。而ɑ1 的计算是根据来算的,。然后,分错的样本权值要变大才行,下次分类要引起更多的关注。所以,进行权值更新。权值更新公式如下:


    正确分类的七个点,权值保持0.1不变,错误分类的三个点,权值为

    也就是说,现在的权值变成了7个0.1和3个0.233,如此迭代下去。


    第二步:根据新的权值,用垂直的的直线作为分类器。根据分类的正确率,得到一个新的样本分布D3­,一个子分类器h2。




    第三步:根据新的权值,用水平的的直线作为分类器。根据分类的正确率,得到一个新的样本分布D4­,一个子分类器h3。  

                        


    第四步:把所有子分类器线性组合起来。每一个的权值就是前面求出来的ɑ的值。

              


三、AdaBoost应用实例
      
    关于AdaBoost的应用,最为经典就是用于人脸识别的那两篇文章,现在也已经包含在opencv里面了,人脸识别的分类器文件opencv也带了。
    P. Viola and M. Jones.  Rapid object detection using a boosted cascade of simple features.
    R. Lienhart and J. Maydt.  An Extended Set of Haar-like Features for Rapid Object Detection.
    Paul Viola 和Miachael Jones等利用Adaboost算法构造了人脸检测器,称为Viola-Jones检测器,取得很好的效果。之后Rainer Lienhart和Jochen Maydt用对角特征,即Haar-like特征对检测器进行扩展。OpenCV中自带的人脸检测算法即基于此检测器,称为“Haar分类器”。
    用Adaboost对Haar特征进行分类,也取得了很好地效果。也因此,Boosting的方法在十年前又变得很火,出现了很多种变种的算法。

四、总结

    最后,总结一下。Adaboost是一种比较有特点的算法,可以总结如下:
  1)每次迭代改变的是样本的分布,而不是重复采样(reweight);
  2)样本分布的改变取决于样本是否被正确分类,总是分类正确的样本权值低,总是分类错误的样本权值高(通常是边界附近的样本);
  3)最终的结果是弱分类器的加权组合,权值表示该弱分类器的性能。


  简单来说,Adaboost有很多优点:
  1)adaboost是一种有很高精度的分类器
  2)可以使用各种方法构建子分类器,adaboost算法提供的是框架
  3)当使用简单分类器时,计算出的结果是可以理解的。而且弱分类器构造极其简单
  4)简单,不用做特征筛选
  5)不用担心overfitting!


参考:
http://www.cnblogs.com/luffylee/archive/2012/02/22/2363554.html
http://blog.csdn.net/xiaowei_cqu/article/details/7670703


   

 





你可能感兴趣的:(Machine,Learning)