GBDT 梯度提升树

提升树引入

提升树相当于提升方法在CART上的应用。
平常我们讲的提升树就是GBDT (Gradient Boosting Decision Tree),它是通过拟合损失函数的负梯度值在当前模型的值来实现提升的。注意这里我们不是拟合真实值,而是拟合梯度值,只是梯度跟真实值是有关系的。为什么?请往下看。

GBDT有分类和回归两个方向的应用,本文主要介绍GBDT 回归提升树

关于函数梯度

GBDT的提升是加法模型,它不是定义一个固定结构的函数,然后通过样本拟合更新它的参数。它是函数本身的累加:。所以如果要更快逼近最后的函数,我们就需要在正确的方向上变化,这个“正确的方向”当然就是损失函数减少最快的方向。所以我们需要用损失函数对函数求导,求得的导数,就是接下来需要弥补的方向。这时候用一个函数能去拟合刚才求得的导数,那么函数就可以更新为了。

导数值跟损失函数的选择有关系。如果选择平方损失误差,那么它的导数就是:

令人惊喜的是这正是真实值和估计值之间的残差。 BTW,上面之所以用了是为了计算方便,常数项并不会影响平方损失误差,以及残差的比较。

下面我们介绍的就是基于平方损失误差(也就是基于残差弥补)的GBDT回归实例。

用实例讲解GBDT

有以下数据需要用回归,并要求平方损失误差小于0.2时,可以停止建树:

第一棵树

1) 遍历各个切分点s=1.5,2.5,…,9.5找到平方损失误差最小值的切分点:

比如s=1.5,分割成了两个子集:

通过公式求平方损失误差

而其中为各自子集的平均值时,可以使得每个子集的平方损失误差最小。

求平均值为:,进而求得平方损失误差为

同样的方法求得其它切分点的平方损失误差,列表入下:

可见,当s=6.5时, 为所有切分点里平方损失误差最小的

2) 选择切分点s=6.5构建第一颗回归树,各分支数值使用

第一轮过后,我们提升树为:

3) 求提升树拟合数据的残差和平方损失误差:

提升树拟合数据的残差计算:

各个点的计算结果:

提升树拟合数据的平方损失误差计算:

大于0.2,则还需要继续建树。

第二棵树

4) 确定需要拟合的训练数据为上一棵树的残差:

5) 遍历各个切分点s=1.5,2.5,…,9.5找到平方损失误差最小值的切分点:

同样的方法求得其它切分点的平方损失误差,列表入下:

可见,当s=3.5时, 为所有切分点里平方损失误差最小的

6) 选择切分点s=3.5构建第二颗回归树,各分支数值使用

第二轮过后,我们提升树为:

7) 求提升树拟合数据的残差和平方损失误差:

提升树拟合数据的残差计算:

各个点的计算结果,同时对比初始值和上一颗树的残差:

可以看见,随着树的增多,残差一直在减少。

到目前为止,提升树拟合数据的平方损失误差计算:

多说一句,这里是从全局提升树的角度去计算损失,其实和上面第5)步中从最后一颗树的角度去计算损失,结果是一样的

目前损失大于0.2的阈值,还需要继续建树





第六棵树

到第六颗树的时候,我们已经累计获得了:

  

  

此时提升树为:

此时用拟合训练数据的平方损失误差为:

平方损失误差小于0.2的阈值,停止建树。

为我们最终所求的提升树。

以上。

参考

https://blog.csdn.net/qq_22238533/article/details/79199605
http://docs.salford-systems.com/GreedyFuncApproxSS.pdf