基本是网上的资料。
一、起源
boost 算法系列的起源来自于PAC Learnability(PAC 可学习性)。这套理论主要研究的是什么时候一个问题是可被学习的,当然也会探讨针对可学习的问题的具体的学习算法。这套理论是由Valiant提出来的,也因此(还有其他贡献哈)他获得了2010年的图灵奖。
PAC 定义了学习算法的强弱
弱学习算法---识别错误率小于1/2(即准确率仅比随机猜测略高的学习算法)
强学习算法---识别准确率很高并能在多项式时间内完成的学习算法
同时 ,Valiant和 Kearns首次提出了 PAC学习模型中弱学习算法和强学习算法的等价性问题,即任意给定仅比随机猜测略好的弱学习算法 ,是否可以将其提升为强学习算法 ? 如果二者等价 ,那么只需找到一个比随机猜测略好的弱学习算法就可以将其提升为强学习算法 ,而不必寻找很难获得的强学习算法。 也就是这种猜测,让无数牛人去设计算法来验证PAC理论的正确性。
不过很长一段时间都没有一个切实可行的办法来实现这个理想。细节决定成败,再好的理论也需要有效的算法来执行。终于功夫不负有心人, Schapire在1996年提出一个有效的算法真正实现了这个夙愿,它的名字叫AdaBoost。AdaBoost把多个不同的决策树用一种非随机的方式组合起来,表现出惊人的性能!第一,把决策树的准确率大大提高,可以与SVM媲美。第二,速度快,且基本不用调参数。第三,几乎不Overfitting。我估计当时Breiman和Friedman肯定高兴坏了,因为眼看着他们提出的CART正在被SVM比下去的时候,AdaBoost让决策树起死回生!Breiman情不自禁地在他的论文里赞扬AdaBoost是最好的现货方法(off-the-shelf,即“拿下了就可以用”的意思)。
二、Adaboost算法
AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写,由Yoav Freund和Robert Schapire在1995年提出。Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这 Adaboost 些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。其算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。使用adaboost分类器可以排除一些不必要的训练数据特徵,并将关键放在关键的训练数据上面。
AdaBoost 是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器,即弱分类器,然后把这些弱分类器集合起来,构造一个更强的最终分类器。(很多博客里说的三个臭皮匠赛过诸葛亮)
算法本身是改变数据分布实现的,它根据每次训练集之中的每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改权值的新数据送给下层分类器进行训练,然后将每次训练得到的分类器融合起来,作为最后的决策分类器。
整个Adaboost 迭代算法就3步:
- 初始化训练数据的权值分布。如果有N个样本,则每一个训练样本最开始时都被赋予相同的权重:1/N。
- 训练弱分类器。具体训练过程中,如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它的权重就被降低;相反,如果某个样本点没有被准确地分类,那么它的权重就得到提高。然后,权重更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。
- 将各个训练得到的弱分类器组合成强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。
三、具体例子解释Adaboost运行流程
也许你看了上面的介绍或许还是对adaboost算法云里雾里的,没关系,百度大牛举了一个很简单的例子,你看了就会对这个算法整体上很清晰了。
下面我们举一个简单的例子来看看adaboost的实现过程:
图中,“+”和“-”分别表示两种类别,在这个过程中,我们使用水平或者垂直的直线作为分类器,来进行分类。
最终结果如果是1说明是”+“,如果是-1则说明“-”。
第一步:
根据分类的正确率,得到一个新的样本分布D2,一个子分类器h1
其中划圈的样本表示被分错的。在右边的图中,比较大的“+”表示对该样本做了加权。
【ε和α的计算】
1) 开始的时候均匀分布,10个点:m=10,权值D1(i)=1/m=1/10=0.1;
2)误差ε等于被错误分类的点的权值之和:0.1+0.1+0.1=0.3
3)α依据公式计算得0.42
4)更新权值,错误点权值加大:exp(-αt * yi * ht(xi)),当yi ≠ ht(xi)时,说明真实的y和假设h不一致,假设出错,进行了错误分类,也就是y=1而h=-1等情况,则乘exp(αt)增大权值;如果归类正确,通过乘以exp(-αt)减小权值。那么,
被错误分类的三个“+”:0.1*(e^0.42)=0.152
被正确分类的“+”和“-”:0.1*[e^(-0.42)]=0.066
由于是分布,权值和为1,进行归一:错误点0.152/0.152*3+0.066*7≈0.17; 正确点0.066/0.152*3+0.066*7=0.07。
检验一下:0.17*3+0.07*7=1
第二步:
根据分类的正确率,得到一个新的样本分布D3,一个子分类器h2
【ε和α的计算】
此时权值:2个0.07的“+”,2个0.07的“-”,3个0.17的“+”,3个被分错的0.07的“-” 。
被错误分类的三个点上一轮是正确点,权值为0.07,因此新的误差ε2=0.07*3=0.21
α算出得0.65。
---------------- 更新权值并归一:(e^0.65=1.91554 ; e^-0.65=0.522)-------------
错分点:3个 0.07*1.91554=0.134
正确点:4个 0.07*0.522=0.03654 ;3个 0.17*0.522=0.08874
归一:3*0.134+4*0.03654+3*0.08874=0.81438
0.134/0.81438=0.1645; 3个-
0.03654/0.81438=0.044868; 4个 2+ 2-
0.08874/0.81438=0.108966; 3个+
检验:0.1645*3+0.044868*4+0.108966*3=0.99987≈1
第三步:
得到一个子分类器h3。
【ε和α的计算】
ε=0.044868*3=0.1346≈0.14
α计算得0.92
整合所有子分类器:
因此可以得到整合的结果,从结果中看,及时简单的分类器,组合起来也能获得很好的分类效果,在例子中所有的。
到这里,也许你已经对adaboost算法有了大致的理解。但是也许你会有个问题,为什么每次迭代都要把分错的点的权值变大呢?这样有什么好处呢?不这样不行吗?
然后看了adaboost算法。 注意到算法最后的表到式为,这里面的a 表示的权值,是由得到的。而a是关于误差的表达式,到这里就可以得到比较清晰的答案了,所有的一切都指向了误差。提高错误点的权值,当下一次分类器再次分错了这些点之后,会提高整体的错误率(因为错分点的权值加重,再错的话就会被加进误差里面去),这样就导致 a 变的很小,最终导致这个分类器在整个混合分类器的权值变低。也就是说,这个算法让优秀的分类器占整体的权值更高,而挫的分类器权值更低。这个就很符合常理了。到此,我认为对adaboost已经有了一个透彻的理解了。
四、关于α的取值证明和ε的分析见《Boosting Methods for AutomaticSegmentation of Focal Liver Lesions》第二章,很精妙。
五、未看完的文章:http://blog.csdn.net/tiandijun/article/details/48036025