0.前言
本文仅仅是自己的学习总结,好记性不如烂笔头,相信对你也会有一些启发吧,可能会与其他博客有很多相似的地方,如若侵权,立删。
1.提升树
在讲GBDT之前,首先要讲一下提升树(Boosting Tree),提升树是以分类树或回归树为基本分类器的提升方法,实际采用的是加法模型和前向分布算法。针对分类和回归的不同问题,主要区别在于回归问题使用平方误差损失函数,分类问题使用指数损失函数。对于二分类问题,提升树只需把AdaBoost算法中的基本分类器限制为二类分类树即可,是AdaBoost算法的特殊情况。在这里主要讨论回归问题的提升树。
回归问题的提升树算法流程:
输入:训练数据集
输出:提升树
(1):初始化
(2):
(a): 计算残差:
(b):拟合残差学习一个回归树,得到。
(c):更新
(3): 得到的回归问题提升树:
附:以上算法流程来自《李航统计学习方法》
上述伪代码中为啥要计算残差:
对于第m棵树,是在给定的情况下,求解,求解的目标是使损失函数的值最小,从而可得:
当采用平方误差损失函数时,
由可知,上式可变换为:
这里可以让:
则损失函数可变换成:
为了降低损失值,则第 棵树 拟合当前的残差 就可以了,这个树每个叶子节点输出的值就是落到每个叶子节点的残差值的均值。
以上就是提升树的理论。
2.GBDT算法理论
提升树利用加法模型和前向分布算法实现学习的优化过程,通过前面的提升树可知,提升树通过残差就可以解决回归问题,这不是挺好的吗?为什么又提出GBDT呢,其实准确地说:提升树应该是GBDT在取平方误差损失函数时候的一个特例,GBDT拟合的不再是残差,而是负梯度,当损失函数是平方误差时,负梯度就是残差,但为其他损失函数时,就不能认为是残差了,GBDT思想不再局限于损失函数为何物!下面细说。
GBDT思想:
GBDT第 棵树需要拟合的负梯度公式如下:
先不考虑GBDT的算法流程,咱们先想想为啥去拟合负梯度:
无论什么模型,我们最终的目标是使损失函数值不断的降低。了解过梯度下降法的可以想到,损失函数的负梯度就是函数下降最快的方向:
上式可以通过泰勒一阶展开式证明负梯度是函数下降最快的方向:
首先数学上的泰勒展开式如下:
对于函数 , 通过泰勒一阶展开可得:
则优化函数使其递减,则:
通过以上思想,应用到GBDT中:
因为GBDT的目标也是让损失函数值逐步降低,当然可以用损失函数的负梯度了,GBDT是如何推导的呢?
GBDT的损失函数,通过泰勒一阶展开式得到结果如下:
则优化损失函数 使其递减,可以使:
所以GBDT的第 棵树通过拟合损失函数的负梯度去降低损失值,好像和GBDT的负梯度差一个。如果使用的损失函数使平方误差损失函数,那么它的负梯度其实就是残差,所以得到本节开头的结论:提升树是GBDT在损失函数取平方误差时的一个特例。
GBDT的算法流程:
(1)初始化学习器:
(2)对
(a)对,计算
(b)对 拟合一个回归树,得到第棵树的叶子节点区域,
(c)对,每个叶子节点的拟合值为:
(d)更新:
其中 取1或者0
(3)最终的GBDT的模型:
额,就写到这里吧,完结撒花。