梯度提升树

梯度提升树(Gradient Boosting Trees, GBT 或 GBDT) 是一种强大的机器学习算法,广泛应用于回归、分类等任务中。它结合了多个决策树的预测结果,以构建一个更强的模型。

简单理解

梯度提升树的核心思想是:

逐步构建多个弱学习器(通常是决策树),每一棵新树都试图纠正之前所有树预测的残差(错误)。

工作流程概览

  1. 初始化模型:先用一个简单的模型(通常是常数)作为初始预测值。
  2. 计算残差:残差 = 真实值 − 当前预测值。
  3. 拟合残差:训练一棵新的决策树来拟合残差(即学习错误)。
  4. 更新模型:将这棵新树的输出加权后加入到原模型中。
  5. 重复步骤 2-4:不断迭代,直到达到指定的树数量或误差收敛。

数学形式

假设你想拟合目标函数 \(y = f(x)\),GBDT 做法是:

  1. 初始化模型:

    \[ F0(x)=arg⁡min⁡c∑iL(yi,c)F_0(x) = \arg\min_c \sum_i L(y_i, c) \]

  2. 对第 \(m\) 次迭代:

    • 计算残差(负梯度):

      \[ rim=−[∂L(yi,F(xi))∂F(xi)]F=Fm−1r_{im} = -\left[\frac{\partial L(y_i, F(x_i))}{\partial F(x_i)}\right]_{F=F_{m-1}} \]

    • 拟合残差 \(r_{im}\),训练一棵新树 \(h_m(x)\)

    • 更新模型:

      \[ Fm(x)=Fm−1(x)+ν⋅hm(x)F_m(x) = F_{m-1}(x) + \nu \cdot h_m(x) \]

      其中 \(\nu \in (0, 1)\) 是学习率。

特点

优点 缺点
精度高 训练慢
可处理非线性特征 不适合太多特征的稀疏数据(比如文本)
可调节性强(树深、学习率等) 可能过拟合,需要调参

常用实现工具

  • XGBoost:高效、支持正则化
  • LightGBM:微软出品,速度更快,内存更省
  • CatBoost:对类别特征处理更好
  • scikit-learn 也提供了 GBDT 的基础版本 GradientBoostingClassifierGradientBoostingRegressor

常见应用

  • 信用评分、风控模型
  • 销售预测
  • 用户行为预测
  • Kaggle 竞赛夺冠常客

拟合残差的具体内容

梯度提升树(GBT/GBDT) 中,第 3 步“拟合残差” 是算法的核心所在。这一步的本质是用一棵新的决策树来逼近当前模型的预测误差,从而改进整个模型。

什么是“残差”?

假设我们已经有了一个当前模型 \(F_{m-1}(x)\),它给出每个输入 \(x_i\) 的预测值。但它并不是完全准确的,所以我们定义:

\[ \text{残差 } r_i = y_i - F_{m-1}(x_i) \]

这个残差表示当前模型对第 \(i\) 个样本的预测错误。

步骤 3:拟合残差是做什么?

我们要用一棵新的决策树 \(h_m(x)\)学习这些残差。换句话说,新树的目标是:

“你来学学我哪里错了,下一次你帮我改正。”

举个简单例子

假设我们用决策树来预测房价。

  • 当前模型预测了房价是 $300,000。
  • 实际房价是 $320,000。
  • 残差 = 真实值 − 预测值 = $20,000。

现在我们训练一棵新树,它的目标是预测这个 “$20,000”。这棵树被加入到模型中,从而让下一轮的预测更接近真实值。

数学更进一步(以平方误差为例)

在平方损失(L2)下:

\[ L(y_i, F(x_i)) = \frac{1}{2}(y_i - F(x_i))^2 \]

计算负梯度(残差):

\[ r_i = -\frac{\partial L}{\partial F(x_i)} = y_i - F(x_i) \]

也就是说,残差就是目标值减去当前模型预测值。在这一轮,我们训练一个新树 \(h_m(x)\) 来“拟合”这些 \(r_i\)

最终的模型更新

模型更新如下:

\[ F_m(x) = F_{m-1}(x) + \nu \cdot h_m(x) \]

其中 \(\nu\) 是学习率(防止一步走太猛),一般取 0.01 ~ 0.1。

拟合残差的意义

  1. 误差导向优化:每次拟合的是“做错了什么”。
  2. 提高精度:后续的树逐步修正前面的错误。
  3. 适应性强:残差是动态变化的,不断调整模型方向。