xgboost原理

xgboost和gdbt

  • 在科学研究中,有种优化方法叫组合,将很多人的方法组合在一起做成一个集成的方法,集百家之长,效果一般就会比单个的好,这个方法就是集成学习。集成学习将弱学习算法通过组合提升为强学习算法。这要求每个弱学习方法要具有一定的准确性,并且之间具有差异性,即集成学习,关键在于各个弱分类器“好而不同”
  • 在众多的单模型中,决策树由于训练复杂度低,预测的过程比较迅速,模型解释性强,所以常常作为弱学习方法进行组合,但是决策树容易过拟合,这可以通过剪枝来解决。
  • 集成学习有很多方法,bagging方法和boosting方法。bagging方法中,基分类器之间无强依赖,可并行;boosting方法中,基分类器以前一个基分类器为基础,必须串行。
    1.从初始训练集中得到基分类器,根据表现,对训练样本的权重进行调整,使得分类错误的样本更受关注。重复学习t个分类器,t个分类器加权即为最终的分类器。
    2.对m个样本随机有放回抽样,得到t个训练集,每个训练集有m个样本,基于每个样本进行训练,对结果进行投票(分类)或者平均(回归)得到最终结果。未被采样的样本可用作验证集或者决策树辅助剪枝。

xgboost和gdbt都是boosting框架,最早的一种实现是由Friedman在论文GREEDY FUNCTION APPROXIMATION: A GRADIENT BOOSTING MACHINE。xgboost是在gbdt的基础上对boosting方法的改进,内部决策树使用的是回归树(regression tree),也叫做CART。
上面就是CART的例子。CART会把输入根据输入的属性分配到各个叶子节点,而每个叶子节点上面都会对应一个分数,通过分数将样本分类。
回归树如果使用平方损失函数,拟合的就是残差;对于一般的损失函数,拟合的就是残差的近似值。最后预测的结果是每棵树的结果相加。


xgboost算法原理知识

  1. 定义树的复杂度
    为了有效控制过拟合,需要衡量模型的复杂度(即模型的正则化项)。模型复杂度表示为Ω(ft): 方框部分对应xgboost参数中的lambda ,gamma
  2. xgboost中的boosting tree模型
    论文中给出了两种分裂节点的方法
    1) 贪心法:每一次都尝试对已有的叶子加入一个分割
    对于每次的扩展,我们需要枚举所有可能的分割方案,假设要枚举所有x小于a这样的条件 我们对于所有的a,只要做一次从左至右的扫描,枚举出所有分割的梯度GL和GR,然后按照上式计算出所有分割方案的分数即可。 观察目标函数Gain,可以发现引入分割并不一定会使情况变得更好,因为我们引入了一个加入新叶子结点的惩罚项。也就是说,这个惩罚项对应了树的剪枝,当引入分割带来的增益小于一个阈值时,我们可以抛弃这个分割。
    论文中的算法如下: 2) 近似方法
    近似方法通过特征的分布,按照百分比确定一组候选分裂点,通过遍历所有的候选分裂点来找到最佳分裂点。 两种策略:全局策略和局部策略。在全局策略中,对每一个特征确定一个全局的候选分裂点集合,就不再改变;而在局部策略中,每一次分裂 都要重选一次分裂点。前者需要较大的分裂集合,后者可以小一点。对比补充候选集策略与分裂点数目对模型的影响。 全局策略需要更细的分裂点才能和局部策略差不多。 主要应用于数据过大,不可直接计算的情况,论文中的算法如下: 3) Weighted Quantile Sketch
    陈天奇发明的可并行分裂树节点的方法 3.打分函数
    Obj表示当我们指定一个树的结构时,该树结构的优化程度。也称作结构分数(structure score)
    4.目标函数
    xgboost与gdbt比较大的不同就是目标函数的定义
    红色箭头所指向的l即为损失函数,红色方框为正则项(上文中介绍的模型复杂度Ω(ft)),包括L1和L2;红色圆圈为常数项。注意:xgboost利用泰勒公式展开三项作为函数近似,可以看到,最终的目标函数只依赖于每个数据点在误差函数上的一阶和二阶导数。
    可以对目标函数进行改写,其中l被定义为每个叶子上面样本集合,g为一阶导数,h为二阶导数 这个目标包含了T个相互独立的单变量二次函数,可以定义: 最终公式化简为: 通过对Wj求导等于0,可以得到: 然后将Wj最优解代入可得:

xgboost改进点总结

1、目标函数通过二阶泰勒展开式做近似
2、定义了树的复杂度,并应用到目标函数中
3、分裂结点处通过结构打分和分割损失动态生长
4、分裂结点的候选集合通过一种分布式Quantile Sketch得到
5、可以处理稀疏、缺失数据
6、可以通过特征的列采样防止过拟合


Ref: XGBoost: A Scalable Tree Boosting System https://yxzf.github.io/2017/03/xgboost-v1/ http://blog.csdn.net/a819825294/article/details/51206410 http://blog.csdn.net/a1b2c3d4123456/article/details/52849091