模型评估不是寻找一个“最高”的数字,而是回答一组更具体的问题:预测为阳性的样本可靠吗?真实阳性是否被漏掉?把阈值调高后会牺牲多少召回?在正负样本极不平衡时,99% 的 Accuracy 是否只是表象?这些问题都可以从混淆矩阵开始回答。

本文默认讨论二分类任务,并约定“正类”是业务最关心的事件,例如欺诈、疾病、缺陷或用户流失。这个约定并非数学上的固定规则;改变正类定义,Precision、Recall 和 ROC 的解释也随之改变。

一张混淆矩阵,四种结果

分类器在某个阈值下会把每个样本判为正或负。将预测结果与真实标签交叉计数,得到混淆矩阵:

真实标签 \ 预测标签 预测为正 预测为负
真实为正 TP(真正例) FN(假负例)
真实为负 FP(假正例) TN(真负例)
  • TP(true positive):真实为正,模型也判为正。例如真实欺诈交易被拦截。
  • FP(false positive):真实为负,模型却判为正。例如正常交易被误拦截。
  • FN(false negative):真实为正,模型却判为负。例如欺诈交易被放过。
  • TN(true negative):真实为负,模型也判为负。

四个格子的总和就是样本数 $N$:

\[N = TP + FP + FN + TN\]

混淆矩阵不是某个“指标之前的中间产物”,而是阈值确定后分类行为的完整摘要。Accuracy、Precision、Recall、Specificity 和 F1 都只是从这四个数取不同的比值。因此,评审模型时应先看矩阵的绝对数量,再看百分比:把 1 个 FN 写成“Recall 90%”与把 10,000 个 FN 写成“Recall 90%”,业务含义完全不同。

贯穿示例:先把账算清楚

假设测试集有 1,000 个样本,其中真实正例 100 个、真实负例 900 个。当前阈值下:

真实标签 \ 预测标签 预测为正 预测为负 合计
真实为正 $TP = 80$ $FN = 20$ 100
真实为负 $FP = 40$ $TN = 860$ 900
合计 120 880 1,000

后续所有计算都来自这张表。这里模型找到了 80 个正例,漏掉 20 个;它发出的 120 次“正类”告警中,40 次是误报。

Accuracy:总体上答对了多少

Accuracy(准确率)是全部样本中预测正确的比例:

\[\text{Accuracy} = \frac{TP + TN}{TP + FP + FN + TN}\]

示例中:

\[\text{Accuracy} = \frac{80 + 860}{1000} = 94\%\]

Accuracy 适合在正、负类比例相对均衡,且 FP 与 FN 代价近似时作为摘要指标。它的危险在于会被类别不平衡掩盖:若 1,000 个样本中只有 10 个正例,一个永远预测负类的模型就有 $990 / 1000 = 99\%$ Accuracy,却一个正例也找不到,Recall 为 0。因此“准确率很高”在罕见病筛查、欺诈检测、入侵检测等任务中可能毫无价值。

术语提醒:中文语境中 Accuracy 常译为“准确率”,Precision 常译为“精确率”或“查准率”。二者不要混用。

Precision:模型发出的正类信号有多可信

Precision(精确率、查准率)只审视“预测为正”的样本:

\[\text{Precision} = \frac{TP}{TP + FP}\]

它回答的问题是:模型说“是”的时候,有多大比例真的“是”? 示例中:

\[\text{Precision} = \frac{80}{80 + 40} = 66.7\%\]

也就是说,每 3 次告警约有 1 次误报。对人工审核成本高、误报会伤害用户体验或触发昂贵处置的场景,Precision 通常是关键约束。Precision 不是模型的恒定属性:它依赖阈值,也依赖数据中的正类基率。同一模型在“真实欺诈率 1%”和“经过初筛后欺诈率 20%”的人群上,Precision 可能大幅不同。因此上线报告必须说明评估人群、时间窗口与正类定义。

当 $TP + FP = 0$,即模型从不预测正类时,Precision 在数学上没有定义。工程实现通常用零、NaN 或 warning 处理;应在报告中明确 zero-division 策略,不能把该情形误读为“Precision 很高”。

Recall:真实正例被找回了多少

Recall(召回率、查全率、敏感度)只审视“真实为正”的样本:

\[\text{Recall} = \frac{TP}{TP + FN}\]

它回答的问题是:所有应该找出来的正例中,模型找回了多少? 示例中:

\[\text{Recall} = \frac{80}{80 + 20} = 80\%\]

也就是说,模型漏掉了 20% 的正例。漏诊成本高的医学筛查、安全检测和合规风险识别,通常优先要求 Recall 达到下限,再在满足下限的阈值中提升 Precision。Recall 的补集是假负例率

\[\text{FNR} = \frac{FN}{TP + FN} = 1 - \text{Recall}\]

示例的 FNR 为 20%。在风险讨论中,把 Recall 换写成“每 100 个真实风险事件漏掉 20 个”通常更容易被业务方正确理解。

Specificity 与假正例率:ROC 的另一条坐标轴

Specificity(特异度)衡量真实负例被正确排除的比例:

\[\text{Specificity} = \frac{TN}{TN + FP}\]

示例中 Specificity 为 $860 / 900 = 95.6\%$。其补集是假正例率(false positive rate, FPR):

\[\text{FPR} = \frac{FP}{FP + TN} = 1 - \text{Specificity}\]

示例中 FPR 为 $40 / 900 = 4.4\%$。要注意 FPR 的分母是所有真实负例,而不是所有预测为正的样本;因此 FPR 与 Precision 不是同一个量。

F1:为什么用调和平均

F1 score 将 Precision 与 Recall 合并为一个数:

\[F_1 = 2 \cdot \frac{\text{Precision} \cdot \text{Recall}} {\text{Precision} + \text{Recall}} = \frac{2TP}{2TP + FP + FN}\]

示例中:

\[F_1 = 2 \cdot \frac{0.667 \times 0.8}{0.667 + 0.8} \approx 72.7\%\]

它采用的是调和平均,而不是算术平均。调和平均会更严厉地惩罚短板:Precision 为 1、Recall 为 0 时,F1 为 0;一个极高的单项分数无法掩盖另一项为零。F1 适合希望在“误报”和“漏报”之间取得相对均衡、且 TN 数量不应主导评价的任务,尤其常见于信息检索、实体识别与稀有正类分类。

但“F1 高”不等于业务最优:

  • F1 不使用 TN。若正确拒绝负例本身有重要价值,F1 会忽略这部分收益。
  • F1 隐含 Precision 与 Recall 同等重要。若漏报的代价远大于误报,应该用 $F_\beta$ 或直接基于成本做阈值决策。
  • F1 是阈值相关指标。不同阈值下,F1 会变;报告应同时给出对应阈值和混淆矩阵。

更一般地,$F_\beta$ 允许人为增加 Recall 或 Precision 的权重:

\[F_\beta = (1 + \beta^2) \frac{\text{Precision} \cdot \text{Recall}} {\beta^2 \cdot \text{Precision} + \text{Recall}}\]

$\beta > 1$ 时更重视 Recall;$\beta < 1$ 时更重视 Precision。例如 $F_2$ 比 F1 更不愿意漏掉正例。

阈值不是 0.5 的同义词

许多分类器先输出一个分数或概率 $s(x)$,再用阈值 $t$ 转为标签:

\[\hat{y} = \begin{cases} 1, & s(x) \ge t \\ 0, & s(x) < t \end{cases}\]

降低阈值会把更多样本判为正:通常 TP 增多、FN 减少,所以 Recall 上升;同时 FP 也更可能增多,所以 Precision 常下降。提高阈值则反向作用。这是 Precision-Recall 权衡的来源,而非“模型忽好忽坏”。

0.5 只是在特定条件下的默认选择:输出是校准良好的概率、两类误判代价相同、类别先验与训练部署一致。实际业务经常不满足这些条件。更稳妥的阈值选择流程是:

  1. 在验证集上固定正类定义与数据切分,避免用测试集调阈值;
  2. 给出 Recall 下限、可接受的 FP 数量、人工审核容量或单位成本;
  3. 在阈值网格上计算混淆矩阵、Precision、Recall、F1 和成本;
  4. 选择满足约束的阈值,并在独立测试集或时间外样本上复核;
  5. 上线后监控基率、分数分布和各指标漂移,必要时重新校准或调整阈值。

ROC:扫描所有阈值的 TPR-FPR 曲线

单一混淆矩阵对应一个阈值;ROC(receiver operating characteristic)曲线把阈值从高到低扫描。对每个阈值计算:

  • 纵轴:$TPR = \text{Recall} = TP / (TP + FN)$;
  • 横轴:$FPR = FP / (FP + TN)$。

阈值极高时,几乎无人被判为正,曲线接近 $(0, 0)$;阈值极低时,几乎所有人被判为正,曲线接近 $(1, 1)$。曲线越靠近左上角,代表在较低 FPR 下获得较高 TPR,区分能力越强。

随机排序器的 ROC 期望接近对角线 $TPR = FPR$。ROC 曲线低于对角线意味着分数方向可能反了;交换正负方向后可得到优于随机的结果。这一诊断只针对排序方向,不意味着模型已经适合上线。

ROC 展示的是阈值权衡,但它不告诉你阈值应选在哪里,也不体现 FP 与 FN 的具体成本。应把 ROC 当作比较排序能力与筛选候选阈值的工具,而不是最终业务决策本身。

AUC:ROC 曲线下面积究竟表示什么

AUC(area under the ROC curve)通常指 ROC-AUC,即 ROC 曲线下的面积,范围为 $[0, 1]$:

  • $1$:所有正例的得分均高于所有负例,可以被完美排序;
  • $0.5$:与随机排序相当;
  • 小于 $0.5$:排序方向整体反向时可能出现。

AUC 的一个更直观解释是:随机抽取一个正例和一个负例,模型把正例排在负例之前的概率;若两者并列,常按 0.5 计入。这一解释揭示了 AUC 的本质是排序指标:它评估相对次序,而不是概率是否真的等于发生频率,也不是任何固定阈值下的 Precision 或 Recall。

因此,两个重要边界必须牢记:

  1. AUC 高不保证阈值可用。 一个 AUC 很高的模型仍可能在当前阈值下 Recall 太低、FP 太多,或在业务关注的低 FPR 区域表现不佳。
  2. AUC 不检验校准。 若将所有预测概率做严格单调变换,排序不变,AUC 也不变;但“0.8 表示 80% 概率”的含义可能已经失真。需要概率决策时,还应看校准曲线、Brier score 或对数损失。

为什么类别极不平衡时不能只看 ROC-AUC

ROC 的横轴 FPR 以所有负例为分母。在正例极少、负例极多时,即使 FPR 很低,绝对 FP 数也可能足以压垮人工审核队列;同时 ROC-AUC 可能显得很乐观。此时应同时绘制 Precision-Recall 曲线,并报告 PR-AUC 或 average precision、固定 Recall 下的 Precision、以及固定审核容量下的正例命中数。

PR 曲线的基线不是固定的 0.5,而是正类基率。例如正例占 1%,随机分类器的 Precision 基线约为 1%。比较不同数据集上的 PR-AUC 时,必须注意基率不同会改变基线,不能直接作出强弱结论。

指标之间如何选:从错误代价出发

场景问题 优先观察 不能忽略的补充
类别均衡、两类错误代价相近 Accuracy 混淆矩阵、每类 Recall
告警后人工成本高、误报伤害大 Precision Recall、告警量、FP 绝对数
漏检风险高,如疾病或安全事件 Recall Precision、FNR、后续处置能力
希望平衡查准与查全,TN 不关键 F1 / $F_\beta$ 阈值、混淆矩阵
比较模型整体排序能力 ROC-AUC 业务工作点的 TPR/FPR
正类稀少且关注告警质量 PR 曲线、average precision 固定审核量下的 Precision/Recall
要按概率做定价、资源分配或风险决策 校准指标 ROC-AUC、业务成本曲线

选择指标前必须先把 FP 和 FN 译成真实后果。把正常用户拦截一次的代价、漏过一次欺诈的损失、人工审核一条告警的成本、漏诊的风险都可能不同。若这些成本可量化,最直接的目标是最小化期望成本,而不是机械地最大化 F1 或 AUC。

多分类时,先看“每一类”,再看平均

多分类问题不再只有一个正类。常用做法是对每个类别采用 one-vs-rest:把该类视为正类,其他所有类视为负类,分别计算 Precision、Recall、F1。然后使用不同平均方式汇总:

  • Macro average:先对每个类别算指标,再做不加权平均。每个类别权重相同,能暴露小类表现差的问题。
  • Weighted average:按各类别样本数加权平均。更接近总体样本表现,但大类会主导结果。
  • Micro average:先把所有类别的 TP、FP、FN 汇总,再计算指标。单标签多分类中,micro Precision、micro Recall 和 Accuracy 数值相同;它偏向频繁类别。
  • Per-class report:逐类列出结果。它通常是最不可省略的一张表,因为任何平均值都可能掩盖某个关键类别失效。

多分类 ROC-AUC 还需要声明 one-vs-rest 或 one-vs-one 的计算方式,以及 macro 或 weighted 聚合方式。缺失这些设定的 “AUC = 0.91” 不具备可复现的解释。

常见误读与复习陷阱

  1. “Accuracy 94%,所以模型很好。” 不成立。先问正类比例、FN 和 FP 的绝对数量、两类错误代价。
  2. “Precision 高,说明没漏检。” 不成立。Precision 对 FN 不敏感;模型只报极少数最确定的案例也能有高 Precision,同时 Recall 很低。
  3. “Recall 高,说明告警很可信。” 不成立。把所有样本判正可得到 Recall 100%,但 Precision 会降到正类基率。
  4. “F1 是 Accuracy 的升级版。” 不成立。F1 不含 TN;二者评价的对象不同。
  5. “AUC 代表 80% 的预测会正确。” 不成立。ROC-AUC 表示排序能力,不是分类 Accuracy,也不是概率校准质量。
  6. “阈值必须是 0.5。” 不成立。阈值应由成本、容量、正类基率与概率校准共同决定。
  7. “验证集指标可以直接发布。” 不成立。调参、选特征、选阈值都用过验证集后,它不再是独立证据;必须保留最终测试集或采用嵌套交叉验证。
  8. “只报告一个平均分就够。” 不成立。平均分会淹没少数类、时间切片、地区或群体上的失效模式。

一套可用于验收的最小报告

对于一个二分类模型,建议至少同时交付:

  1. 测试集来源、时间范围、样本数、正类定义和正类比例;
  2. 固定业务阈值下的 TP、FP、FN、TN,以及 Accuracy、Precision、Recall、F1、Specificity;
  3. 阈值值、阈值选择规则和 FP/FN 的业务含义;
  4. ROC 曲线与 ROC-AUC;类别不平衡时再给 PR 曲线与 average precision;
  5. 按关键时间段、来源或人群切片的指标,检查分布漂移与局部失效;
  6. 概率会参与决策时的校准评估;
  7. 置信区间或重复抽样结果,特别是在正例很少时,避免把偶然波动当成进步。

评估指标不是为了“挑一个漂亮数”,而是为了让模型行为可以被追问、被复现、被业务约束。最可靠的习惯是:先展示混淆矩阵,再说明阈值与基率,最后用与错误代价一致的指标作决策。

参考资料

  1. Fawcett, T. (2006). An introduction to ROC analysis. Pattern Recognition Letters, 27(8), 861-874.
  2. Powers, D. M. W. (2011). Evaluation: From Precision, Recall and F-Measure to ROC, Informedness, Markedness & Correlation. Journal of Machine Learning Technologies, 2(1), 37-63.
  3. Saito, T., & Rehmsmeier, M. (2015). The precision-recall plot is more informative than the ROC plot when evaluating binary classifiers on imbalanced datasets. PLOS ONE, 10(3).
  4. scikit-learn 开发团队。Model evaluation: quantifying the quality of predictions
  5. Google Developers。Classification: Accuracy, recall, precision, and related metrics
  6. Hand, D. J., & Till, R. J. (2001). A Simple Generalisation of the Area Under the ROC Curve for Multiple Class Classification Problems. Machine Learning, 45, 171-186.