跳转至

P4-16.1 梯度提升(gradient boosting)

Section ID: P4-16.1 Version: v2026.07.20

我们在 P4-15 里看到的随机森林(random forest), 是一种把很多树 并行地 建起来, 再把结果聚在一起以减少摇摆的集成方法。

到了这里, 围绕梯度提升(gradient boosting)会冒出另一个问题: 既然已经能聚很多棵树, 能不能让下一棵树直接去修正前一阶段留下来的错误?

梯度提升是一种集成方式: 它把小树一阶段一阶段叠起来, 让下一阶段去顺序地减少前一阶段留下的误差。

如果随机森林更接近 并行地收集很多意见, 那么梯度提升更接近 让下一阶段修正前一阶段的错误

这一节解释 梯度提升(gradient boosting)residualweak learneradditive model 这些基本含义。 后面的 Section 会沿着这些抓手继续推进, 而顺序修正误差的基础感觉, 也会通过这一节和概念词典重新连接。

本节范围

本节回答以下问题。

  • 为什么梯度提升会被叫作 顺序的(sequential)
  • weak learnerresidualadditive model 分别是什么意思?
  • 梯度提升和随机森林的思考方式到底哪里不同?
  • 为什么 n_estimatorslearning_rate 要一起读?

这一节聚焦的是: boosting 到底是一种怎样的方式。 性能与风险、以及 early stopping 和 shrinkage 的角色, 会在 P4-16.2 继续。 更宽一点的超参数与验证成本视角,会在 P4-9.1 和 P4-9.2 再接回来。XGBoost、LightGBM、CatBoost 的实现差异也会在 P4-16.2 继续,主要从 它们想让什么更快,想让什么更安全 的角度来读;如果后面需要更宽的实现比较,再把它分出去作为本章的补充学习回收。

用梯度提升(gradient boosting)留下的判断标准

  • 你可以把梯度提升解释成 顺序减少误差的集成
  • 你可以说明为什么 weak learner 常常通过小树来解释。
  • 你可以把 residual 解释成 前一阶段仍然没解释掉的部分
  • 你可以说明为什么 learning_raten_estimators 必须一起读。

为什么需要这一节

刚理解完随机森林后, 读者很容易这样想:

  • 我已经懂了“把很多树聚起来”
  • 那是不是所有集成都差不多?

但这里会出现很大的分叉。

问题 随机森林 梯度提升
树是怎么建的? 让很多树彼此不同,再一起看 下一棵树接住前一棵树的误差
核心目的 降低 variance、提高稳定性 降低 bias、修正误差
学习流程 并行(parallel) 顺序(sequential)

所以 16.1 就是在区分: 藏在共同点 用了很多树 背后的, 完全不同的学习哲学。

boosting 是怎样的大框架

scikit-learn 用户指南把 boosting 解释成: 一种把 weak learner 顺序结合起来, 形成更强预测器的代表性集成方法。 而 gradient boosting 则是把这个想法推广到可微损失函数上的方式。

与其一开始就造一个巨大的完美模型,不如一步一步把小模型加上去,把还错着的地方继续修掉。

所以梯度提升更容易被读成 不断修正、慢慢逼近的模型, 而不是 一下子就把完整答案猜出来的模型

为什么说它是 sequential

scikit-learn 文档说明, gradient-boosted trees 是一种顺序堆叠树的方法。 每一阶段的树, 都是在前一阶段预测结果的基础上再加进去的。

这正是它和随机森林最大的区别。

  • 在随机森林里,tree 1 不会直接知道 tree 2 的错误。
  • 在梯度提升里,stage 2 会在看到 stage 1 留下的误差后再进入。

梯度提升之所以是顺序的, 就在于 下一阶段知道前一阶段

先用一个场景来读

flowchart TD
  A["基础预测"]
  B["测量残差<br/>还剩下的误差"]
  C["对残差拟合一棵小树"]
  D["加入一个小修正<br/>并乘上 学习率"]
  E["更新预测"]
  F["重复很多个阶段"]
  G["最终的 提升 模型"]

  A --> B --> C --> D --> E --> F --> G
  E -. 再看一遍剩余误差 .-> B

这张图的重点是: 新树并不会从头重新解完整个问题。 它是在当前预测留下的 residual 上, 再加一个小修正。 虚线箭头显示的是反复结构: 每加完一次修正, 就再重新计算剩余误差。

residual 是什么

在回归(regression)语境里, residual 通常可以读成:

实际值 - 当前预测

例如, 实际值是 120, 而当前模型预测 100, 那么 residual 就是 20。 反过来, 如果实际值是 80, 而当前模型预测 95, 那么 residual 就是 -15

比公式更重要的是下面这个直觉。

residual 就是模型还没有解释掉的那一部分。

梯度提升正是在不断地尝试把这部分剩余继续压低。

同样的意思也可以压成一个短表。

当前场景 residual 表示什么
预测低于真实值 还需要继续往上修正
预测高于真实值 还需要继续往下修正
residual 很小 当前阶段已经解释掉了很多内容
residual 仍然朝同一方向残留 当前规则还在漏掉某种模式

所以 residual 不只是一个 模型错了 的标记。 它同时也是一个告诉下一阶段 应该从哪里进去修 的信号。

additive model 是什么意思

scikit-learn 文档把 gradient boosting regressor 解释成 additive model。 这表示最终预测, 是通过把各阶段模型的输出不断加起来形成的。

  1. 先放一个很简单的基础预测。
  2. 让下一棵树做出一个小修正。
  3. 把这个修正加到当前预测上。
  4. 再看还剩下多少误差。
  5. 不断重复。

压成一句话就是: 梯度提升是 小修正的累加

这里更重要的, 不是 用了很多树 这件事本身, 而是 每一阶段都在前一个答案上再加一个小修正。 所以梯度提升的最终预测, 不是 在很多独立意见里选一个, 而更像是 原来的答案 + 新修正 + 下一次修正 + ...

用一个很小的数字表看会更直观。

阶段 当前预测 本阶段加上的修正 更新后的预测
初始值 100 - 100
stage 1 100 +4 104
stage 2 104 -2 102
stage 3 102 +1 103

在这个表里, stage 2 并不是重新给出一个全新的答案。 它是在已有的 104 上加 -2,把它修成 102。 stage 3 也是同样的逻辑。

因此 additive model 可以这样去读。

  • 第一阶段先抓住大致方向
  • 后面阶段再一点点修这个答案
  • 最终答案不是 一次大跳, 而是 很多小移动的总和

这一点在和随机森林比较时尤其重要。

模型 使用很多树之后,最终答案是怎样形成的
随机森林 把很多树的预测最后平均或投票
梯度提升 把每一阶段的修正顺次加到前面的答案上

所以如果把随机森林读成 很多意见的聚合, 那么更准确的读法是把梯度提升读成 很多修正的累加

在实务场景里, 这就更像是: 不是一次性把 churn score 定死, 而是先放一个 基础风险分数, 再让 支付失败最近使用下降咨询增加 这些信号在后续阶段一点点把分数抬高或拉低。 读者真正要看的问题是: 每一阶段新反映了什么信号?

为什么 weak learner 常通过小树来解释

scikit-learn 文档在 gradient boosting 里, 通常用固定大小的 regression tree 来说明 weak learner。 例子里也常用非常小的树, 例如 decision stump。

这里不应该把 weak learner 理解成 很差的模型。 更准确的读法是:

它不是想一次把整个问题解完,而是只负责当前阶段的一小次修正。

为什么常用小树?

  • 每个阶段的角色会更清楚
  • 可以减少单个阶段把太多东西一口气背下来的风险
  • 更贴合“很多阶段累积修正”的结构

初学者最容易犯的误解, 是把 weak learner 读成 性能很差的模型。 但在 boosting 里, 它更接近 角色被刻意限制住的小修正工具

容易误解的话 本节里更准确的读法
它是弱学习器,所以没什么用 它是一个只负责当前阶段小修正的工具
树小就一定性能弱 很多小树累起来可以变成很强的模型
一阶段改得不多,所以效率低 正因为不一次改太多,才更适合顺序修正

再往前一步, 也能看出为什么 小树 会这么常出现。 在 boosting 里, 比起 一次解决整个问题的大规则, 更重要的是 下一条可以把当前 residual 再压低一点的规则。 小树更适合这种角色。

阶段模型大小 这一阶段往往在做什么 从 boosting 角度看到的利弊
很小的树 修一个简单 residual 模式 阶段角色清楚,也更少引发背诵
中等大小的树 一次修几个信号组合 表达力更强,但单阶段影响也更大
很大的树 试图在一阶段里记住很多例外和复杂分支 后续修正空间变少,过拟合风险上升

所以弱学习器之所以是小树, 不是因为 它性能差, 而是因为 每一阶段的任务被刻意缩窄

如果放回到客户流失场景里, 也会更容易理解。

阶段设计 这一阶段会先问什么 应该读出的结果
小树 最近使用是不是下降了 这样的单一信号 下一阶段还能继续去修别的残留模式
大树 一次同时去切 使用下降 + 支付失败 + 咨询增加 + 会员时长 第一阶段可能解释太多场景,让后续更容易开始追噪声

所以在 boosting 里, 小树不是 因为没有更好的办法才用的弱工具, 而更接近 和顺序修正哲学相配套的基础零件

随机森林与梯度提升的差别

这两个模型都使用很多树, 但运作哲学并不一样。

flowchart TD
  subgraph RF["随机森林"]
    direction TB
    R1["树 A"]
    R2["树 B"]
    R3["树 C"]
    R4["聚合投票<br/>或平均值"]
    R1 --> R4
    R2 --> R4
    R3 --> R4
  end

  subgraph GB["gradient 提升"]
    direction TB
    G1["基础阶段"]
    G2["修正阶段 1"]
    G3["修正阶段 2"]
    G4["把所有阶段加起来"]
    G1 --> G2 --> G3 --> G4
    G2 -. 修正前面的误差 .-> G1
    G3 -. 修正剩余误差 .-> G2
  end

这张图会直接把差异摆出来: 随机森林是聚很多树的输出, 而梯度提升则是让下一阶段继续修前一阶段的错误。

压成短句就是:

  • 随机森林:聚很多彼此独立的意见
  • 梯度提升:让下一个答案修前一个答案

这个对比会直接影响后面阅读性能、调参敏感性、以及过拟合风险的方式。

为什么 learning_rate 很重要

scikit-learn 文档把 learning rate 解释成 shrinkage。 它会缩小每个 weak learner 的贡献, 而较小的 learning rate 往往需要更多 weak learner。

可以这样读。

  • learning_rate 大:单阶段修正会被更强地反映
  • learning_rate 小:单阶段修正会被更温和地反映

所以 learning_rate 不能单独读, 而要和 n_estimators 一起读。

设置 直觉
大 learning rate + 少树 动得快,但可能摇得太厉害
小 learning rate + 多树 动得慢,但能修得更细

因此 boosting 真正要一起决定的是: 要走多少个修正阶段 以及 每个阶段修多重

用更直接的话说就是:

boosting 最核心的设置,是决定要用少数阶段快速前进,还是用很多阶段慢慢前进。

所以如果把 learning_rate 分开看, 或者把 n_estimators 分开看, 感觉就会变模糊。 在实务里它们其实总是成组移动。

看组合时先问什么 为什么重要
单阶段修正会不会太强? 因为大的 learning_rate 会放大一阶段的影响
阶段数会不会太少? 因为小的 learning_rate 可能需要更多修正机会
residual 虽然在下降,但会不会降得太慢? 因为要检查修正强度和阶段数之间的平衡

n_estimators 是什么意思

scikit-learn 文档把 n_estimators 解释成 boosting process 的迭代次数, 也就是要拟合多少个 weak learner。

如果在随机森林里, n_estimators 更像 森林里有多少棵树, 那么在梯度提升里, 它更接近 要安排多少次修正阶段

可以这样读。

  • 随机森林:加树意味着收集更多意见
  • 梯度提升:加阶段意味着给模型更多修正机会

所以即使同样叫 n_estimators, 在两个模型里的感觉也不一样。

这个差别很重要。 在随机森林里, 加树更像是在 让平均更稳定。 而在梯度提升里, 加阶段更像是在 把残余误差抓得更久

因此在 boosting 里, 更安全的读法不是 多用了几棵树, 而是 让修正阶段继续得更久

这句话再往前走一步, 它在实际行为上会带来什么变化也应该一并看见。

n_estimators 小时 n_estimators 大时
可能还留着较大的 residual 会继续尝试压掉更小的 residual
模型复杂度较低,过度修正风险相对小 后面的阶段可能开始追噪声和边界案例
先看到的更可能是 underfitting 信号 后面更容易出现 overfitting 信号

所以 n_estimators 不是一个单纯的模型大小数字, 而是一个决定 模型要修正误差到第几轮 的抓手。

同样的意思, 放到一个更小的场景里会更容易。

阶段数设置 预测看起来像什么 应该读出的解释
阶段少 大错误变小了,但很多边界案例仍然留下 可能修正机会还不够
阶段中等 大错误下降,部分边界案例也被整理 可能是修正与泛化相对平衡的区域
阶段很多 train 几乎完美,但 validation 可能开始晃 后续阶段可能开始追剩余噪声

所以在 boosting 里更重要的问题是:

  • 以现在的阶段数来看,还剩很多大 residual 吗?
  • 阶段增加时,validation 真的在继续变好吗?
  • 后面的阶段是在学新结构,还是开始背例外?

learning_rate 一起看时, 这种感觉会更清楚。

组合 先期待什么 一起要警惕什么
learning_rate + 小 n_estimators 修正谨慎 也可能还没学够
learning_rate + 大 n_estimators 通过很多阶段慢慢细修 计算量变大,而且最终还是可能过拟合
learning_rate + 小 n_estimators residual 下降得快 单阶段影响过大,早期就可能摇晃
learning_rate + 大 n_estimators 强修正持续很久 过度修正与过拟合风险最高

所以 n_estimators 不是单独看的值, 而是和 learning_rate 一起决定修正长度与速度的值。

为什么 boosting 常在表格型数据上很强

scikit-learn 用户指南经常把 gradient-boosted trees 和 histogram-based gradient boosting 视为实务上很强的候选。 在表格型(tabular)数据里, 它们经常被拿来当强 baseline 或高性能候选。

直觉上可以整理成这样:

  • 它们很擅长处理数值特征和转换后的类别特征
  • 它们会直接瞄准前一阶段留下的误差
  • 它们能一阶段一阶段把小的非线性模式堆起来

所以在很多实务场景里, boosting 常被拿来当作 比线性模型更强的候选 或者 比随机森林更有机会冲高性能的候选

如果再改写得更贴近实务一点, 就是: 在表格型数据上, 当线性模型的表达力不够, 而单棵树或随机森林留下的残余误差又还想继续压下去时, boosting 很容易被优先想起。

但这种优势也会带来更高的调参敏感性和更高的过拟合风险。 这些会在 P4-16.2 继续展开。

在实务里先想到它的什么场景

在实务中, 当 单棵树或随机森林已经抓住了大轮廓,但还想继续减少残留错误模式 时, 最容易先想到梯度提升。

什么时候适合优先把梯度提升列为候选

当前问题状态 为什么优先考虑梯度提升 先检查什么
在表格型数据上需要更强的性能候选 因为小模式可以通过顺序修正不断累积 是否有过拟合管理计划
单棵树或随机森林留下的 residual error 仍然明显 因为下一阶段可以直接瞄准 residual 哪些错误场景一直没消失
用很多弱规则累加来解释问题很自然 因为 additive model 视角更容易看清改善过程 阶段修正会不会太强
愿意为了更高性能接受更多调参 因为 learning_rate、阶段数、tree size 都可以细调 validation 流程和 early stopping 是否准备好了
比起随机森林,更想积极地压低 bias 因为这种方法更偏向误差修正而不是平均稳定性 是否会开始去追数据噪声

这张表的重点, 是把梯度提升放在 不是 又一个用很多树的集成, 而是 顺序修 residual error 的高性能候选 这个位置上。

工作场景 为什么会想到 boosting
客户流失预测 它能通过顺序修正抓住多个弱信号
欺诈检测 下一阶段可以对前面漏掉的难例更敏感
贷款评分建模 它能通过累积小规则与非线性交互建立分数
广告点击预测 在很多特征组合里,它能继续把剩余误差往下压

所以如果把它和实务感觉连接起来, 更贴切的读法不是 一次做大分割的模型, 而是 把很多小修正叠起来的模型

案例与示例

案例 1:在客户流失预测里,很多次小修正会比一次大规则更合适

在订阅服务的客户流失预测里, 人最容易先用的规则通常只有一两条, 比如 最近登录次数是否支付失败。 例如: 最近 7 天登录次数骤减,风险高 或者 只要有支付失败,风险就高。 这些规则好理解, 但现实里 churn 常常是通过 会员时长、使用下降、支付历史、咨询增加 这类信号一点点重叠起来的, 所以只用一条简单规则会漏掉一部分客户。

这个场景可以缩成下面这张小表。

客户 最近登录下降 支付失败 咨询增加 会员时长 最容易先用的规则 实际解读
A 的确高流失风险
B 单一规则容易漏掉的边界案例
C 仅看登录下降会被高估的案例

在这个场景里, 梯度提升会让下一棵小树不断修正第一阶段漏掉的东西, 于是 短会员时长 + 咨询增加 以及 支付失败 + 使用下降 这样的弱组合信号, 可以被一阶段一阶段加进去。 这样一来, 原本在第一条规则下看起来像普通用户的案例, 会在后续修正后被抬高 churn score; 而仅仅因为登录下降就被高估的案例, 也可能被后面的阶段拉回一点。

flowchart TD
  A["初始流失规则"]
  B["漏掉的客户模式"]
  C["拟合一棵小修正树"]
  D["更新流失分数"]
  E["继续拟合下一次修正"]
  F["难例变得更清楚"]

  A --> B --> C --> D --> E --> F

这个场景也应该按 当前错误 -> 下一次修正 -> 残留 review 案例 的结构去读。 即使最终分数看起来接近, 某种 boosting 设置也可能更有效地减少某类客户错误, 而另一种设置则还会留下同样的边界案例。 所以那些残留模式也要一起记下来。

阶段 要记录什么 为什么重要
当前错误 第一阶段漏掉了哪些客户类型,哪些案例给了过低的 churn score 为了看清下一棵树到底进来修什么
下一次修正 新树响应了哪些附加信号组合 为了把 boosting 怎样压 residual 连起来看
残留 review 案例 即使过了很多阶段仍然含糊的边界案例 为了判断该不该继续加阶段,还是已经开始过拟合

如果改成项目笔记语言, 可以写成下面这样。

当前 baseline 本阶段修了什么 还剩下什么案例 下一个问题
只看最近登录会漏掉一部分 churn 用户 补进了支付失败、咨询增加、使用下降的组合 因临时使用下降而被高估的正常客户 还要继续加阶段,还是已经开始对边界案例修得太过?

这个案例里可验证的结果, 会出现在对比: 一次大规则会漏掉的边界 churn 客户,后续修正是否把它们拉回来了 以及 仅靠最近下降而被高估的案例,在后续修正后是否仍然过高 的时候。 所以这个 boosting 案例, 与其说是在读 分数提高了, 不如说是在读 哪种客户类型的 residual 变小了

案例 2:为什么同样的 residual,修正强度不同就像不同模型

假设一个价格预测团队对同样的 residual 模式, 试两种设置。 一种是把 learning_rate 设小,走很多阶段; 另一种是把 learning_rate 设大,用较少阶段快速下降 residual。

乍看之下, 它们都还是 修误差的模型, 好像差别不大。 但实际上, 前者更接近 很多次小修正, 后者更接近 一次修正影响很大

同样的 residual, 会形成下面这种不同场景。

设置 第一次修正后看起来怎样 最容易先产生的误解 更准确的读法
learning_rate + 多阶段 residual 降得慢,边界案例会留得更久 模型还太弱 它可能是在避免过度反应,慢慢修正
learning_rate + 少阶段 residual 降得快,前期分数看起来很好 它更好 单阶段修正可能太强,后期更容易不稳

例如, 如果有几条样本只是短暂价格跳动, 大的 learning_rate 设定可能会更快追上这些跳动, 把 train residual 很快压下去。 而小的 learning_rate 设定则会更慢地反映同样 residual, 因此前期改善没那么显眼, 但后面的阶段可能读起来更稳定。

所以在梯度提升里, 不能只停在 下一棵树看 residual 这句话。 还要继续看: 这个 residual 是分几次反映、又是以多大强度反映的。 只有这样, 配置差异才会真正连到模型行为差异。

这个案例里的可验证结果, 会出现在比较 前期 train residual 下降速度残留边界案例的类型 、 以及 后续阶段摇摆程度 的时候。 核心仍然是: 同样的错误,到底以多快、多强的方式被修掉。

练习与示例

这个例子只是为了在回归视角下建立 修正会不断累加 这种感觉。 它不会停在一次修正, 还会一起看修正强度改变后, residual 会怎样不同地下降。

  • 问题场景:观察当前预测与真实值之间的差距,再让下一阶段加上小修正
  • 输入(input):当前预测与真实值
  • 期望输出(output):各阶段 residual 和更新后的预测
  • 要确认的概念:
  • residual 是剩余误差 - 下一阶段会朝着减少 residual 的方向移动 - learning rate 决定一次修多重
# 这个玩具例子展示 gradient boosting 中沿 residual 方向的修正如何累积到预测里。
actual = [120, 110, 90, 80]
pred_stage0 = [100, 100, 100, 100]

residual_stage1 = [a - p for a, p in zip(actual, pred_stage0)]
tree1_correction = [15, 10, -10, -15]
learning_rate = 0.1

pred_stage1 = [
    p + learning_rate * c
    for p, c in zip(pred_stage0, tree1_correction)
]

residual_stage2 = [a - p for a, p in zip(actual, pred_stage1)]

print("actual           :", actual)
print("stage0 prediction:", pred_stage0)
print("stage1 residual  :", residual_stage1)
print("tree1 correction :", tree1_correction)
print("stage1 prediction:", [round(x, 1) for x in pred_stage1])
print("stage2 residual  :", [round(x, 1) for x in residual_stage2])

运行结果如下。

1
2
3
4
5
6
actual           : [120, 110, 90, 80]
stage0 prediction: [100, 100, 100, 100]
stage1 residual  : [20, 10, -10, -20]
tree1 correction : [15, 10, -10, -15]
stage1 prediction: [101.5, 101.0, 99.0, 98.5]
stage2 residual  : [18.5, 9.0, -9.0, -18.5]

这个例子应该读出下面几点:

  1. 第一轮预测很简单,所以误差较大
  2. 下一阶段会沿着 residual 的方向加一个小修正
  3. 因为 learning_rate = 0.1,修正不会一次性全部用完
  4. 所以 residual 不会立刻变成 0,后续阶段仍然有继续修的空间

也就是说, 梯度提升更接近 很多次小修正, 而不是 一次大修正

改一个值看看:如果 learning_rate 变大,同样的 correction 会怎样不同地生效?

这一次保留同样的 correction, 只把 learning_rate 改成 0.5

# 这个例子比较在相同 correction 下,增大 learning_rate 会如何改变 residual 的下降速度。
actual = [120, 110, 90, 80]
pred_stage0 = [100, 100, 100, 100]

tree1_correction = [15, 10, -10, -15]
learning_rate = 0.5

pred_stage1 = [
    p + learning_rate * c
    for p, c in zip(pred_stage0, tree1_correction)
]

residual_stage2 = [a - p for a, p in zip(actual, pred_stage1)]

print("stage1 prediction:", [round(x, 1) for x in pred_stage1])
print("stage2 residual  :", [round(x, 1) for x in residual_stage2])
stage1 prediction: [107.5, 105.0, 95.0, 92.5]
stage2 residual  : [12.5, 5.0, -5.0, -12.5]

learning_rate = 0.1 相比, residual 下降得更快了。 但与此同时, 单阶段修正的影响也明显变大。 这个对比说明: 在梯度提升里, 光知道 下一棵树会看 residual 还不够, 还必须一起看 它到底会多强地把 residual 反映进去

把差异再固定成一张表:

设置 先看见的优点 要一起小心的点
learning_rate 单阶段修正没那么粗暴 可能需要更多阶段
learning_rate residual 看起来降得很快 单阶段修正可能过强

所以 learning_rate 不只是速度控制, 它还是一个决定 单次修正强度 的抓手。

在这个例子里要一起读什么

这个例子里重要的, 不只是 数值变了多少。 更重要的是一起读出: 残余误差是以多大强度被压下来的 以及 下一阶段还剩下多少继续修的空间。 即使 correction 一样, 只要 learning_rate 不同, residual 下降速度和单阶段影响就会不同。 所以在 boosting 里, 残余误差修正调参抓手 应该放在同一个场景里一起看。

通用记录语言 这次练习里应立刻留下的内容
看见的结构 同样的 correction,会因为 learning_rate 不同而产生不同的 residual 下降速度
解释边界 residual 降得快,并不自动表示这种单阶段修正更安全或更能泛化
下一问题 如果再增加阶段数,残留错误与过拟合风险会怎样一起变化?

检查清单

  • 你现在需要的,更接近 residual 修正,而不是 variance 降低吗?
  • 你能解释减少 residual 的这套结构吗?
  • 你有没有把更高性能可能性和更高调参敏感性一起看?
  • 你能说明梯度提升是一种让下一阶段顺序减少前一阶段误差的集成,而 residual 是前一阶段还没有解释掉的剩余部分吗?
  • 你能说明 weak learner 是负责小修正的小树,而且 learning_raten_estimators 必须一起读吗?
  • 你能说明如果随机森林是并行聚合,那么梯度提升就是顺序修正吗?

出处与参考资料