14.6 梯度提升¶
随机森林让很多树并排投票。梯度提升换了一种合作方式:第一棵树先做一个粗预测,第二棵树专门修正第一棵的错误,第三棵再修正前两棵留下的错误。
就像小率写推荐方案:第一稿很粗,第二稿改漏掉的艺术类同学,第三稿再修正周末时间冲突。一步步补错,就是 梯度提升(Gradient Boosting) 的核心味道。
随机森林是很多树一起投票,梯度提升是按顺序接力改错?
对。一个是并行降方差,一个是串行降偏差。
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}")
别忘了早停和验证
梯度提升很强,也很容易在树太多、叶子太细、学习率不合适时过拟合。真实项目中要用验证集、交叉验证和早停控制复杂度。
小率的笔记本
梯度提升让树按顺序修正错误,是一种强大的加法模型。它在表格任务中常表现优秀,但需要控制学习率、树数量、叶子复杂度,并用验证集早停。
