转自公众号 机器学习与大数据挖掘
本节继续深入决策树算法。前面花了两节详细介绍过决策树的核心内容,这对于理解更深入的随机森林与GBDT算法很重要。
随机森林与SVM应该来说被视为传统机器学习效果最好的两大算法,是值得每个机器学习从业者深入了解的,从最底层的原理到上层的应用,内部的每个核心细节等等。关于SVM的每个细节,先前的文章有介绍,文末也有参考链接。
回归正题,说完决策树,说说随机森林,我们知道决策树是单独的一棵树,是根据所有训练样本的所有特征维度通过重要性属性依次选择构造起来的一个树,通常还是二叉树,也就是一个节点只有左右两个分支。那么随机森林呢,也是有树结构,不同点在于,随机森林是由好多树相互独立并将结果组合起来的一种分类方法。
你可能会问,一组训练样本如果能产生很多决策树,那每个决策树不是一样的吗?如果说用同样的训练样本,同样的特征,理论上确实出来的决策树就是一样的,因此为了保证决策树不一样,随机森林想了个办法,大的原则就是保证进入训练的单棵决策树的样本不一样(包括样本数量,样本的特征维度,以及其他都可以影响训练模型不一样的因素)。
(1)从特征维度上不一样。如果用于训练的所有样本特征维度是一样的,通常得到的树结构就比较像,既然如此,弄成不一样的不就好了,具体操作上,对于不同的树,对原始样本随机选择一定的特征维度当成新的训练样本维度,其他的没被选择在这一棵树训练阶段丢掉。比如样本有0-9这10个不同维度的特征。那么决策树1随机选择5个维度,比如恰好选到了(0,1,4,5,7),而决策树2也随机选择5个,比如恰好是(2,3,7,8,9),依次类推决策树3,4,5等等。可想而之,因为属性维度的不同,构造出来的决策树不可能一样,从而保证了他们的差异性。
(2)从样本数量上的选择。同样,假设总共有100个训练样本,对于决策树1,随机挑50个样本去训练,决策树2也随机挑50个。因为训练样本的不同,那么即使你的特征属性相同,得到的决策树也不可能相同。为什么呢?想想我们上节谈到决策树构造的过程,样本数量决定着样本占比的概率,决定着信息熵的计算结果,自然决定着最终每个节点被选择的属性。更何况,他们的属性因为(1)的选择还不一样。
这是两类最广的构造随机森林的策略。上面我们说过,其实核心就是针对不同决策树构造训练样本的差异就好了,所以符合这个原则的都可以。
当很多决策树被构造出来以后,作为分类算法,那么一个样本的最终分类结果可以是这些很多决策树预测结果的平均值,或者投票值等等。对于回归算法,也是一样,可以是所有树的平均值。
这么来看,就可以理解随机森林为什么又是集成学习的典型算法,也是一种由弱分类器组合形成的强分类器的方法。单棵树不强,但是多棵树就非常强。单棵树只能覆盖部分属性,但是多棵树相互补充,就能覆盖全部特征,而且能有效避免单棵树用所有特征存在的过拟合问题。
集成学习里面还有一种弱分类器组合强分类器的方法,就是Boosting。相对于Boosting,随机森林的这种是Bagging。
Boosting是怎么做的呢?也是先用样本构造一个决策树1,然后用同一组样本继续训练,但是要注意,对于这一组样本的权重需要变一下,怎么变,由于我们得到决策树1,我们就可以计算出哪些样本被分类错了,把这些错的挑出来,加大他们训练的惩罚权重去训练决策树2,这样这些样本在决策树2种可能就不会被分错,但是有个问题,那就是在决策树1种分对的样本,因为权重的调整导致在决策树2中被分错,那么在决策树2上继续调整权重训练决策树3,依次类推。最终也能得到决策树1-n,然后把结果并起来作为最终的预测结果。
对比可以发现,都是集成学习,但是思路几乎完全不一样。
主要区别有:
(1)Bagging的树之间是完全独立训练的,无联系;Boosting树之间是有前后关系的,训练有联系;
(2)Bagging的样本可以随机选,Boosting不可以,自始自终固定,因为你要是随机选了,样本权重就没了,你把样本整没了还谈什么权重。
(3)训练的机制导致Bagging是并行化的,而Boosting是串行的。那么也许你也会想到,Bagging训练的速度就快些,而且对于大规模分布式训练来说,Bagging的优势就更大了。
Bagging与Boosting几乎是面试必考题,给大家一个思考题,这是以前面试的时候碰到的,请问这两者的训练机制谁是在调整方差,谁又是在调整偏差训练的?
回答这个问题首先理解下什么是方差,所谓方差,就是样本的平均值与所有样本之间的误差平方和这样的一个东西吧。而偏差呢?就是预测样本与实际样本的之间的误差吧,偏嘛,偏多少,偏差。所以你再来回答一下这个问题。
Bagging对应的是方差,Boosting对应的是偏差。Bagging在使得整体的分类偏差最小化,Boosting每次都在调整权重使得这一次的预测结果尽可能与实际接近,是偏差。
最后来总结一下,不同的方法碰到决策树以后就是不同的算法:
1)Bagging + 决策树= 随机森林
2)Boosting + 决策树= 提升树(adaboost等)
3)Gradient Boosting + 决策树= GBDT
4)Gradient Boosting优化改进+ 决策树= xgboost
关于adaboost算法,以前精讲过,参见更多阅读。
再简单介绍下Gradient Boosting,翻译就是梯度提升。所谓梯度,可以形象的理解为上面的样本权重,提升就是每次这个权重都在针对性的变,后面一个树结构一定是改进前一个决策树不能完成的分类样本的。
其实这么来看,就可以看到其实Boosting的针对性更强,因为它就是针对弱点进行改进的,改完了还有弱点继续改进,一直到几乎没有弱点。而Bagging,典型的随机森林,全是随机的,除了靠拼树的数量,没有其他办法了。从这个角度似乎解释了为什么牛逼的比赛,kaggle比赛,天池比赛等等,很多模型上的都是GBDT和xgboost,效果一定是比随机森林要好才会被使用的,但是性能嘛,像xgboost应该是优化了很多性能的,速度应该也还可以。但是依然可以预测,在数以亿计的海量数据面前,单从性能来讲,给你足够的机器,基于分布式的随机森林速度训练肯定是要比xgboost快的,这是他们的底层原理决定的。