Skip to content

Chapter 4 模型评估与选择


我们要讲的故事

疾旋鼬用线性回归模型预测了 100 套房子的价格。在训练集上,MSE 只有 0.01,几乎完美!它兴冲冲地拿去给朋友用,结果预测一套新房子的价格偏差了 50%。

"模型在训练数据上表现好,不代表在新数据上也好。"

这就是过拟合 (overfitting)。模型把训练数据中的噪声和偶然细节都记住了,却失去了泛化 (generalization) 能力。

本章回答三个问题: 1. 如何公平地评估模型的泛化能力? 2. 面对多个模型,如何选出最好的那个? 3. 两个模型的性能差异是真实的,还是随机波动?

一、统计学习理论框架

基本设定

  • 数据分布 \(\mathcal{P}\)(未知)
  • 训练集 \(\mathcal{D} = \{(x_1, y_1), \ldots, (x_N, y_N)\} \stackrel{\text{i.i.d.}}{\sim} \mathcal{P}\)
  • 假设空间 \(\mathcal{F}\):预测函数的集合
  • 损失函数 \(L(f(x), y)\)

三种风险

期望风险 (Population Loss)\(R(f) = \mathbb{E}_{(x,y) \sim \mathcal{P}}[L(f(x), y)]\)——模型在"未来"数据上的期望损失,我们真正想最小化的。

经验风险 (Empirical Risk)\(R_{\mathcal{D}}^{\text{emp}}(f) = \frac{1}{N}\sum_{i=1}^N L(f(x_i), y_i)\)——训练集上的平均损失,我们实际能计算的。

泛化误差 (Generalization Error)\(\mathcal{G}_{\mathcal{D}}(f) = R(f) - R_{\mathcal{D}}^{\text{emp}}(f)\)

泛化误差的渐近行为

大数定律\(\lim_{N \to \infty} \mathcal{G}_{\mathcal{D}}(f) = 0\)。数据越多,泛化误差越趋于 0。

更精确的非渐近结果(PAC 学习):

\[P\left(R(f) - R_{\mathcal{D}}^{\text{emp}}(f) \leq O\left(\frac{1}{N}\log\frac{1}{\delta}\right)\right) \geq 1 - \delta\]

达成 PAC 所需的样本量 \(N = \Omega(\epsilon^{-2}\log\frac{1}{\delta})\)

二、偏差-方差分解

定理(回归问题的偏差-方差分解)

\(f^*(x)\) 为期望风险的最优模型,\(f_{\mathcal{D}}(x)\) 为基于数据集 \(\mathcal{D}\) 学到的模型。则:

\[R(f_{\mathcal{D}}) = \underbrace{(\mathbb{E}_{\mathcal{D}}[f_{\mathcal{D}}(x)] - f^*(x))^2}_{\text{bias}^2} + \underbrace{\mathbb{E}_{\mathcal{D}}[(f_{\mathcal{D}}(x) - \mathbb{E}_{\mathcal{D}}[f_{\mathcal{D}}(x)])^2]}_{\text{var}} + \underbrace{\epsilon^2}_{\text{噪声}}\]

证明:对固定测试点 \(x\),记 \(\bar{f}(x) = \mathbb{E}_{\mathcal{D}}[f_{\mathcal{D}}(x)]\)

\[\begin{aligned} \mathbb{E}_{\mathcal{D}}[(y - f_{\mathcal{D}}(x))^2] &= \mathbb{E}_{\mathcal{D}}[(y - \bar{f}(x) + \bar{f}(x) - f_{\mathcal{D}}(x))^2] \\ &= (y - \bar{f}(x))^2 + \text{var}(x) + 2(y - \bar{f}(x))\underbrace{\mathbb{E}_{\mathcal{D}}[\bar{f}(x) - f_{\mathcal{D}}(x)]}_{=0} \end{aligned}\]

交叉项为零因为 \(\bar{f}(x)\) 已对 \(\mathcal{D}\) 取期望。再对 \((x,y) \sim \mathcal{P}\) 取期望,并分解 \((y - \bar{f}(x))^2 = (y - f^*(x))^2 + (\bar{f}(x) - f^*(x))^2\)(交叉项为零因为 \(f^*\) 最小化期望风险)。\(\square\)

理解

  • 偏差:模型在不同训练集上的平均性能与最优模型的差距。衡量拟合能力
  • 方差:模型在不同训练集上的波动。衡量数据扰动的影响
  • 噪声:任何算法能达到的期望泛化误差下界

偏差-方差窘境

  • 训练不足:模型简单 → 偏差主导(欠拟合)
  • 训练加深:偏差下降,方差上升
  • 训练过度:模型复杂 → 方差主导(过拟合)

最优模型在偏差和方差之间取得平衡。正则化系数 \(\alpha\) 控制平衡:\(\alpha\) 增大 → 复杂度降低 → 方差减少、偏差增大。随着 \(\alpha\) 变化,测试误差呈 U 形曲线。

三、评估方法

留出法 (Hold-out)

\[D = D_{\text{train}} \cup D_{\text{test}}, \quad D_{\text{train}} \cap D_{\text{test}} = \emptyset\]
  • 保持数据分布一致性(分层采样
  • 多次重复划分(如 100 次随机划分)
  • 测试集比例通常 \(1/5 \sim 1/3\)

\(k\)-折交叉验证

\(D\) 均分为 \(k\) 份,每次用 \(k-1\) 份训练、1 份测试:

\[\text{CV} = \frac{1}{k}\sum_{i=1}^k \text{Error}(D_i)\]

\(k=10\) 最常用。若 \(k=m\)(样本数),得留一法 (LOO):结果几乎无偏,但计算量极大。

自助法 (Bootstrap)

有放回采样 \(m\) 次。一个样本始终不被抽到的概率:

\[\left(1 - \frac{1}{m}\right)^m \xrightarrow{m \to \infty} e^{-1} \approx 0.368\]

约 36.8% 的样本可做包外估计 (out-of-bag estimation)。优点:训练集与原数据集同规模,适合小数据。缺点:改变了数据分布。

调参与验证集

超参数 (hyperparameter):人为设定的参数(如学习率、正则化系数、树的深度)。

调参过程:用训练集训练多个模型,用验证集 (validation set) 选出最好的超参数,最后用训练集+验证集重新训练最终模型。

\[D = D_{\text{train}} \cup D_{\text{val}} \cup D_{\text{test}}\]

四、性能度量

分类任务

混淆矩阵

预测为正 预测为反
实际为正 TP (真正例) FN (假反例)
实际为反 FP (假正例) TN (真反例)
  • 查准率 (Precision)\(P = \frac{TP}{TP + FP}\)——"我说它是好瓜,它真的是好瓜吗?"
  • 查全率 (Recall)\(R = \frac{TP}{TP + FN}\)——"所有好瓜中,我找到了多少?"
  • F1 度量\(F_1 = \frac{2PR}{P + R}\)
  • \(F_\beta\) 度量\(F_\beta = \frac{(1+\beta^2)PR}{\beta^2 P + R}\)
  • \(\beta > 1\):查全率更重要(疾病筛查,宁可误诊不能漏诊)
  • \(\beta < 1\):查准率更重要(垃圾邮件过滤,宁可漏掉不能误杀)

ROC 与 AUC

\[\text{TPR} = \frac{TP}{TP + FN}, \quad \text{FPR} = \frac{FP}{FP + TN}\]

ROC 曲线:以 FPR 为横轴、TPR 为纵轴。根据学习器的预测结果按正例可能性排序,逐个把样本作为正例预测,计算 FPR/TPR,画点连线。

  • 完美预测:\((0, 1)\)
  • 随机猜测:对角线
  • 低于对角线:比投硬币还差

AUC (Area Under ROC Curve):ROC 曲线下面积。\(0 \leq \text{AUC} \leq 1\)

宏平均 vs. 微平均

  • 宏平均 (Macro):每类作为二分类问题,求各指标的算术平均。更关注小类别
  • 微平均 (Micro):先汇总所有类的 TP/FP/FN/TN,再计算指标

非均等代价

犯不同的错误造成不同的损失时,使用代价敏感错误率:

\[E(f; D)_{\text{cost}} = \frac{1}{m}\left(\sum_{x_i \in D^+} \mathbb{I}(f(x_i) \neq y_i) \times \text{cost}_{01} + \sum_{x_i \in D^-} \mathbb{I}(f(x_i) \neq y_i) \times \text{cost}_{10}\right)\]

五、比较检验

为什么不能直接比较?

测试性能 ≠ 泛化性能;测试性能随测试集变化;学习算法本身有随机性。

交叉验证 \(t\) 检验

对两个学习器 \(A, B\),在 \(k\)-折 CV 中得到 \(k\) 对结果 \(d_i = \text{Error}_A^{(i)} - \text{Error}_B^{(i)}\)

假设 \(d_i \stackrel{\text{i.i.d.}}{\sim} \mathcal{N}(\mu, \sigma^2)\),检验 \(H_0: \mu = 0\)

\[t = \frac{\bar{d}}{\sqrt{\sigma^2/k}}\]

\(|t| > t_{\alpha/2, k-1}\),拒绝 \(H_0\)

多学习器比较:Friedman + Nemenyi

  1. Friedman 检验:在多个数据集上对各算法排序,检验"所有算法性能是否相同"
  2. Nemenyi 后续检验:若 Friedman 拒绝 \(H_0\),进行两两比较

Friedman 检验图:横轴为平均序值,线段为临界域值 CD。若两个算法的线段有交叠,说明无显著差别。


2026.06