偏差-方差分解与过拟合
一句话定义
偏差-方差分解把模型在单点的期望预测误差拆为三部分:偏差(模型系统性偏离真函数)、方差(训练集扰动导致解的抖动)与不可约噪声,并据此解释过拟合与欠拟合。
为什么重要
它是「模型选择」的理论地图:正则化、Bagging、早停、交叉验证各自在这张地图上的位置一目了然——正则化增偏差减方差,Bagging 减方差,Boosting 减偏差。诊断模型时,「训练误差高、测试误差高」与「训练误差低、测试误差高」对应完全不同的药方,这一区分直接来自本节。
前置知识
学习问题的形式化:假设空间、经验风险与泛化 的泛化误差概念;损失函数:从 0-1 损失到代理损失 以平方损失为默认场景。
核心概念
- 偏差:不同训练集上学得模型的平均预测与真函数之差 (𝔼D[f̂(x)] - f(x))2,度量「系统性错误」。
- 方差:𝔼D[(f̂(x) - 𝔼D[f̂(x)])2],度量「对训练集的敏感度」。
- 噪声:σ2 = 𝔼[(y - f(x))2],数据固有,任何模型都消不掉。
- 过拟合:训练误差持续下降而验证误差回升,方差项失控。
- 欠拟合:两类误差都高,偏差项主导。
直观类比
射击打靶:偏差是弹着点整体偏离靶心(枪的准星没校好),方差是弹着点散布范围(手抖),噪声是风。换更灵敏的枪(复杂模型)能校准准星(降偏差)但手更抖(升方差);Bagging 相当于请一队人各打几枪取平均——散布互相抵消,方差下降。
原理与机制
设 y = f(x) + ε,𝔼[ε] = 0,Var(ε) = σ2。对训练集分布 D 取期望,期望平方预测误差可精确展开:
模型复杂度上升 → 假设空间变大 → 能贴住真函数(偏差↓)但也更容易贴住训练集噪声(方差↑),于是总误差呈 U 形。实践中没有解析的分解可算,用学习曲线(训练/验证误差随样本量变化)与验证曲线(随复杂度/超参数变化)观察同款现象。
公式与推导
推导关键一步是引入「交叉项消失」:记 f̄ = 𝔼D[f̂],
第一项是方差;第二项是偏差平方;交叉项因 𝔼D[f̂ - f̄] = 0 且 𝔼[ε] = 0 为零;噪声贡献 σ2。注意此分解仅对平方损失成立,0-1 损失没有如此干净的加法分解(其期望误差可表述为「噪声 + 偏差 + 方差」的更复杂函数)。
图示
误差
▲│\ /
││ \__ 验证误差 / ← 方差项飙升
││ \__ __/
││ \/ ← U 形谷底(最佳复杂度)
││ 训练误差 \
││ \______ ← 持续下降( memorize )
└┴─────────────────────────▶ 模型复杂度
欠拟合(偏差主导) 过拟合(方差主导)实例或案例
用多项式回归观察 U 形:对正弦数据拟合 1/3/9 次多项式并重复采样 30 组训练集,观察预测曲线的「平均偏移」(偏差)与「曲线散布」(方差):
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline
rng = np.random.default_rng(0)
x = np.linspace(0, 1, 40); f = np.sin(2 * np.pi * x)
for deg in (1, 3, 9):
preds = []
for s in range(30):
r = np.random.default_rng(s)
xs = r.uniform(0, 1, 15); ys = np.sin(2 * np.pi * xs) + r.normal(scale=0.2, size=15)
m = make_pipeline(PolynomialFeatures(deg), LinearRegression()).fit(xs[:, None], ys)
preds.append(m.predict(x[:, None]))
P = np.array(preds)
print(f"deg={deg} 偏差^2≈{((P.mean(0) - f) ** 2).mean():.3f} 方差≈{P.var(0).mean():.3f}")运行可见 deg=1 偏差大、方差小;deg=3 两者平衡;deg=9 偏差≈0 而方差爆炸。
常见误区
- 把「高方差」与「模型参数多」划等号:1-NN 是低偏差高方差的极端,而参数极少但容量无限的方法也存在;关键是有效容量而非参数个数。
- 用训练误差诊断过拟合:过拟合的定义是验证/测试误差回升,必须留出独立评估。
- 认为噪声可以被「更聪明的模型」消灭:σ2 是下界,模型再好也只是在逼近它。
与其他知识点的关系
正则化:岭回归、Lasso 与弹性网 正则化是显式做「加偏差换方差」的交易;随机森林与 Bagging Bagging 从平均角度降方差;梯度提升树 GBDT 与 XGBoost Boosting 逐步降偏差;交叉验证与数据划分策略 交叉验证是在 U 形曲线上找谷底的操作化手段。
自测题
- 为什么 Bagging 主要降低方差而几乎不改变偏差?
- 要点:对独立同分布模型的预测取平均,期望不变(偏差不变),方差按 1/B(完全独立时)或 ρσ2 + (1-ρ)σ2/B 缩小。
- 训练误差 0.01、验证误差 0.30,该往哪个方向调?
- 要点:典型过拟合(方差主导);加正则、简化模型、增数据、早停、Bagging,而不是继续加容量。
- 偏差-方差分解对分类 0-1 损失还严格成立吗?
- 要点:不成立;该分解是平方损失特有的,分类情形只有近似变体,但「复杂度 U 形」的定性结论仍有效。
延伸阅读
Hastie 等《The Elements of Statistical Learning》第 7 章;Domingos, A Unified Bias-Variance Decomposition(ICML, 2000)。