跳转至

14.6   梯度提升

随机森林让很多树并排投票。梯度提升换了一种合作方式:第一棵树先做一个粗预测,第二棵树专门修正第一棵的错误,第三棵再修正前两棵留下的错误。

就像小率写推荐方案:第一稿很粗,第二稿改漏掉的艺术类同学,第三稿再修正周末时间冲突。一步步补错,就是 梯度提升(Gradient Boosting) 的核心味道。

图 14.6.0 在咖啡店一轮轮修正活动方案

随机森林是很多树一起投票,梯度提升是按顺序接力改错?
对。一个是并行降方差,一个是串行降偏差。

14.6.1   从残差开始理解提升

回归任务里,先从一个简单预测开始,比如永远预测平均报名人数:

\[ F_0(\mathbf{x})=\bar y \]

第 1 棵树去拟合残差:

\[ r_i^{(1)}=y_i-F_0(\mathbf{x}_i) \]

然后更新模型:

\[ F_1(\mathbf{x})=F_0(\mathbf{x})+\eta h_1(\mathbf{x}) \]

\(h_1\) 是新树,\(\eta\) 是学习率(Learning Rate)。后面的树继续修正前面模型的残差。


14.6.2   梯度提升是在损失上走小步

更一般地,梯度提升每一步都沿着损失函数下降方向修正模型。模型是很多弱学习器的加和:

\[ F_M(\mathbf{x})=\sum_{m=0}^{M}\eta h_m(\mathbf{x}) \]

学习率 \(\eta\) 越小,每一步越谨慎,通常需要更多树。树太多或太深,会过拟合;所以梯度提升经常配合验证集早停。

参数 含义 常见影响
learning_rate 每棵树贡献多大 小一些更稳但树更多
n_estimators 树的数量 太多可能过拟合
max_depth 单树复杂度 越深越能拟合交互
subsample 每轮采样比例 小于 1 可增加随机性

14.6.3   为什么表格任务常用 GBDT

现代 GBDT 工具有 XGBoost、LightGBM、CatBoost。它们常在表格任务中很强,因为:

  • 能捕捉非线性和特征交互。
  • 对特征尺度不敏感。
  • 能处理缺失值或类别特征的变体较多。
  • 配合 SHAP 可以做较好的局部解释。
所以表格数据不一定要上深度学习,GBDT 常常已经很强。
没错。模型选择要看数据形态,不是越复杂越好。

14.6.4   用 sklearn 跑梯度提升

from sklearn.datasets import make_classification
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.model_selection import cross_val_score

X, y = make_classification(
    n_samples=1000,
    n_features=12,
    n_informative=8,
    random_state=2026,
)

model = HistGradientBoostingClassifier(
    learning_rate=0.05,
    max_iter=200,
    max_leaf_nodes=31,
    random_state=2026,
)

scores = cross_val_score(model, X, y, cv=5, scoring="roc_auc")
print(f"5 折 ROC-AUC = {scores.mean():.3f} ± {scores.std(ddof=1):.3f}")

别忘了早停和验证

梯度提升很强,也很容易在树太多、叶子太细、学习率不合适时过拟合。真实项目中要用验证集、交叉验证和早停控制复杂度。

小率的笔记本

梯度提升让树按顺序修正错误,是一种强大的加法模型。它在表格任务中常表现优秀,但需要控制学习率、树数量、叶子复杂度,并用验证集早停。