梯度提升树
梯度提升树(Gradient Boosting Trees, GBT 或 GBDT) 是一种强大的机器学习算法,广泛应用于回归、分类等任务中。它结合了多个决策树的预测结果,以构建一个更强的模型。
简单理解
梯度提升树的核心思想是:
逐步构建多个弱学习器(通常是决策树),每一棵新树都试图纠正之前所有树预测的残差(错误)。
工作流程概览
- 初始化模型:先用一个简单的模型(通常是常数)作为初始预测值。
- 计算残差:残差 = 真实值 − 当前预测值。
- 拟合残差:训练一棵新的决策树来拟合残差(即学习错误)。
- 更新模型:将这棵新树的输出加权后加入到原模型中。
- 重复步骤 2-4:不断迭代,直到达到指定的树数量或误差收敛。
数学形式
假设你想拟合目标函数 \(y = f(x)\),GBDT 做法是:
初始化模型:
\[ F0(x)=argminc∑iL(yi,c)F_0(x) = \arg\min_c \sum_i L(y_i, c) \]
对第 \(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 的基础版本GradientBoostingClassifier
和GradientBoostingRegressor
常见应用
- 信用评分、风控模型
- 销售预测
- 用户行为预测
- 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。
拟合残差的意义
- 误差导向优化:每次拟合的是“做错了什么”。
- 提高精度:后续的树逐步修正前面的错误。
- 适应性强:残差是动态变化的,不断调整模型方向。