Skip to content

02 — 模型评估与验证(Model Evaluation & Validation)

在经典机器学习(Classical Machine Learning)中,我们最关心的问题是:训练好的模型在未见过的数据上表现如何? 本章围绕模型评估(Model Evaluation)与验证(Validation)展开,涵盖过拟合(overfitting /ˈoʊvərˈfɪtɪŋ/)与欠拟合(underfitting /ˈʌndərˈfɪtɪŋ/)的诊断(Overfitting vs Underfitting)、数据集的正确划分(Train/Val/Test Split)、交叉验证(Cross-Validation)、学习曲线(Learning Curves)以及分类(classification /ˌklæsɪfɪˈkeɪʃən/)任务的核(kernel /ˈkɜːrnl/)心评估指标(Metrics)。学习曲线是本章的重点——它是诊断模型状态的"X光片"。


1. 过拟合 vs 欠拟合(Overfitting vs Underfitting)

1.1 核心直觉

机器学习模型在训练数据上的表现和在测试数据上的表现之间,存在一道根本性的鸿沟。**过拟合(Overfitting)欠拟合(Underfitting)**是模型失效的两种极端形式:

状态通俗理解统计根源
欠拟合(Underfitting)模型太简单,连训练数据都没学明白高偏差(High Bias)——模型假设与真实分布差距过大
过拟合(Overfitting)模型太复杂,把训练数据的噪声也"背下来了"高方差(High Variance)——模型对训练集的波动过度敏感
               欠拟合 ←────────── 适中 ──────────→ 过拟合
               (高偏差)          (平衡)            (高方差)
                   
训练误差:    高                 中低              极低(≈0)
测试误差:    高                 最低              高

1.2 多项式回归的直观演示

假设真实函数为:

f(x)=sin(2πx)+ε,εN(0,0.12)

我们用不同阶数的多项式来拟合:

  • 度=1(欠拟合,Underfitting):一条直线,无法捕捉 sin 的波动。训练误差和测试误差都很高,因为模型假设(线性)与数据真实分布严重不匹配。→ 高偏差(High Bias)

  • 度=3(适中):较好地捕捉了 sin 的波动趋势,同时在未见数据上也能泛化。训练误差和测试误差都较低,且两者接近。→ 偏差-方差平衡(Bias-Variance Tradeoff)

  • 度=15(过拟合,Overfitting):完美穿过每一个训练点,但在训练点之间剧烈震荡。训练误差几乎为 0,但测试误差非常大。→ 高方差(High Variance)

预测曲线示意(度=15 过拟合):
   
   y ↑
     |   ╱╲        ╱╲
     |  ╱  ╲  ╱╲  ╱  ╲
     | ╱    ╲╱  ╲╱    ╲
     |╱           训练点 ●
     |                  ╲
     └────────────────────────→ x

1.3 偏差-方差权衡(Bias-Variance Tradeoff)

期望测试误差可以分解为三个部分(详见第 2 卷第 5 章):

E[(Yf^(X))2]=Bias2[f^(X)]偏差²+Var[f^(X)]方差+σ2不可约误差
  • 偏差(Bias):模型预测的期望值与真实值的差距。简单模型偏差高。
  • 方差(Variance):模型对不同训练集的敏感程度。复杂模型方差高。
  • 不可约误差(Irreducible Error):数据本身的噪声,任何模型都无法消除。
测试误差分解随模型复杂度的变化趋势:

Error

  |   Total Error (测试误差)
  |      ╱╲
  |     ╱  ╲         Variance² (方差)
  |    ╱    ╲       ╱
  |   ╱      ╲     ╱
  |  ╱        ╲   ╱
  | ╱          ╲ ╱
  |╱            Bias² (偏差²)
  └──────────────────────→ 模型复杂度

最优模型 ←── 在偏差和方差的交汇处

2. 训练/验证/测试集(Train/Val/Test Split)

2.1 为什么需要三个集合?

如果我们只用训练集来评估模型,会发生数据泄露(Data Leakage)——模型的信息间接"泄露"到了评估过程中,导致我们对模型性能过于乐观。

数据集用途⚠️ 禁止行为
训练集(Training Set)训练模型参数(parameter /pəˈræmɪtər/)不能用于调整超参数(hyperparameter /ˈhaɪpərpəˈræmɪtər/)
验证集(Validation Set)选择模型、调超参数、做早停不能用于最终评估
测试集(Test Set)最终评估泛化性能不能用于任何训练决策
完整流程:

原始数据

   ├── 训练集(60-80%)──→ 训练模型 ──→ 在验证集上评估 ──→ 调参/选模型
   │                                      ↑
   │                                      │ (迭代多次)
   │                                      └─────────────────┘

   ├── 验证集(10-20%)──→ 用于模型选择和超参数调优

   └── 测试集(10-20%)──→ 最终评估(仅一次!)

黄金法则(Golden Rule):测试集只能使用一次。如果在测试集上反复调参,测试集实际上变成了验证集,你得到的性能指标将不再可信。

2.2 常见的划分比例

  • 小数据集(<10K 样本):60% 训练 / 20% 验证 / 20% 测试
  • 大数据集(>1M 样本):98%+ 训练 / 1% 验证 / 1% 测试——验证集和测试集只需要足够大以获得统计上可靠的估计即可
  • 深度学习场景:验证集通常从训练集中划出 10%20%

2.3 K 折交叉验证(K-Fold Cross-Validation)

当数据量有限时,将数据划分为固定验证集会浪费太多训练数据。**交叉验证(Cross-Validation, CV)**通过重复使用数据来解决这个问题。

K 折交叉验证(K-Fold CV)

将数据集均分为 K 份(折,Fold),轮流用其中 K−1 份训练、1 份验证,重复 K 次:

K-Fold CV(K=5)示意:

Fold 1: [🟩🟩🟩🟩⬜]  ➜  验证集 = Fold 5
Fold 2: [🟩🟩🟩⬜🟩]  ➜  验证集 = Fold 4
Fold 3: [🟩🟩⬜🟩🟩]  ➜  验证集 = Fold 3
Fold 4: [🟩⬜🟩🟩🟩]  ➜  验证集 = Fold 2
Fold 5: [⬜🟩🟩🟩🟩]  ➜  验证集 = Fold 1
        ─────────────
         🟩 = 训练   ⬜ = 验证

最终得分 = (Score₁ + Score₂ + ... + Score₅) / 5

K 的典型选择

  • K=5K=10:实践中最常用的值
  • K 越大:偏差越小(用了更多训练数据),但方差越大(验证集更小),计算成本也越高

留一法交叉验证(Leave-One-Out Cross-Validation, LOOCV)

LOOCV 是 K-Fold 的极端情况:K=N(样本数),每次只留一个样本作为验证集。

  • 优点:几乎无偏(使用了几乎全部数据训练)
  • 缺点:计算成本极高(需要训练 N 次);方差可能很高(验证集只有一个样本)

分层 K 折(Stratified K-Fold)

对于分类问题,尤其是**类别不平衡(Class Imbalance)**的数据集,普通 K-Fold 可能产生某一折完全没有某类样本的情况。分层 K 折保证每一折中各类别的比例与原始数据集一致。

2.4 数据泄露(Data Leakage)——必须避免的陷阱

**数据泄露(Data Leakage)**是训练数据中混入了测试数据的信息,导致评估结果虚假偏高。常见来源:

泄露类型示例正确做法
特征泄露用全体数据的均值和标准差做归一化(normalization /ˌnɔːrmələˈzeɪʃən/)先划分再归一化,只计算训练集的统计量
时间泄露用未来的数据预测过去时间序列必须使用时间序列交叉验证(Time Series CV)
预处理泄露在划分前做特征选择或 PCA所有预处理步骤必须在训练集内进行

核心原则:整个建模流程中,测试集必须是"从未见过"的数据。任何从测试集流向训练集的信息都是泄露。


3. 学习曲线(Learning Curves)

3.1 什么是学习曲线?

学习曲线(Learning Curves)是诊断模型状态的最有效的可视化工具。它绘制的是**训练集大小(Training Set Size)训练/验证误差(Train/Validation Error)**之间的关系。

3.2 如何解读学习曲线

学习曲线的三种典型模式:

模式 A:欠拟合(Underfitting)—— 两条曲线收敛在高处

Error


  │    Train Error ───────────
  │    Val Error  ────────────
  │                           ← 训练误差也很高,验证误差更高但接近

  └──────────────────────────→ Training Size
  • 特征:训练误差和验证误差都很高(>0.1),且曲线早早收敛(增加更多数据无帮助)
  • 诊断:模型容量不够,无法捕捉数据的真实模式
  • 对策:增加模型复杂度(更多特征、更高阶多项式、更深网络)、减少正则化(regularization /ˌreɡjələraɪˈzeɪʃən/)

模式 B:过拟合(Overfitting)—— 两条曲线之间有巨大差距

Error

  │                        Val Error ──
  │                       ╱
  │    Train Error ───────╯   ← 差距大(泛化鸿沟)
  │    ╰── 训练误差很低

  └──────────────────────────→ Training Size
  • 特征:训练误差很低(趋近于 0),但验证误差很高,且两者之间存在巨大且不收敛的鸿沟(Generalization Gap)
  • 诊断:模型记忆了训练数据的噪声
  • 对策:增加数据量、降低模型复杂度、增加正则化(L1/L2/Dropout)、早停(Early Stopping)

模式 C:良好拟合(Good Fit)—— 两条曲线收敛在低处

Error


  │    Train Error ──╮
  │                  ├── 都低且收敛
  │    Val Error  ───╯

  └──────────────────────────→ Training Size
  • 特征:训练误差和验证误差都较低,且随着数据量增加逐渐收敛到接近的值
  • 诊断:模型容量合适
  • 对策:可以尝试增加更多数据来进一步降低验证误差(如果仍有下降趋势)

3.3 学习曲线的价值

场景是否增加数据?是否增加模型复杂度?是否增加正则化?
欠拟合❌ 无效✅ 需要❌ 会恶化
过拟合✅ 有效❌ 会恶化✅ 需要
良好拟合⚠️ 可能小幅提升⚠️ 需要谨慎⚠️ 可能过度

核心洞见(Key Insight):学习曲线告诉我们瓶颈在哪里。如果增加数据后验证误差不再下降,说明模型已经达到容量极限(欠拟合),此时需要更复杂的模型,而不是更多数据。反之,如果训练误差远低于验证误差(过拟合),那么更多数据通常会缩小这个差距。

3.4 验证曲线(Validation Curves)

与学习曲线不同,验证曲线展示的是**某个超参数(如多项式阶数、正则化强度 λ)**与训练/验证误差的关系:

Error

  │               Val Error
  │              ╱    ╲
  │             ╱      ╲
  │    Train   ╱        ╲
  │    Error  ╱          ╲
  │          ╱    最优 λ   ╲
  └─────────────────────────→ λ (正则化强度)

验证曲线帮助我们选择最优的超参数——即验证误差最低的点


4. 评估指标(Evaluation Metrics)

4.1 分类任务的混淆矩阵(Confusion Matrix)

对于二分类问题,我们可以将预测结果与真实标签对比,得到一个 2×2 的矩阵:

预测为正(Positive)预测为负(Negative)
真实为正(Positive)TP(True Positive) 真正例FN(False Negative) 假负例(漏报)
真实为负(Negative)FP(False Positive) 假正例(误报)TN(True Negative) 真负例

从这个矩阵衍生出所有分类指标。

4.2 核心指标详解

准确率(Accuracy)

Accuracy=TP+TNTP+TN+FP+FN
  • 含义:所有预测中正确的比例
  • ⚠️ 致命缺陷:在**类别不平衡(Class Imbalance)**时完全失效。例如,99% 的样本为负类时,一个"永远预测为负"的分类器也能达到 99% 的准确率
  • 使用建议:仅在各类别均衡时使用

精确率(Precision)

Precision=TPTP+FP
  • 含义:在模型预测为正类的样本中,有多少是真正的正类
  • 何时重要误报(FP)代价很高的场景。例如:垃圾邮件过滤(把正常邮件误判为垃圾邮件)、医疗诊断中的"良性误判为恶性"(不希望吓到患者)
  • 别名正预测值(Positive Predictive Value, PPV)

召回率(Recall)

Recall=TPTP+FN
  • 含义:在所有真正的正类样本中,模型成功找出了多少
  • 何时重要漏报(FN)代价很高的场景。例如:癌症筛查(漏掉一个癌症患者的后果比误报严重得多)、欺诈检测
  • 别名敏感度(Sensitivity)真正率(True Positive Rate, TPR)

F1 分数(F1 Score)

F1=2×Precision×RecallPrecision+Recall
  • 含义:精确率和召回率的调和平均数(Harmonic Mean)
  • 为什么用调和平均而不是算术平均?:调和平均对较小值更敏感。只有当精确率和召回率都高时,F1 才会高
  • 使用场景:需要同时权衡精确率和召回率的场景
Precision-Recall 权衡示例:

Precision ↑
   1.0 ┼
        │        ● (高精确率, 低召回率)
        │             保守模型——只有很确定时才预测为正

        │              ● 最优 F1

        │  ● (低精确率, 高召回率)
        │       激进模型——尽量把所有可能的正类都找出来
   0.0 ┼──────────────────→ Recall
       0.0                         1.0

何时使用哪个指标?

指标适用场景不适用场景
Accuracy类别均衡(如手写数字识别)类别不平衡(如罕见病检测)
PrecisionFP 代价高(如垃圾邮件过滤)FN 代价高的场景
RecallFN 代价高(如癌症筛查)FP 代价高的场景
F1需要平衡 P 和 R;类别不平衡当精确率或召回率单独有明确优先级时
ROC-AUC需要评估排序能力;类别相对平衡极度不平衡时可能过于乐观

4.3 ROC 曲线与 AUC

ROC 曲线(Receiver Operating Characteristic Curve)

ROC 曲线绘制的是不同分类阈值下的真正率(TPR) vs 假正率(FPR)

TPR=TPTP+FN=RecallFPR=FPFP+TN
ROC Curve 示意:

TPR (Recall) ↑
   1.0 ┼────────────────────── 完美分类器
        │                  ╱
        │               ╱
        │   AUC = 0.9  ╱
        │            ╱
        │         ╱          ← ROC 曲线
        │      ╱
        │   ╱
        │ ╱              ───────── 随机猜测(AUC = 0.5)
   0.0 ┼──────────────────────────→ FPR
       0.0                         1.0

ROC 曲线解读

  • 曲线越靠近左上角(TPR 高、FPR 低),模型性能越好
  • 对角线(Random Classifier):完全随机(stochastic /stəˈkæstɪk/)猜测,AUC = 0.5
  • 左上角点(0,1):完美分类器

AUC(Area Under the ROC Curve)

AUC 是 ROC 曲线下的面积,是一个标量(scalar /ˈskeɪlər/)指标:

  • AUC = 1.0:完美分类器
  • AUC = 0.5:随机猜测
  • AUC < 0.5:比随机还差(可能标签有误或模型存在系统偏差)

AUC 的概率解释:AUC 等于随机抽取一个正样本和随机抽取一个负样本时,模型将正样本排在负样本前面的概率。即:

AUC=P(正样本的预测分数>负样本的预测分数)

ROC-AUC vs Precision-Recall 曲线

ROC-AUCPR-AUC
对类别不平衡的敏感性不敏感(FPR 的分母包含大量负样本)敏感
推荐使用场景类别相对平衡类别极度不平衡
高值含义正负样本排序能力强在少数类上的区分能力强

经验法则:当正类比例 <5% 时,优先使用 PR 曲线和 PR-AUC 而不是 ROC-AUC。

4.4 回归任务的评估指标

虽然本章聚焦于分类,简要列出回归(regression /rɪˈɡreʃən/)任务的核心指标:

MSE=1ni=1n(yiy^i)2RMSE=MSEMAE=1ni=1n|yiy^i|R2=1i(yiy^i)2i(yiy¯)2
指标特点
MSE对大误差惩罚更重(平方项),有单位平方
RMSE恢复原始单位,更可解释
MAE对所有误差一视同仁,更鲁棒
R2取值范围 (,1],解释为"模型解释了总方差的百分之多少"

本章小结

概念要点
过拟合 vs 欠拟合过拟合 = 高方差(训练误差≪测试误差);欠拟合 = 高偏差(训练误差和测试误差都很高)
数据划分训练/验证/测试三集分离;K-Fold CV 在数据有限时更高效;严防数据泄露
学习曲线绘制训练/验证误差 vs 训练集大小——欠拟合时两线收敛在高处,过拟合时两线之间有鸿沟
分类指标不平衡类不用 Accuracy;FP 代价高用 Precision;FN 代价高用 Recall;兼顾用 F1;排序能力看 AUC
ROC-AUC判断正负样本排序能力的标量;AUC = P(正样本分 > 负样本分)
诊断流程图:

训练完成后

  ├── 训练误差高?─────────→ 欠拟合 → 增大模型容量 / 减少正则化

  └── 训练误差低?

        ├── 验证误差低?───→ ✅ 良好

        └── 验证误差高?

              ├── 更多数据有效?──→ 过拟合 → 加数据 / 加正则化 / 降复杂度

              └── 更多数据无效?──→ 欠拟合 → 增大模型容量

进一步阅读


下一章:03 — 线性模型与正则化