AdaBoost & AdaRank

1. AdaBoost

   

    实习了三个多月,把ML的算法都忘得差很少了,最近写论文用到了AdaBoost和AdaRank,这里从新复习总结了下,主要参考了:http://blog.csdn.net/haidao2009/article/details/7514787算法

    AdaBoost 是一种迭代算法,其核心思想是针对同一个训练集训练不一样的分类器,即弱分类器,而后把这些弱分类器集合起来,构造一个更强的最终分类器。(不少博客里说的三个臭皮匠胜过诸葛亮)网络

    算法自己是改变数据分布实现的,它根据每次训练集之中的每一个样本的分类是否正确,以及上次的整体分类的准确率,来肯定每一个样本的权值。将修改权值的新数据送给下层分类器进行训练,而后将每次训练获得的分类器融合起来,做为最后的决策分类器。完整的adaboost算法以下:框架

1335428125_1739

    

    下面咱们举一个简单的例子来看看adaboost的实现过程:学习

1

    图中,“+”和“-”分别表示两种类别,在这个过程当中,咱们使用水平或者垂直的直线做为分类器,来进行分类。.net

第一步:

2

    根据分类的正确率,获得一个新的样本分布D,一个子分类器h1 其中划圈的样本表示被分错的。在右边的途中,比较大的“+”表示对该样本作了加权。对象

   也许你对上面的ɛ1,ɑ1怎么算的也不是很理解。下面咱们算一下,不要嫌我啰嗦,我最开始就是这样思考的,只有本身把算法演算一遍,你才会真正的懂这个算法的核心,后面我会再次提到这个。算法最开始给了一个均匀分布 D 。因此h1 里的每一个点的值是0.1。ok,当划分后,有三个点划分错了,根据算法偏差表达式blog

12 获得 偏差为分错了的三个点的值之和,因此ɛ1=(0.1+0.1+0.1)=0.3,而ɑ1 根据表达式 的能够算出来为0.42. 而后就根据算法 把分错的点权值变大。如此迭代,最终完成adaboost算法。事务

 

第二步:

1    根据分类的正确率,获得一个新的样本分布D3,一个子分类器h2 get

 

第三步:

2

获得一个子分类器h博客

第四步:

整合全部子分类器:

5    所以能够获得整合的结果,从结果中看,及时简单的分类器,组合起来也能得到很好的分类效果,在例子中全部的。

 

关于若分类器:

    得到不一样若分类器的方式有以下几种:

  1. 不一样的弱学习算法获得不一样学习器的参数估计、非参数估计。
  2. 使用相同的若学习算法,但用不一样的参数,eg:K-Means的k,神经网络不一样的隐含层。
  3. 相同输入对象的不一样表示,不一样的表示能够凸显事务的不一样特征。

 

一些思考:

    到这里,也许你已经对adaboost算法有了大体的理解。可是也许你会有个问题,为何每次迭代都要把分错的点的权值变大呢?这样有什么好处呢?不这样不行吗? 这就是我当时的想法,为何呢?我看了好几篇介绍adaboost 的博客,都没有解答个人疑惑,也许大牛认为太简单了,不值一提,或者他们并无意识到这个问题而一笔带过了。而后我仔细一想,也许提升错误点可让后面的分类器权值更高。而后看了adaboost算法,和我最初的想法很接近,但不全是。 注意到算法最后的表到式为123,这里面的a 表示的权值,是由234 获得的。而a是关于偏差的表达式,到这里就能够获得比较清晰的答案了,全部的一切都指向了偏差。提升错误点的权值,当下一次分类器再次分错了这些点以后,会提升总体的错误率,这样就致使 a 变的很小,最终致使这个分类器在整个混合分类器的权值变低。也就是说,这个算法让优秀的分类器占总体的权值更高,而挫的分类器权值更低。这个就很符合常理了。到此,我认为对adaboost已经有了一个透彻的理解了。

 

总结:

咱们能够总结下adaboost算法的一些实际可使用的场景:

1)用于二分类或多分类的应用场景

2)用于作分类任务的baseline

无脑化,简单,不会overfitting,不用调分类器

3)用于特征选择(feature selection)

4)Boosting框架用于对badcase的修正

只须要增长新的分类器,不须要变更原有分类器

因为adaboost算法是一种实现简单,应用也很简单的算法。Adaboost算法经过组合弱分类器而获得强分类器,同时具备分类错误率上界随着训练增长而稳定降低,不会过拟合等的性质,应该说是一种很适合于在各类分类场景下应用的算法。

相关文章
相关标签/搜索