摘要
本文主要分享了 决策树、随机森林、GBDT、XGBoost 四种模型的原理
决策树
决策树模型 ID3/C4.5/CART算法比较 :
https://www.cnblogs.com/wxquare/p/5379970.html
http://leijun00.github.io/2014/09/decision-tree/
http://blog.csdn.net/baimafujinji/article/details/51724371
对于决策树,李航老师在《统计学习方法》里有详细的解释
分为ID3, C4.5, CART三个基本的树生成算法
ID3 是一个多叉树,使用了熵作为信息增益,不能处理连续值,而且有偏向性,倾向于选择类别较多的特征,因为IG相对偏大
C4.5 是一个多叉树,使用了熵计算信息增益比,信息增益比进行子节点分裂,对类别较多的特征进行惩罚
CART是一棵二叉树,对分类和回归都适用,对于回归树用平方误差最小化,对分类树用基尼指数进行特征选择。分类时和ID3、C4.5类似;回归时会遍历变量j, 对固定的切分变量扫描切分点s,计算MSE,选择使得MSE最小的(j,s)对。
CART之所以使用Gini指数是因为熵需要计算log,速度较慢
随机森林(Bagging进化版)
RF使用了CART决策树作为弱学习器,并行的训练出多棵互相独立的树,最后通过投票得出结果
- RF有两个随机采样过程:
- 行采样:采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本
- 列采样: 从M个feature中,选择m个(m << M)
通过样本的随机采样和特征的随机采样,RF的鲁棒性非常好
传统Boosting 与 GradientBoost
梯度提升树(GBDT)原理小结:
https://www.cnblogs.com/pinard/p/6140514.html
原始的Boost算法是在算法开始的时候,为每一个样本赋上一个权重值,初始的时候,大家都是一样重要的。
在每一步训练中得到的模型,会使得数据点的估计有对有错,我们就在每一步结束后,增加分错的点的权重,减少分对的点的权重,这样使得某些点如果老是被分错,那么就会被“严重关注”,也就被赋上一个很高的权重。
然后等进行了N次迭代(由用户指定),将会得到N个简单的分类器(basic learner),然后我们将它们组合起来(比如说可以对它们进行加权、或者让它们进行投票等),得到一个最终的模型
而Gradient Boost与传统的Boost的区别是,每一次的计算是为了减少上一次的残差(residual),而为了消除残差,我们可以在残差减少的梯度(Gradient)方向上建立一个新的模型。
GBDT每一步都通过上一时刻的输出加上当前时刻的负梯度来得到一个Loss更小的强模型。对于回归而言,就直接是算梯度就行,对于分类而言,需要Logistics变换
XGBoost
论文: https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf
Slide : https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf
总结:http://blog.csdn.net/sb19931201/article/details/52557382
根据GBDT的原理,为了在每次迭代中找到负梯度ft(xi),我们需要通过求导得到负梯度
然而XGB不通过求导,而是通过将损失函数(MSE或Logistics)进行泰勒展开,得到一次和二次导数项,得到当前时间步的梯度值。问题转化为如何使得当前梯度值最大,目标函数变为一次、二次导数之和
然后就要开始建树了,建树的目标是使得当前梯度最大
为了防止过拟合,在当前目标函数(一次、二次导数之和)的基础上加入了正则项,包括叶节点个数和对叶节点得分score的L2正则
The Structure Score 这个score你可以理解成类似于信息增益的一个指标,在切分点查找算法中用到
切分点查找算法(贪心算法) ,需要扫描所有排序过的特征的得分,得出最优切分点
最后通过缩减因子(类似学习率),减小本次迭代中变化的幅度,防止过拟合, 通过这种方式来减小每棵树的影响力,给后面的树提供空间去优化模型
全过程如下: