准确率 99% 的模型为什么是废的?精确率、召回率、F1 一次讲透

准确率 99% 的模型也可能毫无价值。本文从混淆矩阵出发,把准确率、精确率、召回率、F1 四个指标的分母差异、适用场景讲透,手把手带算一遍,并说明类别不平衡为什么会「骗人」,文末附 15 道自测题。


目录

  1. 评价指标:准确率 / 精确率 / 召回率 / F1(重点)
  2. 📝本模块练习

1. 评价指标:准确率 / 精确率 / 召回率 / F1(重点)

这是全手册唯一需要动手算的地方,也是理论考试计算题的常客。别怕,只要会四则运算就能做对。

🔑 一句话:模型好不好,不能凭感觉——得用一组指标把它「量」出来。这一节就是那套尺子。

0 先看这节要解决什么

先看一个让人不安的例子,它解释了为什么必须学这一节:

某医院上了 AI 疾病筛查系统,准确率 99.9%,却被停用了。
为什么?因为这 1000 个受检者里只有 1 个人真正患病,而模型的做法是「统统判为健康」——它连那个病人也判成了健康。
看着很荒谬,可算下来它猜对了 999 个,准确率漂亮得无可挑剔。但它一个病人都没找出来。

这个例子说明一件事:「准确率」会在数据不平衡时骗人。

所以这一节要解决三个问题:

  1. 把「猜对 / 猜错」拆开看——错也分两种错(误报、漏报),代价完全不一样。这就是混淆矩阵。
  2. 为两种错各配一把尺子——精确率盯「误报」,召回率盯「漏报」,F1 把两者综合起来。
  3. 学会在业务里选指标——什么场景该保精确率,什么场景必须保召回率。

💡 学这一节的心理准备:它和前面几节不一样——光看懂没用,必须自己动手算。全节只有四个公式,但每个都要能默写、能代入数字。请准备好纸笔。

1.1 混淆矩阵(一切指标的源头)

「猜对了多少」这个问法太粗——因为猜错也分两种,而这两种错的代价天差地别。

🔗 用火警类比

火灾报警器只有两种输出(响 / 不响),楼里也只有两种状态(有火 / 没火)。组合起来恰好四种情况:
响了 + 真有火 —— 灭火成功,这是我们要的
响了 + 没火 —— 虚惊一场(误报:白跑一趟,人没事)
没响 + 真有火 —— 着火了没人知道(漏报:要出人命的)
没响 + 没火 —— 天下太平
关键就在这:「误报」和「漏报」是完全不同性质的错误。而准确率把这两种错混在一起算——所以它会骗人。

把这四种情况摊开成一张 2×2 的表格,就是混淆矩阵:

预测为正预测为负
实际为正TP(真阳性)✅ 猜对了FN(假阴性)❌ 漏报
实际为负FP(假阳性)❌ 误报TN(真阴性)✅ 猜对了

💡 名字怎么记(两秒记住四个格子):
第一个字母 = 判断对不对(True 对 / False 错)
第二个字母 = 模型说的是什么(Positive 说「有」 / Negative 说「没有」)
拼起来读:TP = 「判断对了 + 说了有」;FN = 「判断错了 + 说了没有」——明明有,你却说没有,就是漏了。

在这里插入图片描述

1.2 四个公式

四个公式先列出来,暂时不用背——下面把「它们各自在问什么问题」讲清楚,自然就记住了。

指标公式它在问什么
准确率 Accuracy(TP+TN) / 总数整体猜对了多少?
精确率 PrecisionTP / (TP+FP)你说「是」的里面,有多少真的是?
召回率 RecallTP / (TP+FN)真正是「是」的里面,你抓到了多少?
F12 × P × R / (P + R)精确率和召回率的综合平衡分

💡 关键在「分母」——一句话分清精确率和召回率:
精确率的分母 = 模型说「有」的总数(TP+FP)→ 它在问:你报出来的这些,有多少是真的?
召回率的分母 = 实际「有」的总数(TP+FN)→ 它在问:现实里真正有的那些,你抓到了多少?
记法:分母为谁,就是为谁负责。精确率对「模型自己说过的话」负责;召回率对「现实里真正发生的事」负责。

🔗 用 C# 类比(代码静态分析工具的告警)

假设你的项目里藏着 80 个真 bug,静态分析工具报了 100 条告警,其中 60 条确实是真 bug:
精确率 = 60 / 100 = 60% —— 「工具报出来的这些,有多少值得我点开看?」(低了就是「狼来了」,最后没人理告警)
召回率 = 60 / 80 = 75% —— 「代码里真正的问题,工具帮我找出了多少?」(低了就是漏网 bug 上线)
这两个指标天然打架:想「少误报」就把告警门槛调高 → 漏掉的 bug 更多;想「少漏报」就把门槛调低 → 告警里全是杂物。所以才有 F1 这个综合分。

三个指标分别在什么场景当家:
· 数据平衡(正负样本差不多)→ 看准确率就够了
· 怕误报(垃圾邮件误判会弄丢重要邮件、推荐乱推会烦人)→ 保精确率
· 怕漏报(疾病筛查、欺诈检测、安全告警)→ 保召回率
· 说不清怕哪个 / 想要一个总分 → 看 F1

1.3 完整算一遍(手把手)

考试里给的都是一段文字描述,标准解法固定三步:① 先把混淆矩阵填出来 → ② 认准分母 → ③ 代公式。第 ① 步做对,后面就全是纯算术了。

题目:某疾病筛查模型,100 个样本,其中实际患病 20 人。模型判断:

  • 20 个患病者中,模型正确识别出 16 人(TP=16),漏掉 4 人(FN=4)
  • 80 个健康者中,模型误判了 8 人为患病(FP=8),其余 72 人判对(TN=72)

① 先填矩阵(这一步最关键,考试就靠它):
「20 个患病者中识别出 16 人」→ 实际有、说你有 → TP = 16
「漏掉 4 人」→ 实际有、说你没有 → FN = 4
「80 个健康者中误判 8 人为患病」→ 实际没有、说你有 → FP = 8
「其余 72 人判对」→ 实际没有、说你没有 → TN = 72填完先自查一遍:TP+FP+FN+TN 应该等于样本总数(16+8+4+72 = 100 ✓)。对不上就说明填错了。

1. 计算准确率、精确率、召回率、F1

▸ 展开参考答案

准确率 = (16+72) / 100 = 88/100 = 88%
精确率
= TP/(TP+FP) = 16/(16+8) = 16/24 ≈ 66.7%
召回率
= TP/(TP+FN) = 16/(16+4) = 16/20 = 80%
F1
= 2 × 0.667 × 0.8 / (0.667 + 0.8) = 1.0667 / 1.4667 ≈ 72.7%
注意:这个模型准确率 88% 看着不错,但精确率只有 66.7% —— 说明它「说患病」的人里有三分之一是误报。这就是为什么不能只看准确率。

1.4 高频易错点(考前扫一眼)

  1. 分母搞反——精确率分母是「模型说有」(TP+FP),召回率分母是「实际有」(TP+FN)。这是本节翻车率最高的一处,务必分清。
  2. 以为「准确率高 = 模型好」——类别不平衡时准确率会骗人:1000 人里只有 1 个病人,模型全判健康也有 99.9%。这时要看召回率和 F1。
  3. 以为「精确率 + 召回率 = 100%」——它们不互补,是两个独立指标,通常此消彼长但不加和。
  4. F1 不是算术平均——F1 用的是调和平均 2PR/(P+R),不是 (P+R)/2。调和平均会向小的那个靠拢:P=0.6、R=0.4 时,算术平均 0.5,而 F1 = 0.48。凡是「两个指标有一个特别差」,F1 就会被拉低——这正是它的设计意图。

🎯 三级考点:① 给混淆矩阵算四个指标(务必手算熟);② 判断某业务场景该优先保精确率还是召回率;③ 解释「为什么准确率高不代表模型好」。

2. 医院做癌症筛查,应该优先保精确率还是召回率?

▸ 展开参考答案

优先保召回率。癌症筛查的代价极不对称:漏掉一个真患者(FN)可能导致延误治疗、危及生命;而误报一个(FP)只是让他多做一次复查。宁可误报,不可漏报,所以要把召回率做高,必要时牺牲精确率。

📝 本模块练习

第 3–7 题共用同一组数据:某模型测试了 200 个样本——其中实际为正的有 50 个(模型找出了其中 40 个),实际为负的有 150 个(模型把其中 20 个误判为正)。

3. 混淆矩阵中 FN 和 TN 分别是多少?

▸ 展开参考答案

FN = 50 − 40 = 10;TN = 150 − 20 = 130。

4. 准确率是多少?

▸ 展开参考答案

(TP+TN)/总数 = (40+130)/200 = 170/200 = 85%

5. 精确率是多少?

▸ 展开参考答案

TP/(TP+FP) = 40/(40+20) = 40/60 ≈ 66.7%

6. 召回率是多少?

▸ 展开参考答案

TP/(TP+FN) = 40/(40+10) = 40/50 = 80%

7. F1 是多少?

▸ 展开参考答案

2×0.667×0.8/(0.667+0.8) = 1.0667/1.4667 ≈ 72.7%

8. 若某场景「漏报代价远大于误报」,应优先提高哪个指标?

▸ 展开参考答案

召回率。召回率的分母是「实际为正」,提高它意味着减少漏报(FN)。

9. 某反欺诈模型把一笔正常交易误拦了(实际正常,模型判为欺诈)。这属于 TP / FP / FN / TN 中的哪一个?

▸ 展开参考答案

FP(假阳性,误报)。实际为负、模型说为正 → 假阳性。业务上的代价是「冤枉了好人」。

10. 某模型漏掉了一笔真实欺诈交易(实际欺诈,模型判为正常)。属于哪一个?

▸ 展开参考答案

FN(假阴性,漏报)。实际为正、模型说为负 → 假阴性。业务上的代价是「放过了坏人」,通常比误拦更严重。

11. 某模型在 500 个样本上测试:实际为正的有 100 个,模型全部识别出来;实际为负的有 400 个,模型把其中 40 个误判为正。求准确率、精确率、召回率。

▸ 展开参考答案

① 先填矩阵:TP = 100,FN = 0,FP = 40,TN = 360(自查:100+0+40+360 = 500 ✓)
② 代公式:
准确率 = (100+360)/500 = 460/500 = 92%
精确率 = 100/(100+40) = 100/140 ≈ 71.4%
召回率 = 100/(100+0) = 100%
⚠️ 注意:召回率 100% 不代表模型完美——它一个都没漏,但误报了 40 个。这就是为什么必须同时看两个指标。

12. 某模型的精确率 P = 0.6,召回率 R = 0.4,求 F1。

▸ 展开参考答案

F1 = 2 × 0.6 × 0.4 / (0.6 + 0.4) = 0.48 / 1.0 = 0.48。
⚠️ 它不是算术平均((0.6+0.4)/2 = 0.5)——F1 用调和平均,会向更小的那个值靠拢。

13. 为什么模型「准确率 99%」却可能是废的?说明原理并举一个例子。

▸ 展开参考答案

原理:当类别不平衡时(某一类样本占绝对多数),模型只要「全猜多数类」就能拿到高准确率,但它对少数类完全失效。
例子:1000 个受检者中只有 1 个病人。模型把所有人判为健康 → 准确率 999/1000 = 99.9%,但召回率 = 0(一个病人都没找到)。这种情况要看召回率和 F1。

14. 垃圾邮件过滤应该优先保精确率还是召回率?为什么?

▸ 展开参考答案

优先保精确率。两种错的代价不对称:把正常邮件误判为垃圾(FP)可能让你错过重要邮件,代价高;漏掉几封垃圾邮件(FN)只是收件箱多几条广告,代价低。宁可漏掉垃圾,不可误杀正常邮件。

15. 某医疗 AI 团队说「我们模型准确率 98%,可以上线了」。作为训练师,你会追问什么?为什么?

▸ 展开参考答案

追问召回率和精确率(或者直接要混淆矩阵)。
理由:医疗场景最怕漏诊(FN),必须知道召回率——98% 的准确率完全可能掩盖「少数病人没被检出」;同时也要看精确率,否则大量误报会让医生疲于复查、最后弃用系统。单看准确率无法判断模型在关键的少数类上的表现。

---

如果这篇帮你理清了「评价指标」,可以点个收藏——后面几篇会接着讲 业务分析入门,收起来方便连着看。

有哪里没讲透、或者你想让我补哪一块?在评论区说一声,我逐个回复。

📚 本系列共 5 篇:① AI/ML/DL 是什么| ② 三大学习范式 | ③ 数据·算法·算力 | ④ 评价指标 ← 你在这里 | ⑤ 业务分析入门

更多推荐