原文来自大神级的论文
XGBoost: A Scalable Tree Boosting System
,论文很全面,框架介绍很完整,但是在某些tricks上面并没有对细节做详细解说,而需要读者亲自去进行一定的推导,这使得阅读起来稍显吃力,当然基础很雄厚的大牛级别的应该不以为然,但我相信还有很多与我一样入行不久的,那么这篇博客就是你的所需。
这里特别感谢作者
meihao5
的博文,其分享的内容就是我一直想要整理但迟迟未进行的,它的原文可见最后面的参考文章链接里。
-
-
greedy function approximation: a gradient boosting machine
中提出GBDT。
-
其模型F定义为加法模型:
其中,x 为输入样本, h 为分类回归树,w 是分类回归树的参数,$\alpha$ 是每个树的权重。
-
通过最小化损失函数求解最优模型:
NP难问题 -> 通过贪心算法,迭代求局部最优解。
计算流程表示如下:
输入:$(x_i, y_i), T, L$
-
初始化$f_0$
-
for t=1 to T do
2.1 计算响应:
$\tilde y_i = -[\frac{\partial L(y_i, F(x_i))}{\partial F(x_i)}]_{F(x) = F_{t-1}(x)}, i = 1,2,\cdots,N$
2.2 学习第t棵树:
$w^
= \mathop{\arg\min}\limits_{w} \sum_{i=1}^N(\tilde y_i - h_t(x_i;w))^2$
2.3 line search 找步长(前向分步算法):
$\rho^
= \mathop{\arg\min}\limits_{\rho} \sum_{i=1}^N L(y_i,F_{t-1}(x_i) + \rho h_t(x_i;w^
))$
2.4 令$f_t = \rho^
h_t(x;w^*)$,更新模型:
$F_t = F_{t-1} + f_t$
-
输出$F_T$
根据上述流程,类比梯度下降,自然有一些梯度提升的感觉,一个是优化参数空间,一个是优化函数空间。
2.1 计算残差(计算值域真实值之间的误差)
2.2 拟合是的残差最小(当前学习的这棵树)
2.3 $\rho$步长:基于学习器的权重, H树:表示方向
2.4 得到当前这一步的树
一句话总结:新树模型的引入是为了减少上个树的残差,即前面模型未能拟合的剩余信息。我们可以在残差减少的梯度方向上建立这么一个新模型。对比提升树来说,提升树没有基学习器参数权重$\rho$。
以前面的均方损失为例,也是可以用这个方法来解释的。为了求导方便,我们在均方损失函数前乘上一个1/2:
注意到$F(x_i)$其实只是一些数字而已,我们可以将其像变量一样进行求导:
而前面所说的残差就是上式相反数,即
负梯度
:
随着T的增大我们的模型的训练误差会越来越小,如果无限迭代下去,理想情况下训练误差就会收敛到一个极小值,相应的会收敛到一个极小值点* P 。这是不是有种似曾相似的感觉,想一想在凸优化里面梯度下降法(参数空间的优化),是不是很像?我们就把F(x)看成是在 N 维空间中的一个一个的点,而损失函数就是这个N 维空间中的一个函数(函数空间的优化),我们要用某种逐步逼近的算法来求解损失函数的极小值(最小值)。