数学原理
本章目标
- 理解 GBDT 的加法模型结构——
棵树按学习率加权累加,逐步逼近真实函数。 - 理解梯度提升的核心思想——每棵新树拟合前
棵树的负梯度(残差方向)。 - 理解学习率(shrinkage)的数学作用——控制每步更新幅度,防止过拟合。
- 理解为什么 GBDT 使用浅层决策树(
max_depth=3)——弱学习器是偏差缩减的前提。
重点方法与概念速览
| 名称 | 类型 | 作用 |
|---|---|---|
| 加法模型 | 模型结构 | |
| 梯度提升 | 训练策略 | 第 |
| 学习率收缩 | 正则化 | |
| 对数损失 | 损失函数 | 多分类的交叉熵损失—— |
| 随机梯度提升 | 采样策略 | subsample < 1.0 时每棵树只使用部分样本——引入随机性增强泛化 |
1. 加法模型
GBDT 的核心是一个加法模型——
其中:
是 轮迭代后的集成模型输出 是第 棵决策树(当前为浅层树, max_depth=3)是学习率( learning_rate=0.1)是第 棵树的参数(分裂点、叶节点值等)
理解重点
- 加法模型意味着每棵树直接与前序所有树的输出相加——不是投票,不是平均,是累加。
- 学习率
控制每棵树的贡献幅度—— 意味着每棵树只贡献其完整输出的 10%。 - 与 Bagging 的对比:Bagging 是
(等权平均),GBDT 是 (学习率加权累加)。
2. 梯度提升——在函数空间做梯度下降
GBDT 的训练策略可以理解为在函数空间中执行梯度下降。
前向分步算法
GBDT 以贪心方式逐棵添加树。第
负梯度——"残差"的方向
直接求解上述优化问题很困难。GBDT 的巧妙之处在于——将损失函数
这
理解重点
- 负梯度指向损失函数下降最快的方向——GBDT 在函数空间中向这个方向迈出步长
。 - 对回归任务(平方损失),负梯度恰好等于残差
——这也是"拟合残差"这一直觉说法的来源。 - 对分类任务(对数损失),负梯度是"伪残差"——不是简单的
,而是损失对 log-odds 的导数。 - 这就是为什么 GBDT 的核心是降偏差——每棵新树专门修正前序集成犯的错误。
3. 对数损失(多分类)
当前 GBDT 处理的是 3 分类问题(
其中
理解重点
- 多分类 GBDT 内部实际上训练了
组树——每组对应一个类别(one-vs-rest 风格,但共享梯度结构)。 GradientBoostingClassifier使用loss='log_loss'(默认)——即多分类对数损失。- 负梯度的形式取决于损失函数的选择——对数损失的负梯度是
,即"真实概率 - 预测概率"。
4. 学习率收缩(Shrinkage)
学习率 learning_rate)是 GBDT 最重要的正则化参数:
理解重点
越小,每棵树的影响越小——需要更多的树(更大的 )才能达到相同的拟合程度。 - 经验上,小
+ 大 的组合泛化效果更好——这就是为什么当前源码 n_estimators=200搭配learning_rate=0.1。 与 存在权衡: 可能需要 棵树, 可能 就过拟合。 - 与 Bagging 的对比:Bagging 没有学习率——每棵树等权投票,不需要缩放。
5. 随机梯度提升(Stochastic GBDT)
当 subsample < 1.0 时,每棵树只在随机抽取的部分训练样本上拟合——这被称为随机梯度提升:
理解重点
subsample < 1.0同时在两个方面起作用:降低计算量、增加模型多样性(类似 Bagging 的 Bootstrap 思路)。- 当前源码
subsample=1.0(默认值)——不使用随机梯度提升。设置为0.8可获得额外的方差缩减效果。 - 与 Bagging 的
max_samples对比:Bagging 的每个子集完全独立且并行,GBDT 的子集是串行的——第棵树看到的数据子集不影响第 棵树所见。
6. GBDT 与 Bagging 的数学对比
| 维度 | Bagging | GBDT |
|---|---|---|
| 模型结构 | ||
| 训练方式 | 并行—— | 串行——第 |
| 核心目标 | 降方差—— | 降偏差—— |
| 基学习器 | 强学习器(完全生长树,低偏差高方差) | 弱学习器(浅层树 max_depth=3,高偏差低方差) |
| 核心参数 | n_estimators、max_samples | n_estimators、learning_rate、max_depth |
| 正则化 | 并行平均天然正则化 | 学习率收缩 + 树深度限制 + subsample |
| 过拟合风险 | 低——投票平均天然平滑 | 较高——串行拟合可能过度追逐训练噪声 |
| 并行能力 | 天然可并行——各树独立 | 必须串行——每棵树依赖前序结果 |
| 独有诊断 | OOB 得分 | 特征重要性(feature_importances_) |
7. 数学原理如何映射到当前源码
| 数学概念 | 数学符号/公式 | 代码实现 |
|---|---|---|
| 加法模型 | GradientBoostingClassifier(n_estimators=200, learning_rate=0.1) | |
| 基学习器(浅层树) | max_depth=3 | max_depth=3(对比 Bagging 的 max_depth=None) |
| 学习率收缩 | learning_rate=0.1 | |
| 负梯度(伪残差) | GBDT 内部自动计算——用户不可见 | |
| 对数损失(多分类) | loss='log_loss'(默认值) | |
| 随机梯度提升 | subsample=1.0(当前未启用) | |
| 特征重要性 | 基于分裂增益的加权平均 | model.feature_importances_ |
| 标准化 | StandardScaler(训练集拟合/测试集变换) | |
| 分层抽样 | 保持类别比例 | train_test_split(stratify=y) |
常见坑
- 混淆 GBDT 与 Bagging 的基学习器选择——GBDT 用弱学习器(浅层树)降偏差,Bagging 用强学习器(深层树)降方差。
- 把
learning_rate设得过大——时 GBDT 退化为无收缩的简单加法模型,极易过拟合。 - 把
n_estimators设得过小——时 200 棵树是合理起点,10 棵树远不足以收敛。 - 忽略学习率与树数量的耦合关系——
越小需要越大的 ,两者必须协同调整。
小结
- GBDT 的数学核心链:加法模型
函数空间负梯度 每棵树拟合伪残差 学习率收缩控制步长 轮后得到低偏差集成 特征重要性基于分裂增益。 - GBDT 降偏差而不降方差——因此需要高偏差低方差的基学习器(浅层决策树
max_depth=3)。 - 当前源码
GradientBoostingClassifier(n_estimators=200, learning_rate=0.1, max_depth=3)是针对多类别分类数据最经典的 GBDT 配置。