一、 前置认知:先明确 “评估的是分类模型”

今天讲的准确率、召回率,只针对「分类模型」(比如 KNN、逻辑回归,判断 “是 / 否”“A/B/C 类”),不适用线性回归这类 “预测连续数值” 的回归模型。

先约定一个小白易懂的 “二分类场景”(后续所有类比和案例都基于此):

  • 模型任务:判断一封邮件是否是垃圾邮件
  • 两个类别:正例(Positive)= 垃圾邮件,负例(Negative)= 正常邮件
  • 模型预测结果只有 4 种可能(核心,先理解这个再看指标):
    1. TP(真阳性):邮件是垃圾邮件,模型也判断为垃圾邮件(猜对了)
    2. TN(真阴性):邮件是正常邮件,模型也判断为正常邮件(猜对了)
    3. FP(假阳性):邮件是正常邮件,模型误判为垃圾邮件(猜错了,“冤枉好人”)
    4. 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. 初始场景:模型完美拟合,准确率和召回率都是 1.0(100%),说明既没猜错,也没漏检。
  2. 模拟漏检场景:手动让模型漏判 2 个及格学生,召回率下降(比如变为 0.83,83%),直观体现 “漏了多少正例”,而准确率可能下降幅度较小(因为只影响正例)。
  3. 核心体会:accuracy_score()recall_score()是 Sklearn 计算两个指标的现成工具,只需传入 “真实标签” 和 “预测标签” 即可,无需手动计算 TP/TN/FP/FN。

六、 小白避坑指南

  1. 召回率计算报错「UndefinedMetricWarning」:没有指定正例,或数据中没有正例(全是负例)。解决:用pos_label指定正例(如pos_label=1)。
  2. 只看准确率就判断模型好坏:这是小白最容易犯的错!如果数据中正负例差距大(比如 99% 负例,1% 正例),先看召回率,再看准确率。
  3. 混淆 “回归模型” 和 “分类模型”:准确率、召回率不适用线性回归等回归模型(预测房价、销售额),回归模型有专门的评估指标(如均方误差),小白入门暂时不用掌握。

总结

  1. 先明确二分类场景的 4 种结果(TP/TN/FP/FN),用 “警察抓小偷” 类比快速理解,这是两个指标的基础。
  2. 准确率关注「整体猜中比例」,通俗解读为 “猜中多少次”,适合正负例数量均衡的场景。
  3. 召回率关注「正例被找全比例」,通俗解读为 “漏了多少正例”,适合不能漏检正例的场景(医疗、垃圾邮件等)。
  4. Sklearn 实操核心:用accuracy_score()计算准确率,recall_score()计算召回率,只需传入真实标签和预测标签即可。
  5. 关键结论:评估模型不能只看一个指标,要结合业务场景,优先选择更重要的指标(比如医疗场景优先召回率)。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐