集成学习之梯度提升树(GBDT)
$GBDT$ 也是集成学习 $Boosting$ 家族的成员,但是却和传统的 $Adaboost$ 有很大的不同。回顾下 $Adaboost$,我们是利用前一轮迭代弱学习器的误差率
来更新训练集的权重,这样一轮轮的迭代下去。$GBDT$ 也是迭代,使用了前向分布算法,但是弱学习器限定了只能使用 $CART$ 回归树模型,同时迭代
思路和 $Adaboost$ 也有所不同。
提升树
提升树模型是以分类树或回归树为基本分类器的提升方法,这里限定了只能采用决策树模型,采用其它模型就不能称为树了。
这个模型也是采用加法模型(即基函数的线性组合)与前向分步算法。先来通俗解释一下它的过程。假设有样本集如下:
$$\left \{(x_{1},y_{1}),(x_{2},y_{2}),...,(x_{n},y_{n})\right \}$$
首先用决策树模型 $f_{0}(x) = T_{0}(x)$ 去拟合这些数据,使得这批样本的平方损失函数 $\sum_{i = 0}^{n}\left ( y_{i} - f_{0}(x_{i}) \right )^{2}$ 最小,但是发现虽然模型的拟合效果很好,但仍
然有一些差距。比如预测值 $f_{0}(x_{1}) = 0.8$,而真实值 $y_{1}=0.9$, $f_{0}(x_{2})=1.4$, $y_{2}=1.3$ 等等。现在不允许更改原来模型 $f_{0}(x)$ 的参数,有什么办法
进一步来提高模型的拟合能力呢?
既然不能更改原来模型的参数,那么意味着必须在原来模型的基础之上做改善,直观的做法就是建立一个新的模型 $T_{1}(x)$ 来拟合 $f_{0}(x)$ 未完全拟合真实
样本的残差,即 $y - f_{0}(x)$,所以对于新的模型 $T_{1}(x)$来说,拟合的样本集就变成了:
$$\left ( x_{1}, y_{1} - f_{0}(x_{1}) \right ), \; \left ( x_{2}, y_{2} - f_{0}(x_{2}) \right ), \cdots , \left ( x_{n}, y_{n} - f_{0}(x_{n}) \right )$$
拟合出模型 $T_{1}$ 后,我们便得到了更接近原始样本的函数:$f_{1}(x) = f_{0}(x) + T_{1}(x)$。之后可以继续训练新 $T_{2}(x)$ 模型拟合残差 $y - f_{1}(x)$......
提升树算法步骤如下:
1)初始化 $f_{0}(x) = 0$。
2)对 $m = 1,2,...,M$,重复以下操作得到 $M$ 个学习器:
a. 计算残差:
$$r_{mi} = y_{i} - f_{m-1}(x_{i}), \; i = 1,2,\cdots,n$$
b. 拟合残差 $r_{mi}$ 学习一个回归树,得到 $T_{m}(x)$。
c. 更新 $f_{m}(x) = f_{m-1}(x) + T_{m}(x)$
3)得到回归问题提升树:
$$f_{M}(x) = \sum_{m = 1}^{M}T_{m}(x)$$
为什么训练的下一个模型 $T_{m}$ 去拟合的样本是残差呢?
其实不一定。提升树是一个加性模型,我们希望这个模型在训练集上的经验误差最小,即
$$\min \sum_{i = 1}^{n}L \left ( y_{i}, f(x_{i}) \right ) \; \Leftrightarrow \; \min \sum_{i = 1}^{n}L \left ( y_{i}, \sum_{m = 1}^{M}T_{m}(x_{i}) \right )$$
通常这是一个复杂的优化问题。前向分步算法求解这一优化问题的思想就是:因为最终模型是一个加性模型,如果能从前往后,每一步只学习一个基本
学习器 $T_{m}(x)$,不断迭代得到最终的模型,那么就可以简化问题复杂度。具体的,当我们经过 $m-1$ 轮迭代得到了最优模型 $f_{m-1}(x)$时,因为
$$f_{m}(x) = f_{m - 1}(x) + T_{m}(x)$$
优化目标就为
$$\min \sum_{i = 1}^{n}L\left ( y_{i}, f_{m - 1}(x_{i}) + T_{m}(x_{i}) \right )$$
当采用平方损失函数的时候
$$L\left ( y_{i}, f_{m - 1}(x_{i}) + T_{m}(x_{i}) \right ) = \left [\; y_{i} - f_{m - 1}(x_{i}) - T_{m}(x_{i}) \; \right ]^{2} = \left [\; r_{mi} - T_{m}(x_{i}) \; \right ]^{2}$$
也就是说,当误差函数采用平方损失的时候,$T_{m}$ 拟合的就是残差,当然也可能存在其它误差函数,使得模型拟合的不是残差。
提升树模型特指拟合的是残差的情形,这一点从算法步骤中可以看出,也就是说提升树只针对那些包含残差项的损失函数。
梯度提升树
对于一般的回归树,采用平方误差损失函数,这时根据前向分布每次只需要达到最优化,就能保证整体上的优化。由于平方误差的特殊性,可以推导
出每次需要拟合的就是残差(真实值-预测值),而对于其他损失函数,每次拟合的就不知道是什么东西了,推导过程也可能很复杂,将提升树算法进
行改进,提出一种适用于任意损失函数的模型。设损失函数为
$$L(y,f(x))$$
将 $f(x)$ 看成一个参数,为了使 $L$ 损失函数最小,采用梯度下降的方法即:
$$f_{m}(x) = f_{m - 1}(x) - \eta \frac{dL}{df(x)}$$
又因为
$$f_{m}(x) = f_{m - 1}(x) + T_{m}(x)$$
所以有
$$T_{m}(x) = - \eta \frac{dL}{df(x)}$$
左边为预测值,右边为真实值,所以整个过程就变成了每次拟合损失函数的负梯度的值。可以将这种方法看成一般损失函数的情况,而平方损失是特
殊的情况(平方损失函数的导数就是残差),所以提升树其实就是梯度提升树的特例。