关于Adaboost的一些理解

来源:互联网 发布:mac连不上手机热点 编辑:程序博客网 时间:2024/05/14 17:35

    近段时间一直在学习spark 2.0框架,一个任务就是在spark下实现adaboost + logisticRegression的组合分类器,即利用逻辑回归作为adaboost的底层分类器,利用adaboost提升逻辑回归的性能。总所周知,当程序能完全在内存中运行时,spark的运行速度是hadoop的100倍;当程序需要借助磁盘运行时,spark的速度是hadoop的10倍。然而,作为机器学习的新玩家,spark作为一个开源框架还是有自己的缺点,个人觉得spark算法更新的速度远远达不到需求,一些经典的机器学习算法并没有在spark中得到实现,如adaboost。由于本渣渣刚接触spark,对scala的用法了解甚少,并未自己实现adaboost算法,用的是github上开源代码,链接如下:https://github.com/BaiGang/spark_multiboost。这个是一位新浪员工在2014年写的,adaboost的底层框架是实现了,但是此代码存在一些致命的问题。

原文链接:http://blog.csdn.net/a1015553840/article/details/54882398

    前前后后研究了此代码三个周,反复在理论上进行推敲(主要是研究李航的《统计学习方法》),在代码上进行琢磨(研究代码,与sklearn的实现进行比较),以下是本人的一些见解:

    对于adaboost的一些基础知识可见:http://blog.csdn.net/webzjuyujun/article/details/49888719

    1.此项目为我们提供了adaboost底层的实现框架,这个框架是可用了,让我们不用从头开发。但是,底层分类器用逻辑回归时候,并没有把样本权重传入分类器中。事实上,经过调查,spark下逻辑回归分类器支持带权重的样本时还是源于2015年的一次更新,而此项目是2014年完成的,所以它不可能支持带权重的样本。由于底层分类器不支持每个样本的权重,那么adaboost的 “对错误样本增加权重,对正确样本减小权重,在新的权重上训练新的子分类器” 这套理论就不成立了。后面经过阅读spark原码,spark在1.6版本以后就支持带权重的逻辑回归了,我们只要把对应的权重设置进去就可以了。


    2.出现的第二个重要问题是:adaboot+ 逻辑回归 这个组合进行样本训练时,每个子分类器(底层逻辑回归分类器)的权重相差很大,即:第一个子分类器权重很高,后面所有分类器的权重加起来还没第一个高,那么当进行分类器组合时,其他分类器是完全没效果的(如:我训练了10个子分类器,他们的权重分布为1.1,0.4,0.1,0.08,0.03,0.01,0.005,0.001,0.0003,0.0001,第一个分类器权重比其他所有分类器权重之和都大,其他分类器失去意义)。此项目的主要实现过程都是参照李航的《统计学习方法》这本书 ,实现也是规规矩矩参照其中的算法进行实现,但为什么会出现这种情况呢?这个问题困扰了博主很久,后经过leader指点,阅读了sklearn的adaboost源码,发现它与《统计学习方法》还有一些区别。《统计学习方法》中,当进行权重更新时,会依据公式增加错分样本的权重值,同时减小正确分类样本的权重值,并对新权重进行归一化;然而,在sklearn的实现中,并没有减小正确样本的权重值,只是增加了错误样本的权重是,并对新权重进行归一化。于是博主按照scikit-learn的方法对代码进行了修改,子分类器的权重alpah不再出现差异过大的情况。


    3.修改完善代码后,用分类器在样本上跑。当只使用逻辑回归时,分类准确率为0.7825左右。博主以逻辑回归作为底层分类器,训练了10个底层分类器的adaboost分类器,发现分类准确率大约在0.7875左右,只是提高了0.5%。


    猜想:

    1.查找了很多论文,发现基本上没有人用过adaboost+logisticRegression这个组合。博主手动计算过一些例子,发现这个组合的决策线总是在正负样本决策边界上来回跳动,分类准确率并未得到提升。博主认为这可能与逻辑回归时一个线性分类器有关,adaboost可能不适合采用线性分类器作为底层分类器。为了验证这个猜想,博主在scikit learn上利用逻辑回归作为底层分类器训练了adaboost,发现提升效果与spark下无异(基本上对逻辑回归没有提升)!

    2.boosting类算法用的比较成功的就是GBDT这个算法。它也是boost算法的延伸,但是底层分类器用的是决策树(每个子分类器层数很低)。决策树是一个非线性分类模型,它与boosting算法对这样的分类器的分类效果有很大的提升。

    3.提升算法可能对logistic regression没有很好的提升效果(要是有,应该早就有人做了),但是对决策树有良好的提升(GBDT的广泛使用)。在实现算法融合时,一定要注意算法之间的相互影响,有些算法可能属性相冲,组合起来反而效果不佳!


原文链接:http://blog.csdn.net/a1015553840/article/details/54882398


1 0