XGBoost算法挺复杂的,要多读几遍论文,梳理算法思路。本文希望有助于理解这个算法。
0x01、XGBoost简介
XGBoost即 Extreme Gradient Boosting,极端梯度提升,或者叫极值梯度提升。XGBoost所应用的算法就是GBDT的改进,既可用于分类也可用于回归问题中。作为GBDT的高效实现,XGBoost是一个上限特别高的算法。
1、XGBoost与GBDT的比较
XGBoost算法 | GBDT算法 |
|
---|---|---|
基分类器 | 使用CART回归树作为基分类器,还支持线性的基学习器。 | 使用CART树作为基分类器 |
结点分类方法 | 依据影响Loss的程度来确定连续特征的切分值 | 使用基尼指数 |
损失函数 | 使用了二阶泰勒展开,有利于梯度下降得更快更准确 | 只用到一阶导数 |
防止过拟合 | 在代价函数里加入了正则项用于控制模型复杂度,降低了过拟合的可能性 | 无正则项,可能出现过拟合 |
模型实现 | 在训练之前预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,可以大大减少计算量。 能够实现在特征粒度的并行。 |
串行,不支持并行 |
2、XGBoost的优缺点
优点:速度快,效果好,能处理大规模数据,支持多种基学习器,支持自定义损失函数等;
缺点:算法参数过多,调参复杂,不适合处理超高维特征数据。
0x02、XGBoost的模型和框架
1、XGBoost的模型
(回归树)给定一个包含N 个样本,M 个特征的数据集 ,集成模型的预测输出表示为:
其中, 表示回归树,
为回归树的数量。整个公式表示给定一个输入
,输出值为
棵回归树的预测值相加。
2、XGBoost算法的基本框架
输入:训练数据集 ,最大迭代次数 T,损失函数 L,正则化系数
,
;
输出:强学习器 。
对迭代轮数 :
(1)计算一阶二阶导:计算第 i 个样本()在当前轮的损失函数 L 基于
的一阶导数
,二阶导数
,并计算所有样本的一阶导数和
,二阶导数和
;
(2)基于当前结点尝试分裂决策树,默认分数 score=0, 和
为当前需要分裂的结点的一阶二阶导数之和,
对特征序号 :
a. 先将左子树的一阶二阶导数和均置为零:,