AI大模型应用开发-模型评估:准确率(“猜中多少次”)、召回率(“漏了多少”),用简单指标判断模型好坏
聚焦准确率、召回率两个核心指标,用通俗类比 + 实操案例拆解,不涉及复杂公式推导
·
一、 前置认知:先明确 “评估的是分类模型”
今天讲的准确率、召回率,只针对「分类模型」(比如 KNN、逻辑回归,判断 “是 / 否”“A/B/C 类”),不适用线性回归这类 “预测连续数值” 的回归模型。
先约定一个小白易懂的 “二分类场景”(后续所有类比和案例都基于此):
- 模型任务:判断一封邮件是否是垃圾邮件
- 两个类别:正例(Positive)= 垃圾邮件,负例(Negative)= 正常邮件
- 模型预测结果只有 4 种可能(核心,先理解这个再看指标):
- TP(真阳性):邮件是垃圾邮件,模型也判断为垃圾邮件(猜对了)
- TN(真阴性):邮件是正常邮件,模型也判断为正常邮件(猜对了)
- FP(假阳性):邮件是正常邮件,模型误判为垃圾邮件(猜错了,“冤枉好人”)
- FN(假阴性):邮件是垃圾邮件,模型误判为正常邮件(猜错了,“放过坏人”)
通俗类比:把模型当成 “警察抓小偷”
- 小偷 = 垃圾邮件(正例),普通人 = 正常邮件(负例)
- TP:警察把 “真小偷” 抓了(正确)
- TN:警察把 “普通人” 放行了(正确)
- FP:警察把 “普通人” 当成小偷抓了(冤枉好人)
- FN:警察把 “真小偷” 当成普通人放行了(放过坏人)
这 4 种结果是理解准确率、召回率的基础,记牢这个类比,后续指标一看就懂。
二、 核心指标 1:准确率(Accuracy)—— “猜中多少次”
1. 小白通俗理解
准确率 = “模型整体猜对的比例”,不管是 “猜对垃圾邮件” 还是 “猜对正常邮件”,只要猜对了,都算在内,对应你说的 “猜中多少次”。
2. 简单公式(不用计算,工具会自动出结果)
准确率 = (猜对的总数量) / (所有数据的总数量)
= (TP + TN) / (TP + TN + FP + FN)
3. 类比解读(警察抓小偷)
准确率 = (抓对的小偷 + 放对的普通人) / (所有被检查的人)
- 比如:总共检查 100 人,抓对 20 个小偷、放对 70 个普通人,总共猜对 90 人
- 准确率 = 90/100 = 0.9(90%)
4. 优缺点(小白必知)
- 优点:简单直观,一眼能看出模型整体表现,适合正负例数量差不多的场景(比如垃圾邮件和正常邮件各占 50%)。
- 缺点:有 “欺骗性”,在正负例数量差距极大的场景下没用。
- 反例:1000 封邮件中,只有 10 封垃圾邮件,990 封正常邮件。模型 “偷懒”,把所有邮件都判断为正常邮件。
- 此时:猜对了 990 封正常邮件,猜错了 10 封垃圾邮件,准确率 = 990/1000=99%(看起来很高),但模型完全没完成 “识别垃圾邮件” 的任务,毫无价值。
三、 核心指标 2:召回率(Recall)—— “漏了多少”
1. 小白通俗理解
召回率 = “模型把所有正例都找出来的比例”(只关注正例,不管负例),对应你说的 “漏了多少”—— 召回率越高,漏的正例越少(放过的 “坏人” 越少)。
也叫 “查全率”,意思是 “把正例全部查全的比例”。
2. 简单公式(不用计算,工具会自动出结果)
召回率 = (正确识别的正例数量) / (实际所有的正例数量)
= TP / (TP + FN)
3. 类比解读(警察抓小偷)
召回率 = (抓对的小偷) / (实际所有的小偷)
- 比如:实际有 25 个小偷,警察只抓对了 20 个,漏了 5 个
- 召回率 = 20/25 = 0.8(80%),说明漏了 20% 的小偷(“漏了多少” 的直观体现)
4. 适用场景(小白必知)
召回率优先用于 **“不能放过正例”** 的场景,漏检的代价很大:
- 医疗诊断:判断是否患有癌症(正例 = 癌症患者),召回率要高,不能漏诊(漏诊会耽误治疗,危及生命),哪怕偶尔把健康人误判为癌症(FP,假阳性),后续再复查即可。
- 垃圾邮件识别:漏了垃圾邮件(FN),用户会收到广告骚扰,召回率要高,尽量把所有垃圾邮件都找出来。
- 疫情筛查:正例 = 感染者,不能漏检,否则会造成疫情扩散,召回率是核心指标。
四、 准确率 vs 召回率:小白快速区分
用表格总结,一目了然:
| 指标 | 核心关注 | 通俗解读 | 适用场景 | 缺点 |
|---|---|---|---|---|
| 准确率(Accuracy) | 整体猜对的比例(正例 + 负例) | “总共猜中多少次” | 正负例数量均衡的场景 | 正负例差距大时,结果有欺骗性 |
| 召回率(Recall) | 正例被找全的比例(只关注正例) | “漏了多少正例” | 不能漏检正例的场景 | 不关注负例的误判情况(可能冤枉好人) |
补充:一个重要结论
很多场景下,** 准确率和召回率是 “此消彼长”** 的:
- 比如想提高召回率(尽量不漏掉小偷),警察会扩大抓捕范围,把 “可疑人员” 都抓起来,此时漏的小偷少了,但会把更多普通人当成小偷抓起来(FP 增加),准确率会下降。
- 反之,想提高准确率(尽量不冤枉好人),警察只抓 “证据确凿” 的小偷,此时冤枉的普通人少了,但会漏掉很多 “证据不足” 的小偷(FN 增加),召回率会下降。
小白不用纠结调优,只需知道:根据业务场景选择 “更看重哪个指标” 即可。
五、 小白实操:用 Sklearn 计算准确率和召回率(直接复制运行)
基于之前的 “逻辑回归(判断学生是否及格)” 场景,用 Sklearn 自带的评估工具计算两个指标,无需手动算公式。
实操代码
新建model_evaluation_demo.py文件,粘贴以下代码,直接用python model_evaluation_demo.py运行。
python
# === 步骤1:导入所需库 ===
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, recall_score # 导入评估指标工具
# === 步骤2:准备数据(场景:复习时间→是否及格,正例=及格(1),负例=不及格(0)) ===
# 特征X:复习时间(小时),二维数组
X = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).reshape(-1, 1)
# 标签y:0=不及格,1=及格(正例)
y_true = np.array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1])
# === 步骤3:创建并训练逻辑回归模型 ===
model = LogisticRegression()
model.fit(X, y_true)
# === 步骤4:获取模型预测结果 ===
y_pred = model.predict(X) # y_pred:模型预测的标签(0/1)
# === 步骤5:计算准确率和召回率 ===
# 1. 计算准确率
accuracy = accuracy_score(y_true, y_pred)
# 2. 计算召回率(pos_label=1:指定正例为“1(及格)”)
recall = recall_score(y_true, y_pred, pos_label=1)
# === 步骤6:打印结果 ===
print("=== 模型评估结果 ===")
print(f"真实标签(是否及格):{y_true}")
print(f"预测标签(是否及格):{y_pred}")
print(f"\n准确率(整体猜中比例):{accuracy:.2f}({accuracy*100:.0f}%)")
print(f"召回率(及格学生被找全比例):{recall:.2f}({recall*100:.0f}%)")
# === 额外:模拟“漏检”场景,看召回率变化 ===
print("\n=== 模拟漏检场景(模型漏判2个及格学生)===")
# 手动修改预测结果,让第8、9个样本(原本及格)被误判为不及格(漏检)
y_pred_leak = y_pred.copy()
y_pred_leak[7] = 0 # 第8个样本(索引7):真实1→预测0(FN)
y_pred_leak[8] = 0 # 第9个样本(索引8):真实1→预测0(FN)
# 重新计算召回率
recall_leak = recall_score(y_true, y_pred_leak, pos_label=1)
print(f"修改后预测标签:{y_pred_leak}")
print(f"漏检后的召回率:{recall_leak:.2f}({recall_leak*100:.0f}%)")
print(f"解读:召回率下降,说明漏了更多及格学生(正例)")
运行结果解读
- 初始场景:模型完美拟合,准确率和召回率都是 1.0(100%),说明既没猜错,也没漏检。
- 模拟漏检场景:手动让模型漏判 2 个及格学生,召回率下降(比如变为 0.83,83%),直观体现 “漏了多少正例”,而准确率可能下降幅度较小(因为只影响正例)。
- 核心体会:
accuracy_score()和recall_score()是 Sklearn 计算两个指标的现成工具,只需传入 “真实标签” 和 “预测标签” 即可,无需手动计算 TP/TN/FP/FN。
六、 小白避坑指南
- 召回率计算报错「UndefinedMetricWarning」:没有指定正例,或数据中没有正例(全是负例)。解决:用
pos_label指定正例(如pos_label=1)。 - 只看准确率就判断模型好坏:这是小白最容易犯的错!如果数据中正负例差距大(比如 99% 负例,1% 正例),先看召回率,再看准确率。
- 混淆 “回归模型” 和 “分类模型”:准确率、召回率不适用线性回归等回归模型(预测房价、销售额),回归模型有专门的评估指标(如均方误差),小白入门暂时不用掌握。
总结
- 先明确二分类场景的 4 种结果(TP/TN/FP/FN),用 “警察抓小偷” 类比快速理解,这是两个指标的基础。
- 准确率关注「整体猜中比例」,通俗解读为 “猜中多少次”,适合正负例数量均衡的场景。
- 召回率关注「正例被找全比例」,通俗解读为 “漏了多少正例”,适合不能漏检正例的场景(医疗、垃圾邮件等)。
- Sklearn 实操核心:用
accuracy_score()计算准确率,recall_score()计算召回率,只需传入真实标签和预测标签即可。 - 关键结论:评估模型不能只看一个指标,要结合业务场景,优先选择更重要的指标(比如医疗场景优先召回率)。
更多推荐



所有评论(0)