BianC的日常

  • 首页
  • 机器学习
  • 摄影作品
  • 算法拾遗
  • 热爱生活
海的一边
分享科研与生活
  1. 首页
  2. 机器学习
  3. 正文

树们-ensemble

2021-07-05 337点热度 1人点赞 0条评论

Decision tree被广泛应用于分类、回归任务中,树有着强大的拟合能力,只要一棵DT的层数够深,就能够no error拟合任何训练集,当然,如果这棵树的深度太深,那不可避难地带来overfitting的问题。训练集上的no error,在测试集上肯定直接凉凉。所以,如果以决策树为基本的预测模型,一棵深树拟合能力很强,从训练集上看是一个强分类器,但泛化性能很菜(bias小,方差大);一棵浅树必然拟合能力很弱鸡,是一个弱分类器(方差小,bias大)。如何取长补短、博采众长呢?那就是ensemble,木林森。

ensemble方法分为三种:bagging、boosting和stack。基础DT模型如果很深很强,那么可以通过bagging的方法强强结合,并尽量增强泛化性能;基础模型如果都非常弱鸡,准确率比50%高不了多少,那么可以通过boosting的方法,让弱鸡们进行互补,三个臭皮匠,一个只会数学一个只会语文一个只会英语,但结合起来其实可以考第一。stack往往是用在已经有了一堆各式各样的基础模型之后,想着物尽其用,是驴是马都拉出来跑一跑,所以构建一个新的分类器,比如logistics regression,或者简单的神经网络,把所有的模型的输出当作它的输入,拿validation训练一遍,这样每个模型相当于都有了一个投票的权重,在测试时可能会得到好的效果。

具体来讲,bagging的基本做法是:把训练集shuffle,从中取出一部分作为新的训练集1,再shuffle 取出训练集2,……,多整几轮shuffle,训练集就变成了overlap较小的训练集1,2,3,...。在每一个子训练集上训练一个强分类器(允许稍微有点overfitting,bias小)--DT,最后把这些所有的DT放一起投个票,或者取个平均,就是最后的泛化性能好一些的牛逼分类器。需要注意的一点是,bagging这个方法只限于bag强分类器,拿再多弱分类器bagging也牛逼不起来。因为它的目标是尽量减小variance,而不是提升accuracy。当然,如果variance减小了,在测试集上的accuracy必然会比原先过拟合的DT要强得多,所以表现出来效果变好也不奇怪。最出名的bagging方法的例子就是Random Forests,它之所以牛逼,当然不仅仅是对训练集做了shuffle和划分,它在此基础上还在每次划分的时候强行划分了特征。也就是说这些子训练集在训练DT的时候,用的特征是不一样的。如此一来泛化性能max,RF yyds。

boosting的基本方法是:训练好一个DT-$f_1(x)$(可以比较弱,bias大、variance小)之后,它肯定在某些样本上表现不好,这个时候训练一个$f_2(x)$,如果这个$f_2(x)$在$f_1(x)$表现不好的数据上能够表现得比较好,那么二者联手,就能在全样本上比较出色,而且可以再多找几个$f_3(x)$、$f_4(x)...$,术业有专攻。那么训练好一个$f_1(x)$之后,怎么找$f_2(x)$呢?以一个比较典型的Boosting方法AdaBoost为例,它通过re-weight的方法对样本进行重新取样。上面的bagging是通过re-sample(也就是每次shuffle之后取一些出来)来划分数据的,Adaboost这里使用的始终是训练集全集。但是它会认为每个样本都有各自的一个权重。一开始的时候所有数据的权重都是1 ,训练完之后让$f_1(x)$在训练集上测试一遍,可能准确率是70%。这个时候我们强行调整每个样本的权重,让$f_1(x)$分对了的样本权重小一些,$f_1(x)$分错了的样本权重大一些,以这些权重来加权$f_1(x)$的分类结果,那么必然它的准确率被加权后会变低,而且Adaboost通过调整权重变大变小的量,让它的准确率变成正好50%。下一步,把这些权重乘在$f_2(x)$的loss function上,$f_2(x)$就会努力提高在高权重样本($f_1(x)$分错的样本)上的拟合性能。如此反复,就能够得到多个$f(x)$,它们每一个都在优化上一个$f(x)$的残差。按照这个逻辑来看,弱的分类器确实能够发挥人头优势,变成强分类器;同时,按照这个逻辑,这些分类器$f(x)$是按顺序一个一个训练出来的,而bagging的RF是并行训练好的,那么Boost其实在生成树这个方面的效率比较低。boosting方法里最出名的应该就是GBDT(Gradient Boosing Decision Tree)。它把上面说到的“权重大一些”、“权重小一些”这件事变成了一个learning rate,把$f(x)$当成优化的参数(这我也没细看,可能之后写一篇GBDT的文章),从而通过梯度下降的方法去找下一个$f_{t+1}(x)$。而GBDT的牛逼工程实现版本,就是耳熟能详的由XG老师提出的XGBoost了。X是extreme的意思,充分表现了它在并行化(对特征计算并行化,树的生成依然不是并行的)、鲁棒性、准确率上的提升。它的损失函数据说是相比于GBDT多了一个正则化,约束树的复杂度,而且把$f(x)$泰勒展开成二阶,精度更高。

stack就不细说了,第二段说得很明白了。

总结一下,强强联手bagging,菜菜互助boosting,乱组一发stack。之所以ensemble广泛用于各种树,是因为树可强可弱的特点(深树bias小,variance大;浅树bias大,variance小)使其能很可控得分别用于bagging、boosting。也就是说,ensemble,就是树民的胜利!

标签: 暂无
最后更新:2021-07-05

superbianc

弱水三千,只取一瓢

点赞
< 上一篇

COPYRIGHT © 2022 海的一边. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

京ICP备2021021901号-1