分类指标:Accuracy、Precision、Recall、F1 与 AUC
指标分别衡量总体正确、误报、漏报、二者平衡及阈值无关的排序能力。
学习前需要掌握
背景与问题
分类指标反映不同的错误关注点。准确率适合看总体正确比例,但类别不平衡时可能掩盖少数类失败;精确率、召回率和排序指标则分别回答不同问题。
先明确正类、使用阈值和业务代价,再选择主指标。不能在看到结果后,挑一个最漂亮的数字代表模型质量。
概念定义
Accuracy 适合类别平衡且错误成本相近;Precision 关注预测正类可信度;Recall 关注找回多少正类;F1 为调和平均。
直观理解
先决定哪类错误更贵,再选择计分板,而不是让默认指标替业务做决定。
核心原理
Precision 的分母是预测正例,衡量触发动作时有多少是真的;Recall 的分母是真实正例,衡量需要找到的对象有多少被覆盖。F1 是二者的调和平均,不显式包含真负例,也不直接代表业务总成本。
阈值把概率或分数转换为类别,因此准确率、精确率与召回率都依赖当前阈值。ROC-AUC 衡量排序,PR 曲线关注正例检出与误报的关系;排序好不意味着概率经过校准,也不自动给出最佳业务阈值。
多分类的 macro 对类别等权平均,weighted 按真实类别数量加权,micro 先汇总计数。它们对少数类的敏感程度不同;在普通单标签多分类、包含全部类别的设置中,micro F1 与准确率相同。
评估时应报告类别 support、阈值与数据范围,分清 predict 产生的标签和 predict_proba 产生的概率。阈值应在独立开发数据上选择,不能用最终测试集反复找最优门槛。
数学表达
核心表达
多分类需区分 macro、weighted、micro;阈值指标与排序指标共同报告。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1明确正类和成本
- 2查看类别比例
- 3选择主指标
- 4交叉验证
代码对应位置
示例 1同一组概率核对阈值指标与 ROC-AUC:概率与标签均为明确构造值,展示指标含义而非真实模型性能。
案例:排序指标与当前阈值可以给出不同印象
沿用 8 个构造样本:在 0.5 阈值下,TP 为 2、FP 为 1、FN 为 2,Precision 为 2 / 3,Recall 为 1 / 2,F1 为 4 / 7。总体准确率是 5 / 8。
下方同时提供每个样本的正类概率,计算 ROC-AUC。AUC 使用分数排序,不能拿标签替代概率,也不能用较高 AUC 掩盖当前阈值的漏报。若降低阈值,需要重新检查混淆矩阵和实际审核容量。
计算与实现步骤
- 明确正类和成本
- 查看类别比例
- 选择主指标
- 交叉验证
- 调整阈值
- 报告每类和总体
代码实现
示例 1
同一组概率核对阈值指标与 ROC-AUC
example_01.py用途:概率与标签均为明确构造值,展示指标含义而非真实模型性能。
import numpy as np
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score
y = np.array([0, 0, 0, 0, 1, 1, 1, 1])
probability = np.array([0.1, 0.2, 0.3, 0.8, 0.2, 0.4, 0.7, 0.9])
prediction = (probability >= 0.5).astype(int)
print(f"accuracy={accuracy_score(y, prediction):.3f}")
print(f"precision={precision_score(y, prediction):.3f}")
print(f"recall={recall_score(y, prediction):.3f}")
print(f"f1={f1_score(y, prediction):.3f}")
print(f"roc_auc={roc_auc_score(y, probability):.3f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
概率与标签均为明确构造值,展示指标含义而非真实模型性能。
y- 目标标签或连续目标值。
Step 1 · 1–2 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import numpy as np
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_scoreStep 2 · 4–11 行
输出中间参数、形状或最终指标,用于核对代码是否符合预期。
y = np.array([0, 0, 0, 0, 1, 1, 1, 1])
probability = np.array([0.1, 0.2, 0.3, 0.8, 0.2, 0.4, 0.7, 0.9])
prediction = (probability >= 0.5).astype(int)
print(f"accuracy={accuracy_score(y, prediction):.3f}")
print(f"precision={precision_score(y, prediction):.3f}")
print(f"recall={recall_score(y, prediction):.3f}")
print(f"f1={f1_score(y, prediction):.3f}")
print(f"roc_auc={roc_auc_score(y, probability):.3f}")预期输出或运行结果
本地 scikit-learn 1.8.0 的核对输出: accuracy=0.625 precision=0.667 recall=0.500 f1=0.571 roc_auc=0.719
常见错误 · 3 条
- 用类别标签计算本应输入概率或决策分数的排序指标。
- 只报 weighted 平均,掩盖小类别表现;或把 F1 当作全部业务成本。
- 在测试集上选阈值、选指标,然后把同一批结果当成无偏评估。
实际应用
- 不平衡分类
- 阈值决策
常见错误
- 用类别标签计算本应输入概率或决策分数的排序指标。
- 只报 weighted 平均,掩盖小类别表现;或把 F1 当作全部业务成本。
- 在测试集上选阈值、选指标,然后把同一批结果当成无偏评估。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。