GBDT这个名字非常有深意:G-gradient(表示该算法是基于梯度的),B-Boosting(表示该算法是boosting模型),DT-decision tree(表示算法内部使用的是决策树)
1 梯度与残差
在RF、Adaboost等加法模型中,都是通过直接拟合真实值来构建模型的,而在GBDT里面(下面这句话是重点,认真理解,并且多读几遍):非首轮迭代的模型拟合的目标值不再是真实值,而是一个梯度值,主要是通过拟合损失函数的负梯度值在当前模型的值来构建模型。其梯度值表达式如下:
r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{mi} = -\left [ \frac{\partial L(y_{i},f(x_{i}))}{\partial f(x_{i})}\right ]_{f(x) = f_{m-1}(x)} rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
当损失函数为平方损失的时候,损失函数可以表示为:
L ( y i , f ( x i ) ) = 1 2 ( y i − f ( x i ) ) 2 L(y_{i},f(x_{i})) = \frac{1}{2} (y_{i} - f(x_{i}))^{2} L(yi,f(xi))=21(yi−f(xi))2
此时当前模型下损失函数的负梯度值正好等于残差: r m i = y i − f ( x i ) r_{mi} = y_{i} - f(x_{i}) rmi=yi−f(xi)
2 原理剖析(回归问题)
2.1 算法流程
在2001年的论文《Greedy function approximation: A gradient boosting machine》(有时间可以仔细推敲,很不错,包括二分类/回归、多分类/回归情况)中,介绍了梯度提升的基本思想,本文仅仅摘录了论文gradient boosting思想部分(如果想要全面了解GBDT,还请读者移步到原始paper中),梯度提升的算法流程如下:
算法解析:
- 第1行初始化模型,估计损失函数极小化的常数值;
- 第2行迭代的训练M个子模型;
- 第3-6行为子模型的训练细节,
- 首先第3行是计算损失函数 L ( y i , F ( x i ) ) L(y_{i},F(x_{i})) L(yi,F(xi))在当前模型 F ( x i ) F(x_{i})