Ng机器学习系列补充:6、集成学习算法AdaBoost(Adaptive Boosting)

来源:互联网 发布:openwrt 串口编程 编辑:程序博客网 时间:2024/04/29 01:26

    机器学习补充系列国际权威的学术组织the IEEE International Conference on Data Mining (ICDM,国际数据哇局会议) 2006年12月评选出了数据挖掘领域的十大经典算法:C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, and CART,它们在数据挖掘领域都产生了极为深远的影响,这里对他们做一个简单介绍,仅作为对Ng机器学习教程的补充。

    由于k-Means、SVM、EM、kNN、Naive Bayes在Ng的系列教程中都有涉及,所以此系列教程只涉及决策树算法C4.5、关联规则算法Apriori、网页排名算法PageRank、集成学习算法AdaBoost(Adaptive Boosting,自适应推进)、分类与回归树算法CART(Classification and Regression Trees);另外会加上对神经网络的BP算法介绍,后续也会考虑介绍遗传算法等内容。


1)AdaBoost算法起源

2)AdaBoost算法详解

3)AdaBoost算法实例展示

4)AdaBoost算法相关讨论

5)AdaBoost算法在人脸识别中的应用



1)AdaBoost算法起源

   boost 算法系列来自于PAC Learnability(PAC 可学习性)。这套理论主要研究的是什么时候一个问题是可被学习的,当然也会探讨针对可学习的问题的具体的学习算法。PAC 定义了学习算法的强弱:弱学习算法---识别错误率小于1/2(即准确率仅比随机猜测略高的学习算法),强学习算法---识别准确率很高并能在多项式时间内完成的学习算法。

    PAC学习模型中,弱学习算法和强学习算法是等价的,等价是说,对于任意给定仅比随机猜测略好的弱学习算法,可以将其提升为强学习算法,而不必直接寻找很难获得的强学习算法。然而,这个看似简单的结论其实经过很多大牛的长时间努力才得到的,引用《统计学习那些事》中的一段话:

    不过很长一段时间都没有一个切实可行的办法来实现这个理想。细节决定成败,再好的理论也需要有效的算法来执行。终于功夫不负有心人, Schapire在1996年提出一个有效的算法真正实现了这个夙愿,它的名字叫AdaBoost。AdaBoost把多个不同的决策树用一种非随机的方式组合起来,表现出惊人的性能!第一,把决策树的准确率大大提高,可以与SVM媲美。第二,速度快,且基本不用调参数。第三,几乎不Overfitting。我估计当时Breiman和Friedman肯定高兴坏了,因为眼看着他们提出的CART正在被SVM比下去的时候,AdaBoost让决策树起死回生!Breiman情不自禁地在他的论文里赞扬AdaBoost是最好的现货方法(off-the-shelf,即“拿下了就可以用”的意思)。

    Boosting算法的发展历史略过,参考:http://blog.csdn.net/haidao2009/article/details/7514787

2)AdaBoost算法详解

    AdaBoost 是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器,即弱分类器,然后把这些弱分类器集合起来,构造一个更强的最终分类器。

    算法本身是改变数据分布实现的,它根据每次训练集之中的每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改权值后的新数据送给下一次训练时的分类器进行训练,然后将每次训练得到的分类器融合起来,作为最后的决策分类器。

    Adaboost的主要框架可以描述为:

(a)循环迭代多次

更新样本分布

寻找当前分布下的最优弱分类器

计算弱分类器误差率

(b)聚合多次训练的弱分类器

    完整的AdaBoost算法如下:

3)AdaBoost算法实例展示

初始数据如下图,“+”和“-”分别表示两种类别,在这个过程中,我们使用水平或者垂直的直线作为分类器进行分类:

第一次迭代(t=1)后,得到一个子分类器h1和新的样本分布D,如下图:

ɛ1,ɑ1的计算过程如下:算法最开始给了一个均匀分布 D ,所以h1 里的每个点的值是0.1。当划分后,有三个点划分错了,根据算法第4步,得到误差为分错了的三个点的值之和,所以ɛ1=(0.1+0.1+0.1)=0.3,根据算法第6步,得到ɑ1为0.42。根据算法第7步,分对的点权值变小,把分错的点权值变大,但保证权值和为1。

第二次迭代(t=2)后,得到一个子分类器h2和新的样本分布D,如下图:

第三次迭代(t=3)后,得到一个子分类器h3,如下图:

最后整合所有子分类器得到如下结果:

从整合的结果看,即使是简单的分类器,组合起来也能获得很好的分类效果。

4)AdaBoost算法相关讨论

    先讨论一下,为什么每次迭代都要把分错的点的权值变大(相应的把分对的点的权值减小)呢?这样有什么好处呢?不这样不行吗?注意到算法最后的表到式为,这里面的ɑt表示权值,是由得到的,而ɑ是关于误差的表达式,到这里就可以得到比较清晰的答案了,所有的一切都指向了误差。提高错误点的权值,当下一次分类器再次分错了这些点之后,会提高整体的错误率ɛɑ随着ɛ的提高而减小,这样就导致ɑ变的很小,最终导致这个分类器在最终整合分类器的权值变低。也就是说,这个算法让优秀的分类器占整体的权值更高,而“水”的分类器权值更低。这个就很符合常理了。到此,对AdaBoost算法算是有了一个较清楚的认识了。

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

    当然,不是每一种算法天生就是完美的,AdaBoost算法也存在许多的问题,比如,临界样本使得训练的“退化问题”加剧、数据不平衡问题、误分类样本权值偏高的问题、训练速度与检测效果的均衡、差样本因多次分类而造成权值过大的问题等等。对这些问题,学者们也提出了多种解决方案,他们对于AdaBoost算法的改进主要集中在三个方面:1、调整权值更新方法,以达到提升分类器性能,减缓退化等效果;2、改进AdaBoost的训练方法,使AdaBoost方法能更高效地进行拓展;3、结合其他算法和一些额外信息而产生的新算法,达到提高精确度的目的。

5)AdaBoost算法在人脸识别中的应用

    目前的AdaBoost算法就是Boosting算法的代表,Boosting算法为其他算法提供了一种框架结构,而其他算法只在其中作为子分类器,因此Boosting算法可以运用在许多方面的实践上,尤其是在机器学习中。 如今通过Boosting算法,我们实现了手写体字符识别,运用到了许多输入设备上,如流行的触屏手机上的手写输入、笔记本电脑的手写输入、扫描仪扫面文字转化为电子文档。我们实现了图像识别,如人脸识别、google上的图片检索功能(很方便地找到我想要的清晰度更高的图片)。我们实现了语音识别,现在的WIN7上都有了一个语音识别的功能,我们能够让计算机知道我们说了什么话,并通过机器自动学习提高语音识别的精度,声音输入和声控很可能在未来普及。当然Boosting算法还能做文本分类和医疗诊断等等。

    目前,实际中应用的人脸检测方法多为基于AdaBoost学习算法的方法,这种检测方法最初在2001年由Paul Viola和Michael Jones提出,并由英特尔公司的Rainer Lienhart对这一方法进行了改善。Viola Jones人脸检测方法是一种基于积分图、级联检测器和AdaBoost算法的方法,方法框架可以分为以下三大部分:

    a)使用Harr-like特征表示人脸,使用“积分图”实现特征数值的快速计算;也就是在一个20*20 的图片提取一些简单的特征(称为Harr特征),特征如图:

    它的计算方法就是将白色区域内的像素和减去黑色区域,因此在人脸与非人脸图片的相同位置上,值的大小是不一样的,这些特征可以用来区分人脸和非人脸。通过对矩形区域黑色和白色像素的计算可以识别出,前两个图为人脸,而最后一个图为非人脸:

    b)使用数千张切割好的人脸图片,和上万张背景图片作为训练样本。训练图片一般归一化到20*20的大小。在这样大小的图片中,可供使用的haar特征数在 1万个左右,使用AdaBoost算法挑选出一些最能代表人脸的矩形特征(分类),按照加权投票的方式将弱分类器构造为一个强分类器。

    c)将训练得到的若干强分类器串联组成一个级联结构的层叠分类器,级联结构能有效地提高分类器的检测速度。




参考:

http://blog.csdn.net/haidao2009/article/details/7514787

http://blog.sina.com.cn/s/blog_65c8baf901016o44.html

http://blog.sina.com.cn/s/blog_65c8baf9010172it.html

http://blog.sina.com.cn/s/blog_65c8baf901016ude.html

0 0
原创粉丝点击