精确率和召回率:为什么不能只看准确率

笔记 · · 二分类 · 类别不平衡

先看一个假想的场景:某天有 1000 笔交易,其中 20 笔是欺诈,980 笔正常。我们要评价一个识别欺诈的模型。把「欺诈」当作正类,下面所有的数都可以在计算台上填入同样的四个计数复现。

一个什么也不做、准确率 98% 的模型

最省事的模型是:不管什么交易,一律判为正常。它的混淆矩阵是这样的:

模型 A:全部判正常预测为欺诈预测为正常
真实为欺诈(20)TP = 0FN = 20
真实为正常(980)FP = 0TN = 980

准确率 = (TP + TN) / 全部 = (0 + 980) / 1000 = 0.98。一个一笔欺诈也没抓到的模型,准确率高达 98%。

问题出在准确率把两类样本混在一起数。正常交易占了 98%,只要把它们判对,准确率就不会低于 98%,而我们真正关心的那 20 笔,在分子里的分量只有 2%。所以当正类很少时,准确率主要反映的是模型对多数类的表现

把四个格子拆开看

要看清楚模型对欺诈的表现,得单独看混淆矩阵里跟正类有关的格子。有两个方向可以问:

  • 召回率:真正的欺诈里,模型找出来了多少?看的是「真实为欺诈」那一行:TP / (TP + FN)。
  • 精确率:模型报出来的欺诈里,有多少真是欺诈?看的是「预测为欺诈」那一列:TP / (TP + FP)。

模型 A 的召回率 = 0 / (0 + 20) = 0,一眼就暴露了问题。它的精确率 = 0 / (0 + 0),分母为 0——它一次都没报过欺诈,「报出来的里有多少是真的」这个问题没有答案。本站把这种情况记为无定义,而不是 0 或 1。

一个真在干活的模型

换一个模型 B,它报了 60 笔可疑交易,其中 15 笔确实是欺诈:

模型 B预测为欺诈预测为正常
真实为欺诈(20)TP = 15FN = 5
真实为正常(980)FP = 45TN = 935

逐项代入:

准确率 = (15 + 935) / 1000 = 0.95

召回率 = 15 / (15 + 5) = 15 / 20 = 0.75

精确率 = 15 / (15 + 45) = 15 / 60 = 0.25

准确率从 98% 降到了 95%,可这个模型抓到了四分之三的欺诈。代价是它报出来的 60 笔里只有四分之一是真的,其余 45 笔是误报。在计算台上打开模型 B,指标卡里能看到每一步代入。

精确率和召回率此消彼长

模型通常先给每笔交易打一个分数,再用一个阈值决定报不报。把模型 B 的阈值调高,只报最可疑的那些,就得到模型 C:

TPFPFNTN准确率精确率召回率
A 全判正常00209800.980无定义0.00
B 阈值较低154559350.9500.250.75
C 阈值较高105109750.9850.670.50

C 只报了 15 笔,其中 10 笔是真的,精确率升到 10 / 15 ≈ 0.67;但它漏掉了一半欺诈,召回率降到 10 / 20 = 0.5。阈值往上调,报得越少越准、漏得越多;往下调则相反。这不是某个模型的缺陷,而是同一组分数换个切法的必然结果。打开模型 C 对照看。

顺带一提,C 的准确率是 98.5%,比 A 还高——准确率在这里依然说明不了多少问题。

合成一个数:F1 与 Fβ

比较模型时常常希望只看一个数。直接取精确率和召回率的算术平均不太好:一个模型把所有交易都报成欺诈,召回率是 1,精确率是 20 / 1000 = 0.02,算术平均是 0.51,看起来还过得去,其实毫无用处。

F1 用的是调和平均:2PR / (P + R)。调和平均会被较小的那个数拖住,上面这个例子的 F1 = 2 × 0.02 × 1 / 1.02 ≈ 0.039,跟它的实际价值相符。把 P = TP / (TP + FP)、R = TP / (TP + FN) 代进去化简,得到只用计数的形式:

F1 = 2TP / (2TP + FP + FN)

模型 B:F1 = 30 / (30 + 45 + 5) = 30 / 80 = 0.375;模型 C:F1 = 20 / (20 + 5 + 10) = 20 / 35 ≈ 0.571。按 F1,C 更好。

但 F1 默认精确率和召回率一样重要。对欺诈检测来说,漏掉一笔欺诈(FN)往往比多审核一笔正常交易(FP)代价大得多。Fβ 用参数 β 表达这种偏好,β 越大越看重召回率:

Fβ = (1 + β²)TP / ((1 + β²)TP + β²FN + FP)

取 β = 2:模型 B 的 F2 = 75 / (75 + 20 + 45) = 75 / 140 ≈ 0.536;模型 C 的 F2 = 50 / (50 + 40 + 5) = 50 / 95 ≈ 0.526。换了一个指标,B 反而略好。

同一组模型,按 F1 是 C 好,按 F2 是 B 好。哪个指标「对」没有标准答案,取决于误报和漏报在你的场景里各值多少。指标只负责把这个取舍算清楚,决定要由了解业务的人来做。

把负类也算进来:特异度与 MCC

精确率、召回率、F1 都不用 TN。当负类同样重要时,可以再看:

  • 特异度 = TN / (TN + FP),正常交易里被正确放过的比例。模型 B 是 935 / 980 ≈ 0.954。
  • 平衡准确率 = (召回率 + 特异度) / 2。模型 A 是 (0 + 1) / 2 = 0.5,正好等于瞎猜的水平,把 98% 准确率的假象打回原形;模型 B 约 0.852。
  • MCC 同时用到四个格子:(TP·TN − FP·FN) / √((TP+FP)(TP+FN)(TN+FP)(TN+FN))。模型 B 是 (15 × 935 − 45 × 5) / √(60 × 20 × 980 × 940) = 13800 / √1105440000 ≈ 0.415;模型 C 约 0.570;模型 A 因为「预测为欺诈」那一列全是 0,分母为 0,无定义。

小结

  1. 正类很少时,准确率接近「多数类占比」就说明不了什么,先把它和「全判多数类」的基线比一比。
  2. 召回率看漏了多少,精确率看报错了多少;两者随阈值此消彼长,单独报一个没有意义。
  3. F1 假定两者同等重要;有明确偏好时用 Fβ,并写明 β 取多少、为什么。
  4. 分母为 0 的指标是「无定义」,不是 0,比较不同工具的结果时要留意各自的处理办法。

想看阈值连续变化时这些数怎么一起变,可以在首页用「标签 + 概率」模式粘贴每个样本的分数,拖动阈值滑块。