准确率、精确率、召回率和 F1 到底怎么看?
分类模型不能只看“猜对多少”。在垃圾短信、疾病筛查和风险识别中漏掉一个正例和误判一个正常样本代价可能完全不同。理解分类指标最好先从混淆矩阵开始。视频讲解在官网观看本课视频混淆矩阵记录四种结果以“垃圾短信”为正类真实情况 / 预测结果预测垃圾预测正常实际垃圾TPFN实际正常FPTNTP垃圾短信被正确识别TN正常短信被正确放行FP正常短信被误判为垃圾FN垃圾短信被漏掉。Accuracy整体猜对多少Accuracy (TP TN) / 全部样本类别比较均衡时准确率很直观。但如果 1000 条短信中只有 10 条垃圾短信模型把所有短信都判断为正常也有 99% 的准确率却完全没有识别能力。Precision预测为正的结果有多可靠Precision TP / (TP FP)精确率高说明模型一旦说“这是垃圾短信”通常是可信的。误判正常短信代价很高时应重点关注精确率。Recall真正的正例找回了多少Recall TP / (TP FN)召回率高说明真正的垃圾短信很少漏掉。疾病筛查、安全风险检测等不希望漏判的任务通常更关注召回率。F1平衡 Precision 和 RecallF1 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, averagebinary) print(混淆矩阵:\n, confusion_matrix(y_true, y_pred)) print(fAccuracy{accuracy_score(y_true, y_pred):.3f}) print(fPrecision{p:.3f} Recall{r:.3f} F1{f1:.3f})运行结果混淆矩阵: [[3 1] [2 2]] Accuracy0.625 Precision0.667 Recall0.500 F10.571模型预测为正的 3 个样本里有 2 个正确因此 Precision 为 2/3真实正例有 4 个只找回 2 个因此 Recall 为 1/2。常见误区Accuracy 高就代表模型好。类别极不平衡时全猜多数类也可能很高。Precision 和 Recall 可以同时随意提高。固定模型下二者通常受阈值影响需要按业务代价取舍。动手练习把第三个预测从0改成1重新计算指标并解释为什么 Recall 上升。这一课先记住什么Accuracy 看整体Precision 关注误判Recall 关注漏判F1 在两者之间取平衡。评价模型时不要只报一个数字。下一课会讨论模型最常见的两种学习问题过拟合和欠拟合。本文首发于「去你想去的地方」 https://bestsdz.xyz/posts/classification-metrics/完整学习路线、视频版和后续更新请访问原文。