提升树引入
提升树相当于提升方法在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