准确率、精确率、召回率和 F1 到底怎么看?

分类模型不能只看“猜对多少”。在垃圾短信、疾病筛查和风险识别中,漏掉一个正例和误判一个正常样本,代价可能完全不同。

理解分类指标,最好先从混淆矩阵开始。

视频讲解:在官网观看本课视频

混淆矩阵记录四种结果

以“垃圾短信”为正类:

真实情况 / 预测结果预测垃圾预测正常
实际垃圾TPFN
实际正常FPTN
  • TP:垃圾短信被正确识别;

  • TN:正常短信被正确放行;

  • FP:正常短信被误判为垃圾;

  • FN:垃圾短信被漏掉。

Accuracy:整体猜对多少

Accuracy = (TP + TN) / 全部样本

类别比较均衡时,准确率很直观。但如果 1000 条短信中只有 10 条垃圾短信,模型把所有短信都判断为正常,也有 99% 的准确率,却完全没有识别能力。

Precision:预测为正的结果有多可靠

Precision = TP / (TP + FP)

精确率高,说明模型一旦说“这是垃圾短信”,通常是可信的。误判正常短信代价很高时,应重点关注精确率。

Recall:真正的正例找回了多少

Recall = TP / (TP + FN)

召回率高,说明真正的垃圾短信很少漏掉。疾病筛查、安全风险检测等不希望漏判的任务,通常更关注召回率。

F1:平衡 Precision 和 Recall

F1 = 2 × Precision × Recall / (Precision + Recall)

F1 是二者的调和平均。只有 Precision 和 Recall 都比较好时,F1 才会高,适合类别不均衡且两种错误都需要考虑的场景。

指标必须对应业务代价

没有一个指标永远最好。选择指标前应该问:

  • 漏掉一个正例的代价是什么?

  • 错判一个负例的代价是什么?

  • 类别是否严重不均衡?

  • 是否需要分别观察每个类别?

技术图:把关键链路画清楚

可运行实验:从同一个混淆矩阵计算四个指标

指标不是互相独立的公式,它们都来自混淆矩阵。先固定一组预测结果,再观察 Accuracy、Precision、Recall 和 F1 如何描述不同问题。

from sklearn.metrics import accuracy_score, confusion_matrix, precision_recall_fscore_support ​ y_true = [1, 1, 1, 1, 0, 0, 0, 0] y_pred = [1, 1, 0, 0, 1, 0, 0, 0] p, r, f1, _ = precision_recall_fscore_support(y_true, y_pred, average="binary") print("混淆矩阵:\n", confusion_matrix(y_true, y_pred)) print(f"Accuracy={accuracy_score(y_true, y_pred):.3f}") print(f"Precision={p:.3f} Recall={r:.3f} F1={f1:.3f}")

运行结果:

混淆矩阵: [[3 1] [2 2]] Accuracy=0.625 Precision=0.667 Recall=0.500 F1=0.571

模型预测为正的 3 个样本里有 2 个正确,因此 Precision 为 2/3;真实正例有 4 个,只找回 2 个,因此 Recall 为 1/2。

常见误区

  1. Accuracy 高就代表模型好。类别极不平衡时,全猜多数类也可能很高。

  2. Precision 和 Recall 可以同时随意提高。固定模型下二者通常受阈值影响,需要按业务代价取舍。

动手练习

把第三个预测从0改成1,重新计算指标,并解释为什么 Recall 上升。

这一课先记住什么

Accuracy 看整体,Precision 关注误判,Recall 关注漏判,F1 在两者之间取平衡。评价模型时不要只报一个数字。

下一课会讨论模型最常见的两种学习问题:过拟合和欠拟合


本文首发于「去你想去的地方」: https://bestsdz.xyz/posts/classification-metrics/

完整学习路线、视频版和后续更新请访问原文。