分类评估指标:混淆矩阵、Precision/Recall 与 ROC-AUC
一句话定义
分类评估把预测结果落进混淆矩阵(TP/FP/FN/TN),派生出精确率、召回率、F1、特异度等阈值化指标与 ROC-AUC、PR-AUC 等排序型指标;选哪个指标取决于错误的业务代价与类别平衡状况。
为什么重要
「准确率 99%」可能毫无意义(1% 正类全预测为负也是 99%)。指标选错,模型优化方向就错:风控要控制误伤(精确率)、漏诊筛查要压低假阴性(召回率)。指标是业务目标与训练目标之间的翻译层,是评估闭环里最需要与业务方对齐的环节。
前置知识
逻辑回归与交叉熵损失 的概率输出与阈值;基础比例概念。
核心概念
- 混淆矩阵:TP(真阳)、FP(假阳/误报)、FN(假阴/漏报)、TN(真阴)。
- 精确率 P = TPTP + FP:报出来的里面有多少是真的。
- 召回率 R = TPTP + FN:真实正类抓住了多少。
- F1:2PRP + R,两者的调和平均(调和平均惩罚短板,比算术平均严格)。
- 特异度 TNTN + FP;假阳率 FPR = 1 - 特异度。
- ROC 曲线:阈值从 1 扫到 0 时(TPR, FPR)轨迹;AUC:曲线下面积 = 随机取一正一负样本、正类得分更高的概率。
- PR 曲线:Precision-Recall 轨迹,正类稀少时比 ROC 更敏感。
直观类比
机场安检是高召回低精确策略:宁可多摸几个包(FP 多)也不能漏掉危险品(FN 极贵)。银行反欺诈相反:每笔误冻结都要赔客户体验(FP 贵)。同一个模型输出概率后,阈值往哪拨由「哪类错误更贵」决定——指标不是数学品味题,是业务定价题。
原理与机制
阈值化指标是阈值的函数:阈值降 → 召回升、精确率通常降。因此单点比较模型必须固定阈值,或直接比较与阈值无关的排序质量(ROC-AUC、PR-AUC)。AUC 的概率解释 AUC = P(s+ > s-) 使它可做 Mann-Whitney U 检验的统计推断;ROC 对类别不平衡不敏感(TPR、FPR 各自在类内归一),而 PR 曲线的精确率分母含 FP(由负类规模决定),失衡时曲线剧烈变形——这就是「不平衡数据看 PR」的原因(见 kp-026)。多分类时逐类算 one-vs-rest 指标再聚合:macro 平均各类等权(看少数类表现用)、micro 平均按样本聚合(看整体流量表现用)、weighted 按支持度加权。
阈值选择的规范做法:在训练区用 CV 找满足业务约束的阈值(如精确率 ≥ 0.9 下召回最大),锁定后随模型一起上线,绝不在测试集上挑阈值(又是 kp-025 的选择偏差)。
公式与推导
F1 用调和平均的动机:若 P = 0.01, R = 1(无脑全报正),算术平均 0.5 虚高,调和平均 ≈ 0.02 忠实反映「没用的模型」。AUC 概率解释的推导:曲线下面积即 ∫01 TPR(t) dFPR(t),展开为对正负样本对的排序统计量,等于 P(s^+ > s^-) + 12P(s^+ = s^-)。
图示
TPR(召回)
1 ┤ ●●●●●●● ← 好模型(AUC≈0.97)
│ ●●
│ ●● ╱ 随机猜测(AUC=0.5)
│ ●● ╱
0 ┼●───╱─────────▶ FPR(误报率)
阈值沿曲线从严到松滑动实例或案例
不平衡数据上「准确率幻觉」与指标选择:
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import (classification_report, roc_auc_score,
average_precision_score)
X, y = make_classification(n_samples=5000, weights=[0.97, 0.03], # 3% 正类
flip_y=0.02, random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, stratify=y, random_state=0)
m = LogisticRegression(max_iter=2000).fit(X_tr, y_tr)
print("Accuracy:", m.score(X_te, y_te)) # ≈0.97 的幻觉
print("AUC:", roc_auc_score(y_te, m.predict_proba(X_te)[:, 1]))
print("PR-AUC:", average_precision_score(y_te, m.predict_proba(X_te)[:, 1]))
print(classification_report(y_te, m.predict(X_te), digits=3)) # 看少数类行准确率接近 0.97 但少数类召回可能不足 0.6——这正是必须拆开看指标的原因。
常见误区
- 用准确率报告不平衡任务:基线「全预测多数类」就能刷高分。
- 在测试集上挑阈值或挑指标最优模型:选择偏差,阈值属于训练决策(kp-022)。
- 把 AUC 当业务指标直接汇报:AUC 衡量排序,上线系统按固定阈值行动,两者可能背离;应补「阈值处的 P/R」。
- macro/micro 不分:少数类重要性高时 macro 才能暴露问题,micro 会被多数类淹没。
与其他知识点的关系
交叉验证与数据划分策略 提供指标的稳健计算协议;不平衡数据与代价敏感学习 的类权重与重采样本质是在 P/R 之间挪动支点;端到端机器学习工作流与 Pipeline 把指标选择写进问题定义环节;数据泄漏与常见评估陷阱 提醒阈值与预处理都只能用训练区信息。
自测题
- 什么场景应优化召回而非精确率?代价矩阵如何体现?
- 要点:FN 代价远高于 FP 时(漏诊、漏欺诈);代价矩阵 cFN ≫ cFP,阈值下调、或代价敏感训练(kp-026)。
- AUC = 0.85 的概率含义?它对类别不平衡为何不敏感?
- 要点:随机正样本得分高于随机负样本的概率 0.85;TPR/FPR 各自在类内归一,比例变化不改变排序统计。
- 为什么不平衡任务更该看 PR-AUC?
- 要点:Precision 的分母含 FP,其值直接被负类规模放大;PR 曲线聚焦少数类的 P/R 权衡,区分度更高。
延伸阅读
周志华《机器学习》第 2.3 节;Saito & Rehmsmeier, The Precision-Recall Plot Is More Informative than the ROC Plot…(PLOS ONE, 2015)。