关于Adaboost的一些理解
2017-02-05 19:06
465 查看
近段时间一直在学习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
原文链接: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
相关文章推荐
- 关于内核中spinlock的一些个人理解
- 关于VLAN的一些理解(图文并茂,推荐新手阅读)续1
- 关于SAX,DOM,JAXP,JDOM,DOM4J的一些理解
- 关于异常的一些理解
- 关于java反射的一些理解
- 关于编码的一些认识和理解(Kemin原创)
- java String 类的一些理解 关于==、equals、null
- 关于多重继承的一些理解
- 对关于字符驱动的一些重要数据结构(file_operations, file, inode, cdev)的理解
- 关于java包装类的一些理解
- 关于VLAN的一些理解(图文并茂,推荐新手阅读)续2
- 关于SAX,DOM,JAXP,JDOM,DOM4J的一些理解
- 关于“代数结构(algebraic structure)”的一些原创性的理解。
- 关于unicode、utf8、utf16、gb2312和GBK的一些理解
- 关于委托的一些理解
- 关于VLAN的一些理解(图文并茂,推荐新手阅读)
- 关于bitmap的一些理解
- 关于最新出台的政策的一些理解
- 关于SAX,DOM,JAXP,JDOM,DOM4J的一些理解
- C++中关于const的一些理解 (原作于08年11月20日)