前面的博文中我们一起看了提升树,这一篇中我们正式来理解GBDT。理解GBDT算法关键是GB,也就是梯度提升(Gradient Boosting),那么这个和我们之前的提升树又有什么不一样呢?
梯度提升
之前介绍的提升树是用加法模型和向前分步算法实现学习的优化过程,其中误差函数也就是损失函数一般是平方损失和指数损失函数的时候,每一步优化比较简单,但是对于一般的损失函数来说,每一步优化就并不是那么容易。针对这个问题,梯度提升算法横空出世,其关键就是利用损失函数的负梯度在当前模型中的值:
首先之前讲的提升树和这里的GBDT其实是没有很大区别,GBDT也是加法模型也是向前分步的优化过程,如何加入下一棵树,都是建立在最小化误差的基础,GBDT不过是在最小化误差的的时候换了一个损失函数,它不是计算当前模型拟合训练样本的误差,而是计算这个误差函数的负梯度。比如在回归任务中,我们一般使用平方误差作为损失函数:,这个时候我们对求导数,得到:,这个导数应该是会求的,因为要求负梯度,所以取相反数得到:,这个式子是不是有点眼熟,最后的负梯度就是我们的残差。这是对于平方损失函数来说,对于一般的损失函数来说,这个式子就是残差的近似值。
我们看看梯度提升算法的步骤。
输入:训练数据集,,损失函数
输出:回归树。
1. 初始化:
估计使损失函数极小化的常数值,它是只有一个根节点的树。
2. 计算:
其中m=1,2,...,M表示总共树的棵数,i=1,2,...,N,表示样本个数。计算上面这个式子,我们可以得到每个样本的误差,得到残差表,这个可以看上一篇博文(提升树)中的示例,然后将这些残差数据作为训练集,拟合一个回归树(CART),得到第m棵回归树的叶子节点区域,关于CART树的算法可以看看李航的《统计学习方法》,个人觉得他的这本书讲的很透彻,我在百度云中分享了这本书,有兴趣的可以看看链接: https://pan.baidu.com/s/1T4NXx2e_JtSICh9rcmEoVg 提取码: ijsm,将这本书和西瓜书结合一起看。
3. 对于j=1,2,...,J,计算:
上面是最小化每个类别样本的误差。
4. 更新:
5. 最后得到回归树:
个人觉得梯度提升树(GBDT)和前面博客中说到的一般的提升树真的没什么太大区别,就是在计算残差的时候,那个损失函数是计算其负梯度,从这些步骤来看,其他没有什么很大的不一样。