第 7 章 学习范式与模型评估

第 6 章解决了"给定损失怎么优化";本章解决两个更上位的问题:模型应该从什么样的数据里学(学习范式),以及凭什么说它学得好(模型评估)。后者的重要性常被低估——一个用错指标的模型,在训练曲线上可能完美无缺。

学习目标

读完本章,你应当能够:

  1. 辨析监督、无监督、半监督、自监督、强化学习五种范式的数据条件与目标,以及判别式模型与生成式模型的分工;
  2. 推导偏差-方差分解,并据此解释"欠拟合 = 高偏差、过拟合 = 高方差";
  3. 判断训练/验证曲线的形态对应哪种病症,并选择正确的应对手段;
  4. 设计数据划分方案:在 i.i.d. 场景用 k-fold 与分层抽样,在时序场景用滚动/前向链式交叉验证,并说明为什么时序不能随机打乱;
  5. 计算混淆矩阵派生出的全部分类指标、各回归指标与 Top-k 准确率,解释 ROC/AUC 的几何意义与概率解释;
  6. 识别指标陷阱(不平衡下的 Accuracy 失真、阈值与业务代价的错配),并用置信区间与 bootstrap 给出评估结果的不确定性。

前置知识检查

你需要知道在哪一节补齐
期望、方差、协方差的运算规则7.3.1 偏差-方差分解;第 4 章 4.4 节给出全部运算律
条件期望与全期望公式7.3.1 分解的第一步就是 E[ε] = 0 与全期望
独立同分布(i.i.d.)假设7.4.1 数据划分的前提;7.4.3 说明时序数据为什么违反它
大数定律与抽样波动7.7.1 置信区间;第 4 章 4.5 节给出大数定律与中心极限定理
逻辑回归的输出是概率7.5.1 阈值化的对象;第 9 章 9.3 节给出完整推导
条件数与矩阵求逆的稳定性7.7.2 bootstrap 的重采样视角;第 5 章 5.5 节

7.1 学习范式全景

7.1.1 五种范式的数据条件

一切机器学习问题都能用一句话概括:给定数据,找一个函数。五类范式的区别只在于"数据长什么样"和"要这个函数干什么"。

范式数据条件学习目标典型任务典型损失
监督学习(supervised)有标签 (x, y)从 x 预测 y分类、回归、排序交叉熵、MSE
无监督学习(unsupervised)只有 x发现 x 内部结构聚类、降维、密度估计重构误差、SSE
半监督学习(semi-supervised)少量 (x, y) + 大量 x借无标签数据提升监督效果标注昂贵场景的分类监督损失 + 一致性/伪标签损失
自监督学习(self-supervised)只有 x,但从 x 自身构造标签学通用表示掩码语言建模、对比学习预测被掩部分的损失
强化学习(reinforcement)与环境交互得到 (s, a, r, s′)最大化累积回报控制、决策、对齐策略梯度、TD 误差

三处最容易被考到的辨析:

  • 自监督不是无监督的别名。它同样有"标签"——只是标签由数据自己生成(把句子中的某个词挖掉、让模型预测它;或者判断两张图是不是同一张的两种增广)。因此它用的是监督式的损失,只是免去了人工标注。第 16 章的预训练目标就是自监督任务的典型形态。
  • 半监督的收益有前提。若少量标签与大量无标签数据来自不同分布,或假设(如"决策边界应穿过低密度区")不成立,无标签数据反而会损害性能。
  • 强化学习的样本不独立。相邻时间步的状态强相关,且策略一变、数据分布就变,因此它不能直接套用 7.4 节的 i.i.d. 划分方法。

7.1.2 判别式 vs 生成式

这是另一条正交的分类轴,它切的是"模型学什么":

维度判别式(discriminative)生成式(generative)
建模对象直接学 P(y|x) 或决策函数 f(x)学联合分布 P(x, y),再由贝叶斯公式得 P(y|x)
代表模型逻辑回归、SVM、神经网络分类头朴素贝叶斯、高斯判别分析、HMM、VAE、扩散模型
样本效率通常更高(不必建模 P(x) 的复杂结构)通常更低(要拟合整个数据分布)
能否生成样本不能能
能否处理缺失特征困难天然支持(对缺失变量求和/积分)
异常检测间接(看 P(y|x) 是否极端)直接(看 P(x) 是否很小)

怎么选:若唯一目标是分类准确率且标注充足,优先判别式;若需要生成样本、需要处理缺失值、或需要"数据本身有多异常"这类问题,选生成式。第 4 章的朴素贝叶斯、第 10 章的 GMM、第 16 章的生成式对齐都属于生成式一侧。

7.2 经验风险最小化与泛化

7.2.1 假设空间、真实风险与经验风险

机器学习的标准框架由四件东西定义:

  • 输入空间与输出空间:X、Y;
  • 数据分布 P(X, Y):真实但未知;
  • 假设空间 H:所有候选函数的集合(如"全部线性函数"、“全部三层 MLP”);
  • 损失函数 ℓ(y, f(x))。

真实风险(risk,也叫泛化误差) 是模型在整个数据分布上的期望损失:

R(f) = E_{(x,y)∼P}[ℓ(y, f(x))]

它是我们真正关心的量,但 P 未知,因此无法直接计算。能算的只有它在训练集上的经验版本:

经验风险(empirical risk):R̂(f) = (1/N)Σ_{i=1}^{N} ℓ(y_i, f(x_i))

经验风险最小化(Empirical Risk Minimization, ERM) 就是 f̂ = argmin_{f∈H} R̂(f)。整个监督学习几乎都是 ERM 的某种变形。ERM 面临两个独立的困难:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
困难一(近似误差 / approximation error)
  假设空间 H 太小,压根装不下好函数
  ⟹ 即使完美最小化 R̂,R(f̂) 依然很大        症状:欠拟合

困难二(估计误差 / estimation error)
  R̂ 只是 R 在 N 个样本上的估计,本身有随机波动
  最小化 R̂ 会"故意"拟合到这些波动上
  ⟹ R̂(f̂) 很小但 R(f̂) 很大                症状:过拟合

R(f̂) − min_{f∈H} R(f)  ≈  近似误差 + 估计误差

ERM 与真实风险的差距从哪来:一是有限样本(R̂ 的波动随 N 减小而缩小,量级约 O(1/√N));二是假设空间容量(H 越大,越容易找到恰好拟合噪声的 f)。二者是此消彼长的关系,第 8 章的全部技巧——正则化、早停、Dropout——都是在压制第二项的同时尽量不抬高第一项。

重要

“训练误差最小"与"泛化最好"是两个不同的目标。 ERM 只优化前者;而实践中我们通过限制假设空间(正则化)、限制优化轨迹(早停)、或增加数据来逼近后者。第 8 章会精确刻画这些手段之间的关系。

7.2.2 从曲线判断欠拟合与过拟合

把训练过程记录成曲线,是最实用的诊断工具。关键是同时看两条曲线(训练集与验证集)和两种量(损失与指标)。

训练 loss验证 loss诊断应对
高,下降很慢高,与训练 loss 接近欠拟合(高偏差)增大模型容量、加特征、减小正则、训练更久
很低先降后升过拟合(高方差)加数据、增强正则(L2/Dropout)、早停、降容量
高更高,且差距大两者兼有先解决欠拟合(容量/优化),再压制过拟合
低低且平稳良好拟合进入调参与集成阶段

为什么必须区分 loss 和 metric:loss 是训练直接优化的量、对概率变化敏感且连续;metric(如准确率)经过阈值化或取整,是分段常数的。可能出现"loss 已停止下降但准确率仍在缓慢上升”(概率分布还在改善,只是还没跨过阈值)或相反"准确率到顶但 loss 仍在降"(模型对自己越来越自信,但分类结果不变——这往往是校准恶化的前兆)。判断过拟合应以验证 loss 为主、验证 metric 为辅,因为 loss 的信息量更细。

7.3 偏差-方差分解

7.3.1 完整推导

这是本章最核心的推导,它把"泛化误差"拆成了三个来源完全不同的部分。

设定:真实关系为 y = f*(x) + ε,其中 ε 是噪声,满足 E[ε] = 0、Var(ε) = σ²,且 ε 与 x 独立。在固定训练集 D 上训练得到 f̂_D。考察在某个测试点 x 上的平方误差,对训练集的随机性取期望:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
E_D[(y − f̂_D(x))²]
  = E_D[(f*(x) + ε − f̂_D(x))²]                      代入 y 的真实关系
  = E_D[(f*(x) − f̂_D(x))²] + 2E_D[ε·(f*(x) − f̂_D(x))] + E_D[ε²]
      ↑ 交叉项:ε 与 D 独立且 E[ε]=0,故该项为 0           ↑ = σ²
  = E_D[(f̂_D(x) − f*(x))²] + σ²                     只剩第一项

  对第一项插入再减去其均值 E_D[f̂_D(x)]:
  = E_D[(f̂_D(x) − E_D[f̂_D(x)] + E_D[f̂_D(x)] − f*(x))²]
  = E_D[(f̂_D(x) − E_D[f̂_D(x)])²] + (E_D[f̂_D(x)] − f*(x))²
      ↑ 方差项                              ↑ 偏差项(是常数,其平方的期望即自身)
     交叉项 = 2·E_D[f̂_D − E_D f̂_D]·(E_D f̂_D − f*) = 0   (因 E_D[f̂_D − E_D f̂_D] = 0)

结论(偏差-方差分解):

E_D[(y − f̂_D(x))²] = Bias² + Var + σ²

1
2
3
Bias²  = (E_D[f̂_D(x)] − f*(x))²     模型平均预测与真值的偏离
Var    = E_D[(f̂_D(x) − E_D[f̂_D(x)])²] 模型预测随训练集变化的波动
σ²     = Var(ε)                       数据本身的不可约噪声

三部分的含义与可干预性完全不同:

成分含义是否可减小减小手段
偏差²模型族(假设空间)本身的表达能力不足可换更强模型、加特征、减正则
方差模型对训练集具体样本的过度敏感可加数据、加正则、bagging、降容量
不可约噪声 σ²给定 x 时 y 仍有内在随机性不可无(只能改进特征使 σ² 变小)

为什么"欠拟合 = 高偏差、过拟合 = 高方差":欠拟合时模型的平均预测就偏离真值(Bias² 大),换一批训练数据结果差不多(Var 小);过拟合时模型在训练集上的平均预测也许接近真值(Bias² 小),但换一批数据预测就剧烈变化(Var 大)——它记住了这批数据特有的噪声。降低偏差的手段几乎总是抬高方差,反之亦然,这就是著名的偏差-方差权衡(bias-variance tradeoff)。

σ² 的存在解释了一个常被忽略的事实:测试误差不可能降到零。当你在一个噪声很大的任务上追求"训练误差 0",实际是在把 Bias² + Var 全部换成 Var,总误差反而变大。

警告

偏差-方差分解只对平方损失严格成立。 对 0-1 损失或交叉熵,可以证明出类似但更复杂的分解(含额外的项,且方差项的定义要改)。考试中若出现"把平方损失下的分解直接搬到准确率上"的说法,要警惕。【09-02 场次的"集成学习偏差方差"题】考的就是"bagging 主要降方差、boosting 主要降偏差"这一结论,而不是分解公式本身。

7.4 数据集划分与交叉验证

7.4.1 训练集、验证集、测试集

三者的分工必须分清,否则会得到虚高的性能估计:

集合用途能否用于调参典型比例
训练集(train)拟合参数参数在其中被直接优化60%~80%
验证集(validation)选超参、选模型、早停是,这正是它的职责10%~20%
测试集(test)估计最终泛化误差绝对不可以10%~20%

为什么测试集不能参与任何决策:每一次"看测试集结果然后调整做法",都把测试集的信息泄漏进了模型选择过程。反复这样做,测试误差会从"对泛化误差的无偏估计"退化成"对某个特定数据集的乐观估计"。这种泄漏叫数据窥探(data snooping)。同理,特征工程必须在训练集上拟合(如标准化用的均值方差、编码用的类别字典、PCA 的主方向),再应用到验证/测试集;用全量数据算归一化参数是初学者最常犯的泄漏。

7.4.2 k-fold 交叉验证与分层抽样

当数据量小、单次划分的验证结果波动太大时,用k-fold 交叉验证(k-fold cross-validation):把训练数据等分为 k 份,轮流用其中 1 份做验证、其余 k−1 份训练,得到 k 个验证分数,取其均值与标准差。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
k = 5 的轮换(每份轮流做一次验证)

  第1轮: [验证][训练][训练][训练][训练]
  第2轮: [训练][验证][训练][训练][训练]
  第3轮: [训练][训练][验证][训练][训练]
  第4轮: [训练][训练][训练][验证][训练]
  第5轮: [训练][训练][训练][训练][验证]

  最终分数 = mean(score_1..5)  ±  std(score_1..5)
  每个样本刚好被验证 1 次、被训练 k-1 次   ⟹ 利用率 100%

k 怎么选:k 越大,每次训练用的数据越多(偏差小),但方差与计算量越大且各折之间高度相关;k = N(留一法,LOOCV)时训练集几乎等于全量,但方差反而大(各折结果近乎相同,均值估计的方差并不低)且计算最贵。实践中 k = 5 或 10 是标准折中。交叉验证的代价是训练 k 次,大模型场景通常承受不起,只在超参搜索的小规模实验里使用。

分层抽样(stratified sampling):普通 k-fold 在类别不平衡时会出问题——若正样本只占 2%,某折可能一个正样本都没有,验证指标(尤其 AUC)会剧烈波动甚至无法计算。分层要求每一折中各类别的比例与全量一致。它不只用于交叉验证,也用于单次划分:train_test_split(..., stratify=y)。

其他变体:

  • 重复 k-fold:把 k-fold 重复若干次(每次用不同随机划分),进一步降低划分随机性带来的方差;
  • 分组 k-fold(GroupKFold):同一实体(同一用户、同一病人)的样本必须整体落在同一折,否则同一实体的记录会在训练集和验证集都出现,造成信息泄漏。医学影像、推荐系统必须用这一种;
  • 留一实体交叉验证(leave-one-subject-out):分组 k-fold 的极端形式。

7.4.3 时间序列交叉验证

时序数据的核心特征是样本之间不独立:y_t 与 y_{t−1}, y_{t−2}, … 高度相关,且分布可能随时间漂移(概念漂移,第 9 章 9.6 节)。这直接违反 7.4.2 依赖的 i.i.d. 前提。

为什么时序绝对不能随机打乱:

  1. 未来信息泄漏(look-ahead leakage)。随机打乱后,验证集中的 y_t 会用训练集里的 y_{t+1} 来预测——而真实部署时 y_{t+1} 根本还不存在。这会让离线指标远高于线上表现。
  2. 相邻样本高度相关。就算没有显式泄漏,训练集里紧邻验证折的那些样本与验证样本几乎是同一条曲线的一小段,模型只要"插值"就能得到很低误差,这个低误差不代表任何预测能力。
  3. 分布漂移被掩盖。随机划分把早、中、晚期的数据混在一起,模型在两个集合上看到的分布是一样的;而真实部署是从过去预测未来,训练集与测试集分布必然有偏移。

正确做法:前向链式 / 滚动验证(forward chaining / rolling cross-validation),始终"用过去预测未来":

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
时间序数据划分(永远只向未来验证)

  时间轴 ──────────────────────────────────────────────►

  第1折: [====训练====][验证]
  第2折: [======训练======][验证]
  第3折: [========训练========][验证]
  第4折: [==========训练==========][验证]

  ── 两种推进方式 ──
  扩展窗口 (expanding):   训练集起点固定,每次把新折并进训练集
  滑动窗口 (sliding):     训练集长度固定,整体向前滑动,丢弃过老数据
  ⟹ 概念漂移剧烈时用滑动窗口(老数据已过期);
     关系稳定时用扩展窗口(数据越多越好)。

评估时需要额外记录每折的指标随时间的变化:若指标逐年下降,说明模型在漂移下失效,这比一个总平均分重要得多。

提示

判别"是不是 i.i.d.“的三个提问:①样本能否在时间上独立重复观测?(不能则时序)②同一实体的多条记录是否会同时出现在两个集合中?(会则要 GroupKFold)③标签的比例在各折中是否可能失衡?(会则要分层)。三个问题分别对应时序 CV、分组 CV、分层 CV。

7.5 评价指标全表

7.5.1 混淆矩阵与分类指标

一切二分类指标都从混淆矩阵派生:

预测正预测负合计
实际正TP(真阳)FN(假阴,漏检)P = TP+FN
实际负FP(假阳,误报)TN(真阴)N = FP+TN
合计TP+FPFN+TNTP+FN+FP+TN
指标公式惩罚什么适用场景陷阱
Accuracy(TP+TN)/(TP+FN+FP+TN)无侧重类别均衡不平衡时严重失真
Precision(精确率)TP/(TP+FP)误报(FP)垃圾邮件拦截、推荐阈值调高即可虚高
Recall(召回率)TP/(TP+FN)漏检(FN)疾病筛查、风控预警全判正即为 1
SpecificityTN/(TN+FP)负类召回与 Recall 配对不平衡时的互补视角
F12PR/(P+R)P、R 的调和平均需要单一综合分不反映真实业务代价
F_β(1+β²)PR/(β²P+R)β>1 偏 Recall漏检更贵时β 的取值需业务定
Balanced Accuracy(Recall + Specificity)/2两类同等权重不平衡忽略概率质量
MCC四项乘积差的相关系数式四格同时平衡不平衡的稳健单值不易解释
LogLoss−(1/N)Σ[y ln p + (1−y) ln(1−p)]概率校准需要概率输出对过度自信惩罚极重
AUCROC 曲线下面积排序能力阈值无关的整体评估不平衡时仍可能乐观

F1 为什么用调和平均而不是算术平均:算术平均允许"用一个很高的值掩盖另一个很低的值”(P=1, R=0 时算术平均 0.5,看起来还行);调和平均对较小值敏感(同样情形 F1 = 0),因此更能反映"两个都得好"的要求。

微平均 vs 宏平均(多分类):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
设 3 类,各类的 (TP, FP, FN):
  A: (50, 10, 5)     B: (5, 2, 40)     C: (2, 1, 3)

宏平均 (macro):先算每类指标再取算术平均 —— 每类等权
  P_A = 50/60 = 0.833, P_B = 5/7 = 0.714, P_C = 2/3 = 0.667
  macro-P = (0.833 + 0.714 + 0.667)/3 ≈ 0.738
  R_A = 50/55 = 0.909, R_B = 5/45 = 0.111, R_C = 2/5 = 0.400
  macro-R = (0.909 + 0.111 + 0.400)/3 ≈ 0.473    ← B 类的糟糕表现被平等计入

微平均 (micro):把各类 TP/FP/FN 先汇总成一个混淆矩阵再算 —— 按样本数加权
  ΣTP = 57, ΣFP = 13, ΣFN = 48
  micro-P = 57/70 ≈ 0.814,  micro-R = 57/105 ≈ 0.543
  ⟹ 样本多的类主导结果;A 类占了大多数样本,所以微平均比宏平均"好看"

加权平均 (weighted):按各类真实样本数加权,介于两者之间

怎么选:若关心"每个类别都不被忽略"(如少见病种的识别),用宏平均;若关心"整体样本的正确率"(如总量准确度),用微平均。多分类任务只报一个数字而不说明是哪种平均,是一个常见的报告缺陷。

7.5.2 ROC 与 AUC

ROC 曲线(Receiver Operating Characteristic) 的构造:把分类器的概率输出从 1 到 0 扫过所有可能阈值 τ,每个 τ 给出一个点 (FPR, TPR),把这些点连起来就是 ROC 曲线,其中

FPR = FP/(FP+TN) = 1 − Specificity(横轴),TPR = TP/(TP+FN) = Recall(纵轴)

  • 左上角 (0, 1) 是完美分类器;对角线 y = x 对应随机猜测;
  • 曲线越靠近左上角越好;
  • AUC(Area Under Curve) 就是曲线下面积,取值 [0, 1],随机猜测为 0.5。

AUC 的概率解释(必须记住):AUC 等于随机取一个正样本和一个负样本,分类器给正样本的分数高于负样本的概率:

AUC = P(score(x⁺) > score(x⁻))

这个解释立刻说明了两件事:AUC 只依赖分数的排序,与阈值无关;AUC 对类别比例不敏感(正负样本各取一个,比例被消掉了),所以在极度不平衡时它比 Accuracy 稳健得多。

AUC 的几何意义:它是"正样本分数分布"与"负样本分数分布"之间的可分离程度。两个分布重叠越少,AUC 越接近 1;完全重合则 AUC = 0.5。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
ROC 的几何(trapezoid 面积即 AUC)

  TPR
  1.0 |          ____----¤  ← 好模型:迅速上升到左上角
      |       _--¤
      |     _-¤
      |   _-¤
      |  ¤                    ···· 对角线 = 随机猜测 (AUC 0.5)
  0.0 |¤________________________
      0.0                     1.0  FPR

  好模型曲线高、AUC 大;曲线下面积 = "随机正负对排序正确"的概率。

警告

AUC 高不代表业务上好用。 AUC 是全阈值平均的排序质量,而业务往往只工作在一个特定阈值区间(如"召回率必须 ≥ 0.95")。一个 AUC 0.95 的模型在该区间内可能完全不可用。放大来看:类别极度不平衡时,FPR 的分母 FP+TN 中 TN 巨大,少量 FP 引起的 FPR 变化极小,ROC 曲线看起来仍然很漂亮,但同样的 FP 数量在 PR 曲线上会造成 Precision 断崖式下跌。不平衡 + 关心正类时,应同时看 PR 曲线与 PR-AUC。

PR 曲线(Precision-Recall):横轴 Recall、纵轴 Precision。它的基线不是 0.5 而是正类比例 π = P/(P+N)——因为"全部判正"时 Precision = π、Recall = 1。因此 PR-AUC 的绝对值要与基线比较才有意义。信息检索领域的 AP(Average Precision) 就是 PR 曲线下面积的分段近似,mAP 是多个查询/类别的 AP 平均(第 17 章的检索评估会用到)。

7.5.3 回归指标、Top-k 与排序指标

指标公式量纲对异常值的敏感度特点
MSE(1/N)Σ(y_i − ŷ_i)²y²高(误差平方放大)可导、有解析解、与高斯噪声的 MLE 对应
RMSE√MSEy高与 y 同量纲,便于解释
MAE(1/N)Σ|y_i − ŷ_i|y低(线性惩罚)与拉普拉斯噪声的 MLE 对应;在 0 处不可导
Huber小误差用平方、大误差用线性y中兼顾可导与鲁棒
R²1 − Σ(y_i−ŷ_i)²/Σ(y_i−ȳ)²无量纲高相对"只用均值预测"的提升;可为负
MAPE(1/N)Σ|(y_i−ŷ_i)/y_i|%低y_i → 0 时爆炸,不适合含零目标

R² 为什么可以为负:分母是"用均值预测"的平方误差。若模型的平方误差比"一律预测均值"还大,R² < 0。这提醒我们 R² 是相对指标,且会随测试集方差变化——测试集方差小时,同样的 MSE 会给出更难看的 R²。

Top-k 准确率:在类别极多(如 ImageNet 1000 类、推荐候选上万)时,要求"第一名必须对"过于苛刻,改为"正确答案出现在前 k 个预测中即算对"。它能区分"整体排序基本正确但冠军选错"的模型,是第 17、18 章检索与生成评估的基础。

mAP(mean Average Precision):先对每个查询/类别算 AP(PR 曲线下面积),再取平均。目标检测中的 mAP@0.5 表示 IoU 阈值取 0.5 时的 mAP。它的价值在于把排序质量与阈值无关地量化为一个数,同时兼顾 Precision 与 Recall。

7.6 指标的陷阱与阈值选择

7.6.1 类别不平衡下的 Accuracy 失真

设正样本占 1%(P = 100、N = 9900)。一个把所有样本都判为负的平凡模型:

1
2
3
4
Accuracy = (TP + TN)/总数 = (0 + 9900)/10000 = 99.0%
Recall   = TP/(TP+FN) = 0/100 = 0
Precision = TP/(TP+FP) = 0/0   未定义(或约定为 0)
F1       = 0

准确率 99% 而召回率为 0——这就是【09-02 选择 Q6】所依托的场景:疾病筛查、欺诈检测、风控预警中漏检的代价远高于误报,因此必须看 Recall。同理,【08-05 选择 Q12】指出逻辑回归的常用评价指标是 LogLoss、AUC、Accuracy,不包括 MSE:MSE 是回归指标,且作为逻辑回归的损失会因 Sigmoid 饱和导致非凸(第 6 章 6.1.4 已给出 Hessian 的显式验证)。

不平衡的通用处理思路(按推荐顺序):

手段做法注意
换指标用 PR-AUC、F_β、MCC 代替 Accuracy最省事、最不容易出错
调阈值不动模型,只移动决策阈值见 7.6.2;需要验证集定阈值
重加权给正类样本更高的损失权重等于改变了损失的定义,需重新调参
重采样过采样正类 / 欠采样负类过采样易过拟合;欠采样丢信息;SMOTE 生成合成样本
换算法用对不平衡更鲁棒的目标(如 Focal Loss)引入新超参

注意

重采样会破坏概率校准。 若把正类过采样 10 倍,模型输出的"概率"会被系统性抬高,P(y=1\|x) = 0.3 不再对应真实的 30% 概率。此时 AUC 仍大致有效(只依赖排序),但 LogLoss 与阈值化都会失真。做过采样后若要概率,必须做校准(Platt scaling / isotonic regression)。

7.6.2 阈值选择与业务代价

分类器的原始输出是概率 p = P(y=1|x),把它变成决策需要阈值 τ:ŷ = 1[p ≥ τ]。τ = 0.5 只在"漏检与误报代价相同、且类别先验均衡"时才最优,一般并不成立。

最小期望代价的阈值推导。设漏检代价 C_FN、误报代价 C_FP,则对给定 x 判正/判负的期望代价分别为

1
2
3
4
判正: C_FP·P(y=0|x)
判负: C_FN·P(y=1|x)
判正更优 ⟺ C_FP·(1 − p) < C_FN·p
        ⟺ p > C_FP/(C_FP + C_FN)    ← 最优阈值 τ*

结论:最优阈值等于"误报代价 ÷ 两类代价之和",与模型无关,只与业务代价有关。举两个极端:疾病筛查中漏检代价 C_FN 远大于 C_FP,τ* 趋近 0(宁可多报);垃圾邮件拦截中误报(把正常邮件扔进垃圾箱)代价极高,τ* 趋近 1(宁可漏拦)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
代价不对称时的阈值移动(正类极少、漏检更贵)

  密度
   |  ▁▁▁▁▁▁▁▁▁▁▁▁▁▁        负类分数分布
   | ▁▁        ▁▁▁▁▁▁▁▁      
   |▁            ▁▁▁▁▁▁▁▁▁ 正类分数分布
   +----------------------► 模型输出 p
        τ*=0.9  τ=0.5  τ*=0.1
         │       │      │
    误报极贵   默认   漏检极贵

工程做法:不要拍脑袋选阈值,而是画一条"阈值—指标"曲线,在验证集上按业务约束求解。例如"在 Precision ≥ 0.8 的前提下最大化 Recall",或"在 Recall ≥ 0.95 的前提下最小化期望代价"。阈值本身是一个超参数,必须在验证集(或交叉验证)上选定,绝不能在测试集上挑。

7.7 评估结果的不确定性

7.7.1 置信区间

在测试集上算出的准确率 â 只是一个点估计。若测试集有 n 个独立样本,则 â 的抽样标准差(标准误)约为

SE(â) ≈ √(â(1−â)/n)

由此得到 95% 置信区间 â ± 1.96·SE。n = 1000、â = 0.9 时 SE ≈ 0.0095,区间宽约 ±1.9 个百分点。两个模型的测试准确率相差 1% 时,若测试集只有 1000 个样本,这个差距完全可能是抽样噪声——这正是"调参调到小数点后两位"没有意义的统计学原因。

模型对比必须用配对方法:两个模型在同一个测试集上评估,它们的差异不该用两个独立的置信区间去比较(那样忽略了相关性),而应做配对检验(如 McNemar 检验,只统计"模型 A 对而 B 错"与"B 对而 A 错"的样本数)。

7.7.2 bootstrap

bootstrap(自助法) 是估计任意统计量不确定性的通用工具:从原始 n 个样本中有放回地抽取 n 个,得到一个"自助样本",在其上重算指标;重复 B 次(常取 1000~10000),得到指标的经验分布,用其分位数构造置信区间。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
bootstrap 流程

  原始测试集(n = 1000)
        │  有放回抽样 n 次(约 36.8% 的样本不会被抽到)
        ▼
  ┌─ 自助样本 1 → 指标 θ̂_1
  ├─ 自助样本 2 → 指标 θ̂_2
  ├─ ...                    B 次
  └─ 自助样本 B → 指标 θ̂_B

  θ̂ 的分布 → 取 2.5% 与 97.5% 分位数 = 95% 置信区间
  标准误 ≈ std(θ̂_1..θ̂_B)

bootstrap 的价值在于它不要求指标有解析的标准误——AUC、F1、PR-AUC、mAP 这些复杂指标的方差都没有简单的闭式公式,bootstrap 却可以直接给出。两个实用要点:

  • 分层 bootstrap:对不平衡数据,在每一类内部分别做有放回抽样,保证每个自助样本的类别比例与原始一致,否则某些自助样本可能没有正样本、AUC 无法计算;
  • 配对 bootstrap:比较两个模型时,对同一个自助样本同时评估两个模型,记录差值的分布。这自动处理了模型间的相关性,比分别算区间再比较更可靠。

提示

报告规范:任何"模型 A 比模型 B 好"的结论,都应给出差值及其置信区间(配对 bootstrap 或 McNemar),而不只是两个单独的数字。若差值区间跨过 0,就不能声称有提升——这是工程评审中最常被漏掉的一环。

本章小结

关键结论一句话表述常见错误
五类范式区别只在数据条件:有标签 / 无标签 / 少标签 / 自造标签 / 交互反馈把自监督当成无监督(它有自造标签)
判别 vs 生成判别式学 P(y|x),生成式学 P(x,y) 且能采样认为生成式一定分类更准(样本效率通常更低)
ERM 与泛化R(f̂) − min_H R ≈ 近似误差 + 估计误差把训练误差最小当成泛化最好
偏差-方差E[(y−f̂)²] = Bias² + Var + σ²忘了 σ² 不可约,追求训练误差 0
欠/过拟合双高 = 欠拟合(高偏差);验证先降后升 = 过拟合(高方差)只看训练曲线,或只看 metric 不看 loss
三集合验证集用于选超参,测试集不得参与任何决策用全量数据算归一化参数(数据泄漏)
交叉验证k-fold 让每样本被验证 1 次;分层保类别比例;分组保实体不跨折不平衡时用普通 k-fold,某些折无正样本
时序 CV必须前向链式:只用过去预测未来随机打乱时序(未来信息泄漏)
指标选择漏检找 Recall、误报找 Precision、不平衡弃 Accuracy多分类只报一个数而不说明宏/微平均
AUCP(score(x⁺) > score(x⁻)),阈值无关的排序能力在不平衡场景只看 AUC 不看 PR 曲线
最优阈值τ* = C_FP/(C_FP + C_FN),只由业务代价决定无条件用 0.5,且常在测试集上挑阈值
不确定性标准误约 √(â(1−â)/n);复杂指标用 bootstrap忽略抽样噪声,把 1% 的差距当真实提升

自测题

Q1(推导)写出偏差-方差分解的完整过程,并说明为什么"减小偏差"往往"增大方差"。

答案与解析

设 y = f*(x) + ε,E[ε] = 0、Var(ε) = σ²,ε ⊥ x。对训练集随机性取期望:

1
2
3
4
5
6
7
8
E_D[(y − f̂_D(x))²]
  = E_D[(f*(x) − f̂_D(x))²] + 2E_D[ε(f*(x) − f̂_D(x))] + E_D[ε²]
  = E_D[(f̂_D(x) − f*(x))²] + σ²                (交叉项因 ε 独立、均值为 0 而消失)

  记 ḡ = E_D[f̂_D(x)],在括号内加一项减一项:
  E_D[(f̂_D(x) − ḡ + ḡ − f*(x))²]
  = E_D[(f̂_D(x) − ḡ)²] + (ḡ − f*(x))² + 2(ḡ − f*(x))·E_D[f̂_D(x) − ḡ]
  =        Var                +      Bias²        + 0

关键两步:交叉项为零用到 E[ε] = 0 与 ε 与数据独立;第二个交叉项为零用到 E_D[f̂_D − ḡ] = 0。最终 E[(y−f̂)²] = Bias² + Var + σ²。

为什么此消彼长:偏差衡量"模型族的平均表达力",方差衡量"模型对具体训练样本的敏感度"。一个容量更大的模型族(更深的网络、更多特征、更少的正则)能让平均预测更贴近真值(Bias² 降),但它同时有更多自由度去拟合这批数据特有的噪声,换一批数据预测就会变(Var 升)。反之,强正则把模型"拉平",对数据不敏感(Var 降),却可能连真实结构一起压掉(Bias² 升)。这就是偏差-方差权衡,也是第 8 章所有正则化手段的作用机理。

注意:σ² 不可减小,它来自数据本身。特征工程若引入更有信息量的特征,可以让 σ² 变小,但那不是"模型变好",而是"问题变简单"。

Q2(判断 + 计算)某二分类任务正样本占 1%。模型 A 的混淆矩阵为 TP=60, FN=40, FP=900, TN=9000。求 Accuracy、Precision、Recall、F1,并判断"A 比全判负的平凡模型差"这一说法是否成立。

答案与解析
  • Accuracy = (60 + 9000)/10000 = 90.6%
  • Precision = 60/(60 + 900) = 6.25%
  • Recall = 60/(60 + 40) = 60%
  • F1 = 2×0.0625×0.6/(0.0625 + 0.6) ≈ 0.1136

平凡模型(全判负):TP=0, TN=9900,Accuracy = 99%,Recall = 0。

“A 比平凡模型差"不成立。 平凡模型的 Accuracy 更高(99% > 90.6%),但它的 Recall 为 0——一个正样本都没抓到。这正是 Accuracy 在不平衡下失真的教科书例证:TN = 9900 占据分母的 99%,把所有判对都"淹没"了。若业务关心的是别漏掉正样本(疾病筛查、欺诈检测),模型 A 的价值远高于平凡模型,尽管它的准确率更低。

正确的结论表述:若必须用一个数字,应用 AUC / PR-AUC / F_β(β > 1)或 MCC,而不是 Accuracy。这个例子也是【09-02 选择 Q6】的数值化版本:漏检敏感 ⟹ 优先关注 Recall。

Q3(辨析)判断正误并说明理由:

(a) 因为随机划分能让训练集和测试集"分布一致”,所以时间序列预测也应该随机打乱后再做交叉验证。 (b) 用交叉验证选出的最好模型的验证分数,就是对其泛化误差的无偏估计。 (c) 若把测试集从 1000 扩大到 10000,模型 A 与模型 B 之间 1% 的差距会变得更显著。

答案与解析

(a) 错,而且是最危险的一类错误。 时序数据的样本不独立,随机打乱会让验证样本的真实邻居留在训练集里,模型通过"插值"就能拿到虚低的误差,这是未来信息泄漏。更根本的是,真实部署是"用过去预测未来",训练集与测试集的分布天然有偏移,随机划分把这个偏移抹掉了,离线指标因此系统性高估线上表现。正确做法是前向链式/滚动验证(7.4.3)。

(b) 错。 交叉验证的分数是"在该数据划分与超参搜索流程下"的估计,而我们从中挑出了最大值。挑选动作本身引入了乐观偏差:设 k 个候选模型的真实性能完全相同,交叉验证分数仍会有随机波动,取最大值的那个必然偏高。数据越少、候选越多、调参越久,这个偏差越大。因此用于报告最终性能的必须是独立的测试集,或用嵌套交叉验证(内层选超参、外层估性能,见第 8 章 8.6 节)。

(c) 对。 标准误约 √(â(1−â)/n),与 n 的平方根成反比。n 从 1000 增到 10000,标准误降到约 1/3.16,区间收窄,因此 1% 的差距越来越不可能是噪声。但要补两点:①前提是两个模型在同一测试集上评估,严格比较应做配对检验(McNemar 或配对 bootstrap)而不是比较两个独立区间;②扩大测试集只能压低抽样噪声,若 1% 的差距来自系统性偏差(如测试集与线上分布不同),加样本量也救不了。

Q4(设计)某医院要做"重症风险预警",漏检(把重症判为轻症)的代价约为误报的 20 倍。数据中重症占 3%。请给出完整的评估方案:划分方式、指标、阈值策略、以及如何报告不确定性。

答案与解析

① 划分:按病人 ID 分组划分(GroupKFold),同一病人的多次就诊记录必须整体落在同一折——否则同一病人的记录会跨训练与验证出现,是典型的信息泄漏。若数据有时间维度(不同年份),外层还应套前向链式时序划分,因为诊疗规范与病种分布会漂移。测试集划出后封存,只在最终报告时用一次。

② 指标:主指标用 Recall(重症类的召回率) 与 PR-AUC(不平衡下比 ROC-AUC 更能反映正类质量);辅以 F_β(C_FN/C_FP = 20,取 β = √20 ≈ 4.5,强调召回);同时报告 LogLoss 以监控概率校准(预警系统需要可信的概率值来分级处置);禁止用 Accuracy 作为主要判据(重症仅 3%,全判轻症即 97% 准确率)。

③ 阈值:由 7.6.2 的式子 τ* = C_FP/(C_FP + C_FN) = 1/(1 + 20) = 1/21 ≈ 0.048。这是个很低的阈值——符合"宁可多报也不漏"的业务诉求。不要用 0.5,也不要用 0.05 这个纯理论值直接上线:应在验证集上画出"阈值—Recall/Precision/期望代价"曲线,取满足临床可承受误报上限、召回最大的那个点。例如"每 100 名预警患者中至少 20 名是真重症(Precision ≥ 0.2)的前提下最大化 Recall"。

④ 不确定性报告:对测试集做分层配对 bootstrap(在重症/轻症类内分别有放回抽样,且每次同一自助样本同时评估待比较的两个模型,如"新模型 vs 现行评分表"),报告 Recall 差值的 95% 置信区间与期望代价差值的区间。若区间跨 0,则不能声称改善。同时报告按时间分折的指标变化,确认没有随年份衰减。

易错点:①用随机划分(忽略同一个人的多条记录);②只看 AUC(它在不平衡时过于乐观);③阈值沿用 0.5;④只报一个点估计而不给区间。

与真题的关联

真题考查角度对应本章小节
【09-02 选择 Q3】训练精度上升、验证精度回落、验证 loss 上升过拟合的曲线识别;不合理项是"判断为欠拟合并增大容量"7.2.2(诊断表)
【09-02 选择 Q6】对漏检正样本代价敏感,优先关注哪个指标漏检 = FN,Recall = TP/(TP+FN) 分母含 FN7.5.1、7.6.1
【08-05 选择 Q12】逻辑回归的评价指标不包括MSE 是回归指标;作为逻辑回归损失还导致非凸7.5.3、7.6.1(第 6 章 6.1.4 给出凸性验证)
【09-02 场次的集成学习偏差方差】bagging / boosting 的偏差方差倾向bagging 主要降方差,boosting 主要降偏差7.3.1(Var 与 Bias² 的可干预性)
【08-05 选择 Q10 / 09-04 选择 Q6】RAG 语义检索与 chunk 数检索评估依赖 Recall@k / mAP,属 Top-k 与排序指标7.5.3
【09-04 选择 Q4】线性回归直接代入求预测值回归任务的最基础评估思维:先抄式子再代入7.5.3(MSE/RMSE/R²)

延伸阅读

  • Hastie, T., Tibshirani, R. & Friedman, J.《The Elements of Statistical Learning》第 7 章(Model Assessment and Selection)——本章 7.3、7.4 的标准参考;
  • Bishop, C.《Pattern Recognition and Machine Learning》第 3.2 节(bias-variance decomposition 的另一种展开)与第 1.5 节(决策论、代价敏感的阈值);
  • Kohavi, R. “A Study of Cross-Validation and Bootstrap for Accuracy Estimation and Model Selection”(1995)——k 取 5 或 10 的实验依据;
  • Bergmeir, C. & Benítez, J. M. “On the use of cross-validation for time series predictor evaluation”(2012)——时序交叉验证的系统讨论;
  • Fawcett, T. “An introduction to ROC analysis”(2006)——AUC 的概率解释与几何意义;
  • Efron, B. & Tibshirani, R.《An Introduction to the Bootstrap》——7.7.2 的完整方法学。