模型评估不是寻找一个“最高”的数字,而是回答一组更具体的问题:预测为阳性的样本可靠吗?真实阳性是否被漏掉?把阈值调高后会牺牲多少召回?在正负样本极不平衡时,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 只是在特定条件下的默认选择:输出是校准良好的概率、两类误判代价相同、类别先验与训练部署一致。实际业务经常不满足这些条件。更稳妥的阈值选择流程是:
- 在验证集上固定正类定义与数据切分,避免用测试集调阈值;
- 给出 Recall 下限、可接受的 FP 数量、人工审核容量或单位成本;
- 在阈值网格上计算混淆矩阵、Precision、Recall、F1 和成本;
- 选择满足约束的阈值,并在独立测试集或时间外样本上复核;
- 上线后监控基率、分数分布和各指标漂移,必要时重新校准或调整阈值。
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。
因此,两个重要边界必须牢记:
- AUC 高不保证阈值可用。 一个 AUC 很高的模型仍可能在当前阈值下 Recall 太低、FP 太多,或在业务关注的低 FPR 区域表现不佳。
- 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” 不具备可复现的解释。
常见误读与复习陷阱
- “Accuracy 94%,所以模型很好。” 不成立。先问正类比例、FN 和 FP 的绝对数量、两类错误代价。
- “Precision 高,说明没漏检。” 不成立。Precision 对 FN 不敏感;模型只报极少数最确定的案例也能有高 Precision,同时 Recall 很低。
- “Recall 高,说明告警很可信。” 不成立。把所有样本判正可得到 Recall 100%,但 Precision 会降到正类基率。
- “F1 是 Accuracy 的升级版。” 不成立。F1 不含 TN;二者评价的对象不同。
- “AUC 代表 80% 的预测会正确。” 不成立。ROC-AUC 表示排序能力,不是分类 Accuracy,也不是概率校准质量。
- “阈值必须是 0.5。” 不成立。阈值应由成本、容量、正类基率与概率校准共同决定。
- “验证集指标可以直接发布。” 不成立。调参、选特征、选阈值都用过验证集后,它不再是独立证据;必须保留最终测试集或采用嵌套交叉验证。
- “只报告一个平均分就够。” 不成立。平均分会淹没少数类、时间切片、地区或群体上的失效模式。
一套可用于验收的最小报告
对于一个二分类模型,建议至少同时交付:
- 测试集来源、时间范围、样本数、正类定义和正类比例;
- 固定业务阈值下的 TP、FP、FN、TN,以及 Accuracy、Precision、Recall、F1、Specificity;
- 阈值值、阈值选择规则和 FP/FN 的业务含义;
- ROC 曲线与 ROC-AUC;类别不平衡时再给 PR 曲线与 average precision;
- 按关键时间段、来源或人群切片的指标,检查分布漂移与局部失效;
- 概率会参与决策时的校准评估;
- 置信区间或重复抽样结果,特别是在正例很少时,避免把偶然波动当成进步。
评估指标不是为了“挑一个漂亮数”,而是为了让模型行为可以被追问、被复现、被业务约束。最可靠的习惯是:先展示混淆矩阵,再说明阈值与基率,最后用与错误代价一致的指标作决策。
参考资料
- Fawcett, T. (2006). An introduction to ROC analysis. Pattern Recognition Letters, 27(8), 861-874.
- 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.
- 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).
- scikit-learn 开发团队。Model evaluation: quantifying the quality of predictions。
- Google Developers。Classification: Accuracy, recall, precision, and related metrics。
- 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.