🏠 总目录📚 本教程 08 · 偏差方差分解
📑 本页目录(点开跳转)

08 · 偏差-方差分解:它是个等式

28 分钟 | ⭐⭐ 从"打比方"升级成"能算的东西"


🎯 一句话

你一直听说「偏差和方差要权衡」。它不是个比喻——它是一个可以严格推导出来的等式。 而且这个等式直接解释了集成学习为什么有效

低偏差 · 低方差理想低偏差 · 高方差平均对了,但很散高偏差 · 低方差很稳,但系统性偏了高偏差 · 高方差又偏又散
四个靶心:偏差是「散点中心离靶心多远」,方差是「散点彼此有多散」。机器学习的大部分工作,都是在这四象限里往左上角挪。

📐 一、那个等式

对一个固定的测试点 $x$,在所有可能的训练集上取期望:

$$\underbrace{\mathbb{E}\left[(y - \hat f(x))^2\right]}_{\text{期望测试误差}} = \underbrace{\text{Bias}[\hat f(x)]^2}_{\text{系统性偏离}} + \underbrace{\text{Var}[\hat f(x)]}_{\text{对训练集的敏感度}} + \underbrace{\sigma^2}_{\text{不可消除的噪声}}$$

💡 人话翻译

含义 打靶类比
偏差² 你的平均预测离真相有多远 弹着点的中心偏离靶心多少
方差 换一批训练数据,你的预测会变多少 弹着点散得有多开
σ² 数据本身的噪声 靶子在风里晃,谁也打不准
低方差 高方差 低偏差 (中心对) 高偏差 (中心偏)
偏差 = 弹着点的中心离靶心多远;方差 = 弹着点散得多开。两者互相独立,所以有这四种组合。

⚠️ 一个关键的理解点期望是对"所有可能的训练集"取的,不是对测试点取的。 「方差」问的是:如果我换一批训练数据重新训练,这个点的预测会变多少? 你实际只有一个训练集,所以方差是看不见的——但它真实存在,且决定了你的泛化。

📐 推导(想看再点)

设真实关系 $y = f(x) + \varepsilon$,$\mathbb{E}[\varepsilon]=0,\ \text{Var}(\varepsilon)=\sigma^2$。 记 $\bar f(x) = \mathbb{E}_D[\hat f(x)]$(在所有训练集上的平均预测)。

$$\mathbb{E}[(y-\hat f)^2] = \mathbb{E}[(f + \varepsilon - \hat f)^2]$$

把 $\bar f$ 加进去再减掉:$f + \varepsilon - \hat f = (f - \bar f) + (\bar f - \hat f) + \varepsilon$

平方展开后有三个平方项和三个交叉项。三个交叉项都为 0: - $\mathbb{E}[\varepsilon] = 0$,所以含 ε 的两项消失 - $\mathbb{E}[\bar f - \hat f] = 0$($\bar f$ 就是 $\hat f$ 的期望),所以第三项消失

剩下:

$$= \underbrace{(f-\bar f)^2}_{\text{Bias}^2} + \underbrace{\mathbb{E}[(\hat f - \bar f)^2]}_{\text{Var}} + \underbrace{\sigma^2}_{\text{噪声}}$$


🔑 二、四个立刻能用的推论

① σ² 是天花板

无论你的模型多强,期望测试误差不可能低于 σ²。

   如果你的验证分数卡在某个值下不去了:
   ① 先估计一下 σ²(比如同样输入的重复观测差多少)
   ② 如果已经接近 σ²,别再调模型了

   ⭐ 该做的是:改进数据质量、增加特征、减少标注噪声
      而不是继续换模型

② 模型复杂度只在偏差和方差之间搬运

   简单模型:偏差大、方差小
   复杂模型:偏差小、方差大
                ↑
        总和有个最小值 —— 那就是最优复杂度

🔗 这就是基础教程第 1 章 那张决策树深度表的数学解释。

③ ⭐ 加数据只降方差,不降偏差

   n → ∞ 时,方差 → 0
   但偏差【不变】—— 它由你的模型假设决定

   💡 所以:如果你的模型欠拟合(高偏差),
      加再多数据也没用!必须换更强的模型。

🔗 这精确解释了基础教程第 5 章学习曲线的读法: 曲线平了 = 方差已经降到底了 = 剩下的是偏差 = 该改模型而不是加数据。

④ 「无偏」不一定好

   ❌ 常见误解:「估计量应该是无偏的」
   ✅ 真相:我们要的是【总误差小】,不是【偏差为 0】

   ⭐ 正则化【故意引入偏差】来换取方差的大幅下降
      → 总误差反而更小
      → 这就是岭回归比最小二乘泛化更好的原因

这是理解正则化的第四个视角:故意引入偏差,换方差的大幅下降。 另外三个:第 2 章贝叶斯先验第 9 章缩小假设空间第 10 章SRM 的复杂度罚款


🌳 三、⭐ 用它解释集成学习

ρ = 0ρ = 0.3ρ = 0.7集成里模型的个数 M →方差(相对)加模型能降方差 —— 但降不到 0,有一条地板Var(平均) = ρσ² + (1−ρ)/M · σ²⭐ 第一项 ρσ² 完全不随 M 减小 —— 这就是那条虚线地板所以「再加一百棵树」到某个点之后就没用了,真正该做的是【降低相关性 ρ】随机森林随机选特征、Bagging 随机采样 —— 全都是在压低 ρ,而不是在加 M
三条虚线是三条不同的地板:加再多模型也降不下去。⭐ 因为 Var = ρσ² + (1−ρ)/M·σ²,第一项完全不随 M 减小。所以「再加一百棵树」到某个点就没用了 —— 该做的是降低相关性 ρ,这正是随机森林随机选特征在干的事。

这是本章最有价值的部分——集成为什么有效,有数学答案。

Bagging / 随机森林:直接砍方差

   取 M 个模型的平均:f̄ = (1/M)·Σ fₘ

   如果这 M 个模型【完全独立】:
        Var(f̄) = Var(f) / M      ⭐ 直接降 M 倍!
        Bias(f̄) = Bias(f)         偏差【一点不动】

💡 人话平均 100 棵树,方差降到 1/100,偏差纹丝不动。

推论:Bagging 该配高方差低偏差的基学习器 —— 也就是完全生长的深树

反正方差会被平均掉,那就让每棵树尽量把偏差压到最低。

⚠️ 但"完全独立"做不到

现实中树之间是相关的。真实的方差是:

$$\text{Var}(\bar f) = \rho\,\sigma_f^2 + \frac{1-\rho}{M}\sigma_f^2$$

其中 ρ 是模型间的相关系数。

💡 关键洞察

   M → ∞ 时,第二项 → 0
   但第一项 ρσ² 【不随 M 减小】!

   → 方差降不到 0,卡在 ρσ²
   → 所以【降低 ρ】和【增加 M】同样重要

这就是随机森林「随机选特征」的数学理由

   如果每棵树都能看全部特征
   → 都会先用那个最强的特征分裂
   → 树长得都差不多 → ρ 很高 → 平均了也没用

   强制每次只从随机 k 个特征里选
   → 树被迫变得不一样 → ρ 下降 → 平均才真正有效 ⭐

🔗 基础教程第 4 章说 "集成的收益来自成员差异"——差异就是 1−ρ,这里是它的公式。

Boosting:砍偏差

   Boosting 每棵新树拟合前面的残差
   → 逐步降低【偏差】
   → 所以该配【低方差高偏差】的基学习器 = 浅树(深度 3-8)⭐

   代价:树越多,方差会慢慢上升 → 需要早停

🔗 这解释了基础教程第 4 章那个问题: 为什么 GBDT 的树要浅、随机森林的树要深。 两者在偏差-方差等式里干的是相反的活。


📋 四、一张表总结

Bagging / 随机森林 Boosting / GBDT
主要降低 方差 偏差
基学习器该选 高方差低偏差 → 深树 低方差高偏差 → 浅树
树之间 独立(可并行) 依赖(必须串行)
增加树的数量 几乎不会过拟合(趋于 ρσ²) 会过拟合 → 要早停
关键调节手段 降低相关性 ρ(随机选特征、随机采样) 降低学习率
对噪声标签 较鲁棒 较敏感(会去拟合噪声的残差)

⚠️ 五、两个重要的现代补充

① 分类任务的分解不一样

   平方损失:Bias² + Var + σ²   ← 干净的加法分解

   0-1 损失(分类):没有这么干净的分解
   → 方差有时甚至【有益】(可能把错误的预测"抖"回正确的一侧)
   → 所以分类任务里 Bagging 的效果分析更复杂

实践含义:偏差-方差是回归任务的精确工具、分类任务的有用直觉

② 双下降现象

深度学习里出现了「双下降」,打破了经典的 U 型曲线:

   误差 ▲
        │╲      ╱╲
        │ ╲    ╱  ╲___          ← 参数量超过样本数后,误差【再次下降】
        │  ╲__╱       ╲___
        └──────────────────────► 模型复杂度
           ↑经典U型  ↑插值阈值

💡 怎么理解: - 偏差-方差分解仍然正确(它是数学恒等式,不可能错) - 但「复杂度增加 ⇒ 方差增加」这个经验规律在超参数化区间不成立 - 可能的原因:超参数化时有无穷多个能拟合训练集的解,SGD 倾向于选到"平坦"的那些

🔗 第 10 章会展开这个矛盾。现代大模型正工作在右边那个区域。


🔬 六、怎么实际估计偏差和方差

理论上要"所有可能的训练集",实践中用 bootstrap 近似

import numpy as np

def estimate_bias_variance(model_fn, X, y, X_test, y_test, n_rounds=50):
    preds = []
    n = len(X)
    for _ in range(n_rounds):
        idx = np.random.choice(n, n, replace=True)     # bootstrap 重采样
        m = model_fn().fit(X[idx], y[idx])
        preds.append(m.predict(X_test))
    preds = np.array(preds)                            # (n_rounds, n_test)

    mean_pred = preds.mean(axis=0)
    bias2 = np.mean((mean_pred - y_test) ** 2)         # 含 σ²,是个上界
    var   = np.mean(preds.var(axis=0))                 # ⭐ 方差可以干净地估
    print(f"Bias²(含噪声) ≈ {bias2:.4f}   Var ≈ {var:.4f}")

💡 实用价值:跑一次这个,对比「深树 vs 浅树」或「正则强 vs 弱」, 你能亲眼看到方差怎么被换成偏差


🔗 七、和站内其他章的关系

相关的地方 这里的解释
基础教程第 1 章决策树深度表 偏差方差权衡的经验版
基础教程第 5 章学习曲线怎么读 加数据只降方差
随机森林要"随机选特征" 降低 ρ,公式在这
GBDT 树要浅、随机森林树要深 两者降的东西相反
正则化能提升泛化 用偏差换方差,总误差更小
模型集成通常有效 方差平均

✅ 检查点

  1. 偏差、方差、σ² 各是什么?「期望」是对什么取的?
  2. σ² 意味着什么实践含义?
  3. 加数据能降低偏差吗?这对"该加数据还是改模型"意味着什么?
  4. 为什么说「无偏不一定好」?
  5. Bagging 降什么?为什么该配深树?
  6. 为什么随机森林要"随机选特征"?(用 ρ 的公式解释)
  7. 为什么 GBDT 的树要浅?
  8. 分类任务的偏差方差分解和回归有什么不同?
👀 答案
  1. 偏差²=平均预测离真相的距离;方差=换训练集时预测的波动;σ²=数据固有噪声。期望是对所有可能的训练集取的(不是测试点)——所以方差你看不见但它真实存在。
  2. 期望测试误差不可能低于 σ²。撞到这个天花板时该改进数据质量/加特征,而不是继续调模型。
  3. 不能。加数据只降方差,偏差由模型假设决定。欠拟合时加数据无用,必须换更强模型;学习曲线平了就说明该改模型。
  4. 我们要的是总误差小,不是偏差为 0。正则化故意引入偏差换取方差大幅下降,总误差反而更小——这是岭回归比最小二乘泛化好的原因。
  5. 降方差(M 个独立模型平均,方差降 M 倍,偏差不变)。所以配高方差低偏差的基学习器,即完全生长的深树。
  6. 真实方差 = ρσ² + (1−ρ)σ²/M,第一项不随 M 减小。若所有树都能看全部特征,会都先用最强特征分裂 → 长得像 → ρ 高 → 平均无效。随机选特征强制树变得不一样,降低 ρ。
  7. Boosting 降的是偏差,所以基学习器要选"低方差高偏差"的浅树。每棵树只纠正一点点,避免一步跨太大。
  8. 0-1 损失没有干净的加法分解,方差有时甚至有益(可能把错误预测"抖"回正确一侧)。所以它是回归的精确工具、分类的有用直觉

🛑 可以停在这里

走神救援

偏差方差不是比喻,是个能推导出来的等式:期望测试误差 = 偏差² + 方差 + σ²(偏差=弹着点中心离靶心多远,方差=散多开)。⚠️期望是对"所有可能的训练集"取的——你只有一个训练集,所以方差看不见,但它真实存在且决定泛化。四个推论:①⭐σ² 是天花板,误差不可能低于它;分数卡住时先估 σ²,接近了就该改数据质量、加特征、降标注噪声,而不是换模型;②复杂度只是在偏差和方差之间搬运,两者之和的最小点=最优复杂度;③⭐加数据只降方差、不降偏差(n→∞ 方差→0,偏差由模型假设决定)→ 欠拟合时加再多数据也没用,学习曲线平了=方差到底了=该改模型;④"无偏"不一定好——正则化故意引入偏差换方差大降,总误差反而更小,这是岭回归比最小二乘泛化好的原因。⭐⭐这个等式直接解释了集成为什么有效:M 个模型取平均,若完全独立则 Var(f̄) = Var(f)/M、偏差一点不动(100 棵树方差降到 1/100)→ Bagging 该配高方差低偏差的深树。但"完全独立"做不到,真实是 Var(f̄) = ρσ² + (1−ρ)σ²/M:⚠️M→∞ 时第二项趋于 0,第一项 ρσ² 却不随 M 减小,方差卡在 ρσ² → 降低相关性 ρ 和增加 M 同样重要,这就是随机森林"随机选特征"的数学理由(都看全部特征就都先用最强特征分裂,树长得像、ρ 高、平均也没用)。Boosting 拟合残差、降的是偏差 → 配浅树(深度 3–8),树越多方差上升、必须早停。两个补充:⚠️0-1 损失没有干净的加法分解(方差有时甚至有益),所以它是回归的精确工具、分类的有用直觉双下降里分解仍然正确(数学恒等式),失效的是"复杂度增加⇒方差增加"这条经验规律。

下一节 👉 09-PAC学习.md

打卡记录保存在你的浏览器里,首页能看到总进度