GBDT和XgBoost

GBDT和XgBoost的区别

首先,GBDT来自于融合模型中的Boosting算法,Boosting算法的原理是先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,提高训练数据集中判断错误的样本权重,降低判断正确的权重,使得先前基学习器做错的样本在后续能得到更多关注,然后基于调整后的样本分布来训练下一个基学习器,使下一轮的基学习器能纠正之前学习器的一些错误。

顺便提一下融合模型中的Bagging算法,它是基于自助采样法,每次有放回地随机从训练集中取出一个样本放入采样集,重复n此后(假设有n个样本),若n足够大,样本不被放到采样集中的概率是1/e,则采样集中的不同样本大约占总样本的63.2%。剩下的36.8%的样本还可以作为验证集对泛化性能进行估计。这样可以采样出T各含有n个样本的采样集,训练得到T个基学习器,再将它们进行结合。结合方式是,对于分类任务采用简单投票法,对回归任务使用平均法。

随机森林是Bagging的一个扩展变体,在Bagging算法采用数模型作为基学习器的基础上,在建立基学习器的时候,还采用了随机的属性选择。使得基学习器的多样性不仅包含了样本扰动的来源,还有属性扰动。使泛化性能通过基学习器之间的差异度增加而进一步提升。

 

以决策树为基函数的提升方法,称为提升树。如果提升树用作分类任务,那么就是AdaBoost的特殊情况,只要把基学习器设定为cart分类树即可。而对于回归任务,提升树的做法是,每次用以前的基学习器的组合训练结果和真实数据之间的残差来训练一个新的基学习器。由于损失函数的复杂性,使得对于有的损失函数,最大的残差并不一定是优化的最好方向。因此提出使用损失函数在当前模型的负梯度值来作为残差的近似值。并用该近似值来获得训练下一个基学习器。

利用负梯度代替残差的本质就是利用了损失函数的梯度下降法,相对于直接使用残差,优点是:

  1. 负梯度的方向可证,模型优化下去可以保证收敛;
  2. 对某些损失函数,最大残差方向并不是下降最好方向。损失函数最小和残差最小二者不统一;
  3. 梯度下降方法使我们可以对一些不能直接最小化的模型进行优化。

 

XgBoost方法利用了损失函数的一阶和二阶信息,从而构建残差近似。如果从优化的角度讲,XgBoost和GBDT最大的不同在于:

GBDT:采用数值优化的思维,利用最速下降法取求解loss function的最优解,其中用cart决策树去拟合负梯度,用牛顿法求步长;

XgBoost:用解析的思维,对loss function展开到二阶近似,求得解析解,将解析解带入损失函数得到损失函数最优质Gain,并用这个Gain值作为下一个树模型的增益score来指导建立决策树,使loss function达到最优。

 

另外,XgBoost还:

弱分类器除了支持cart还支持lr和linear;

加入了正则项,用于控制模型的复杂度;

借鉴了随机森林的做法,支持列抽样(属性抽样);

支持不同的损失函数,条件是损失函数一、二阶可导;

……

上一篇:Machine Learning Mastery 博客文章翻译:XGBoost


下一篇:XGBoost中参数调整的完整指南(包含Python中的代码)