前言
上一篇我们讲了GBDT,由陈天奇等人发明的XGBoost是GBDT的一种工程实现和改进, 在很多的kaggle比赛上效果都很好,也广泛应用于各大互联网公司
集成模型
XGBoost模型是学习K颗树,每棵树去拟合上一棵树学习的残差,预测结果是每一颗树预测结果的汇总
给定数据集D中有 n 条数据和 m 个特征:其中 F 使用回归树比如CART回归树, q(x) 表示将样本 x 分到某个叶子节点上, w 是叶子节点的分数, 所以 wq(x) 表示回归树对样本的预测值
如图:目标函数
XGBoost的目标函数由训练损失和正则项两部分组成,目标函数定义如下:T为叶子节点数, w为叶子节点的得分
如图:梯度提升
第 t 次迭代(生成树)后,模型的预测等于 t-1 次模型预测加上第 t 棵树的预测:
此时目标函数可以写作:
在该目标函数,把当前树ft作为增量部分,基于前 t-1 次的预测值y^(t-1)处做二阶的泰勒展开:
关于泰勒展开补充知识:
-
泰勒公式是将一个在 x = x0 处具有n阶导数的函数 f(x) 利用关于 (x-x0) 的n次多项式来逼近函数的方法
-
Gj :叶子结点 j 所包含样本的一阶偏导数累加之和,是一个常量
-
Hj :叶子结点 j 所包含样本的二阶偏导数累加之和,是一个常量
这个分数越小,代表着生成的这棵树结构越好
实例如图:树的分裂
XGBoost每棵树分裂看的是叶子节点分裂后的信息增益,即分裂后的左子树得分加上右子树得分减去分裂前的得分:这里有个问题在一个结点分裂时,可能有很多个分裂点,每个分裂点都会产生一个增益,如何才能寻找到最优的分裂点呢?论文中给出了两种分裂节点方法
1).贪心法
- 1.遍历每个结点的每个特征
- 2.对每个特征,按特征值大小将特征值排序
- 3.线性扫描,找出每个特征的最佳分裂特征值
- 4.在所有特征中找出最好的分裂点(分裂后增益最大的特征及特征值)
-
2).近似算法
主要针对数据太大,贪心法计算效率会很低或者根本无法计算时,对某个特征划分为m个分裂点集合,再计算每个分裂点信息增益,找到最大的得分
为什么要使用hi加权呢?
把目标函数整理成以下形式,可以看出hi有对loss有加权的作用与GBDT有哪些不同
- 1.GBDT是机器学习算法思想,XGBoost是该算法的工程实现
- 2.XGBoost加入了正则项防止过拟合的技术,来控制模型的复杂度,提高模型的泛化能力
- 3.GBDT在模型训练的时候只使用了代价函数的一阶导数信息, XGBoost对代价函数进行了二阶泰勒展开, 同时使用了一阶和二阶导数
- 4.在选择最佳分裂点,进行枚举的时候支持并行化
- 5.传统的GBDT在每轮迭代时使用全部的数据,XGBoost则采用了与随机 森林相似的策略,支持对数据进行采样
- 6.传统的GBDT没有设计对缺失值进行处理,XGBoost能够自动学习出缺 失值的处理策略
参考
- [1] Tianqi Chen.XGBoost: A Scalable Tree Boosting System
- [2] https://www.jianshu.com/p/1b45783add3c
- [3] https://baijiahao.baidu.com/s?id=1645723756242129387
- [4] https://www.jianshu.com/p/37963d5eb19f
- [5] https://blog.csdn.net/v_JULY_v/article/details/81410574
- [6] https://www.cnblogs.com/mantch/p/11164221.html
- [7] https://www.cnblogs.com/zongfa/p/9324684.html
网友评论