zoukankan      html  css  js  c++  java
  • Adaboost 算法

    Adaboost 算法

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

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

    完整的adaboost算法如下

     

    简单来说,Adaboost有很多优点:

      1)adaboost是一种有很高精度的分类器

      2)可以使用各种方法构建子分类器,adaboost算法提供的是框架

      3)当使用简单分类器时,计算出的结果是可以理解的。而且弱分类器构造极其简单

      4)简单,不用做特征筛选

      5)不用担心overfitting!

     

    Adaboost 举例

    也许你看了上面的介绍或许还是对adaboost算法云里雾里的,没关系,百度大牛举了一个很简单的例子,你看了就会对这个算法整体上很清晰了。

     

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

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

      第一步:

      根据分类的正确率,得到一个新的样本分布D,一个子分类器h1

      其中划圈的样本表示被分错的。在右边的途中,比较大的“+”表示对该样本做了加权。

     

    也许你对上面的ɛ1,ɑ1怎么算的也不是很理解。下面我们算一下,不要嫌我啰嗦,我最开始就是这样思考的,只有自己把算法演算一遍,你才会真正的懂这个算法的核心,后面我会再次提到这个。

    算法最开始给了一个均匀分布 D 。所以h1 里的每个点的值是0.1。ok,当划分后,有三个点划分错了,根据算法误差表达式得到 误差为分错了的三个点的值之和,所以ɛ1=(0.1+0.1+0.1)=0.3,而ɑ1 根据表达式 的可以算出来为0.42. 然后就根据算法 把分错的点权值变大。如此迭代,最终完成adaboost算法。

      第二步:

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

      第三步:

      得到一个子分类器h3

      整合所有子分类器:

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

    Adaboost 疑惑和思考

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


     

    总结

     

      最后,我们可以总结下adaboost算法的一些实际可以使用的场景:

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

      2)用于做分类任务的baseline

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

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

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

      只需要增加新的分类器,不需要变动原有分类器

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

     

    转载:http://blog.csdn.net/sunboyiris/article/details/38318191

  • 相关阅读:
    [转载]四大Java EE容器
    [转载]javaEE规范和SSH三大框架到底有什么关系
    javaee包含的服务和组件
    Java类文件最大限制
    oracle给字段添加描述
    apache commons工具包
    redis教程
    git学习
    编程人物
    程序员必须了解的5大编程准则
  • 原文地址:https://www.cnblogs.com/hdu-2010/p/4387453.html
Copyright © 2011-2022 走看看