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 学习):
达成 PAC 所需的样本量 \(N = \Omega(\epsilon^{-2}\log\frac{1}{\delta})\)。
二、偏差-方差分解
定理(回归问题的偏差-方差分解)
设 \(f^*(x)\) 为期望风险的最优模型,\(f_{\mathcal{D}}(x)\) 为基于数据集 \(\mathcal{D}\) 学到的模型。则:
证明:对固定测试点 \(x\),记 \(\bar{f}(x) = \mathbb{E}_{\mathcal{D}}[f_{\mathcal{D}}(x)]\)。
交叉项为零因为 \(\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)
- 保持数据分布一致性(分层采样)
- 多次重复划分(如 100 次随机划分)
- 测试集比例通常 \(1/5 \sim 1/3\)
\(k\)-折交叉验证
将 \(D\) 均分为 \(k\) 份,每次用 \(k-1\) 份训练、1 份测试:
\(k=10\) 最常用。若 \(k=m\)(样本数),得留一法 (LOO):结果几乎无偏,但计算量极大。
自助法 (Bootstrap)
有放回采样 \(m\) 次。一个样本始终不被抽到的概率:
约 36.8% 的样本可做包外估计 (out-of-bag estimation)。优点:训练集与原数据集同规模,适合小数据。缺点:改变了数据分布。
调参与验证集
超参数 (hyperparameter):人为设定的参数(如学习率、正则化系数、树的深度)。
调参过程:用训练集训练多个模型,用验证集 (validation set) 选出最好的超参数,最后用训练集+验证集重新训练最终模型。
四、性能度量
分类任务
混淆矩阵
| 预测为正 | 预测为反 | |
|---|---|---|
| 实际为正 | 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
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,再计算指标
非均等代价
犯不同的错误造成不同的损失时,使用代价敏感错误率:
五、比较检验
为什么不能直接比较?
测试性能 ≠ 泛化性能;测试性能随测试集变化;学习算法本身有随机性。
交叉验证 \(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| > t_{\alpha/2, k-1}\),拒绝 \(H_0\)。
多学习器比较:Friedman + Nemenyi
- Friedman 检验:在多个数据集上对各算法排序,检验"所有算法性能是否相同"
- Nemenyi 后续检验:若 Friedman 拒绝 \(H_0\),进行两两比较
Friedman 检验图:横轴为平均序值,线段为临界域值 CD。若两个算法的线段有交叠,说明无显著差别。
2026.06