分类指标进阶
在准确率之外引入混淆矩阵、精确率、召回率与 F1,理解它们的适用场景。
99% 准确率的"陷阱"
上节课的 SimpleCNN 在 MNIST 上拿到了 99% 的准确率, 看上去无可挑剔。但 准确率本身并不是评估分类模型的全部 —— 来看一个极端例子。
问题出在哪? 准确率把"全部样本"放在一起算 , 于是占比 99% 的多数类把全部权重都拿走了—— 模型不需要做对真正重要的少数类,也能拿到高分。
要解决这个问题,需要一组 把"正/负样本分别看待" 的指标。 本节引入混淆矩阵、精确率、召回率与 F1 分数。
混淆矩阵:分类结果的"四象限"
混淆矩阵 (Confusion Matrix)是分类问题最基础的诊断工具: 把" 真实类别 "和" 预测类别 "两个维度交叉一下, 得到一个方阵, 对角线上是分对的,非对角线上是分错的 。
二分类:四个格子
- TP :模型说"是",确实是;
- TN :模型说"不是",确实不是;
- FP : 误报 ——模型说"是",但其实不是;
- FN : 漏报 ——模型说"不是",但其实是。
多分类:扩展为 N × N 方阵
对 10 类的 MNIST 而言,混淆矩阵是 10 × 10: 行对应真实类别、列对应预测类别。 对角线 上 M[i][i] 表示 第 i 类被正确预测 的数量; 非对角线 上 M[i][j] (i ≠ j)则告诉我们: 有多少张真实为 i 类的图被错分成了 j 类 。
案例:100 人体检(10 人实际患病)
把抽象的 TP / FP / FN / TN 换成具体数字会直观得多。 假设医院对 100 位体检者 做某种罕见病筛查, 真实患病 10 人、健康 90 人 , 模型给出下面的四象限结果—— 绿色格子 是分对的, 红色格子 是分错的:
三个核心指标:Accuracy / Precision / Recall
有了混淆矩阵,三个最常用的指标就是它的不同"切片":
回头看那个 99% 的"恒阴性"模型
把它套进上面的公式: 所有正例都被漏掉(TP = 0,FN = 全部正例), FP = 0,TN = 全部负例。
- Accuracy ≈ 99%(被多数类撑起来)
- Precision : ——分母为 0,没意义,但实践中常约定为 0
- Recall : —— 把问题暴露得干干净净
召回率立刻把 "准确率掩盖下的失败" 翻了出来—— 这就是我们引入这些新指标的全部意义。
Precision 与 Recall 的权衡
精确率和召回率通常 此消彼长 : 想"宁可放过也别错抓"——把分类阈值收紧,精确率上升、召回率下降; 想"宁可错抓也别放过"——把阈值放宽,召回率上升、精确率下降。 真实业务里二者很难同时拉满,需要看场景选侧重。
- 自动驾驶刹车系统:漏检前方行人 → 事故
- 癌症早期筛查:漏诊 → 错过治疗窗口
- 安防异常检测:漏报 → 入侵未拦截
- 垃圾邮件分类:误判正常邮件 → 用户错过重要邮件
- 内容推荐系统:误判违规 → 创作者投诉、关注度下滑
- 支付风控(保守模式):误拦正常交易 → 用户体验受损
F1 分数:把 P 和 R 合成一个数
当我们 不想偏向其中一边 ,想用一个数综合衡量模型时, 最常用的指标是 F1 分数 ——精确率与召回率的 调和平均 :
如果需要对二者 加权 (比如"召回率比精确率重要 2 倍"), 可以用更一般化的 F-beta 分数——见本节附录。
多分类:macro 与 micro 平均
Precision / Recall / F1 都是 二分类指标 —— 它们的定义里有"正例 / 负例"两类的概念。 碰到 MNIST 这样的多分类问题怎么办?
通用做法是 "一类对其余" (one-vs-rest): 把每个类别 i 单独看成一次" 类别 i 是正例、其他所有类是负例 "的二分类任务, 分别算出该类的 Precision_i / Recall_i / F1_i 。 然后再 把 10 个类别的指标聚合成一个总分 —— 有两种常用聚合方式:
在 SimpleCNN 上补完整评估
上节课我们只看了一个"测试准确率"。这一节给课 7 的 SimpleCNN 补上完整的 评估报告 —— 用 Python 生态的标准工具 sklearn.metrics , 它针对各种指标提供了开箱即用的函数。
- accuracy_score / precision_score / recall_score / f1_score :算出对应指标,通过 average='macro' 或 'micro' 选择聚合方式;
- classification_report :一次性输出每个类别的 P / R / F1 + macro / micro / weighted 平均;
- confusion_matrix :返回 10 × 10 的混淆矩阵数组,可送进可视化工具画热力图。
读懂 10 × 10 混淆矩阵
下面是把 SimpleCNN 在 MNIST 测试集(10000 张)上的预测送进 confusion_matrix 后,再画成热力图的结果。 行 是真实类别 i 、 列 是预测类别 j , 格子里的数字是 真实为 i、被预测为 j 的样本数 。 颜色按 映射, 这样既能让对角线的"压倒性"清晰可见, 也不会把非对角线的细节冲淡。
- (4, 9) = 14 与 (9, 4) = 10 ——4 和 9 上半部的圈最容易互相误认;
- (3, 5) = 7 与 (5, 3) = 6 ——3 和 5 在手写时拐角形态接近;
- (2, 7) = 6 与 (7, 2) = 6 ——2 的尾巴与 7 的竖钩偶尔会被搞混。
回到 CNN 主线
指标讲完,我们再回头看一眼 CNN 的发展。 SimpleCNN 只是个 1998 年风格的"小盆栽", 但 2012 年之后 CNN 真正大放异彩 —— 在 ImageNet 竞赛中战胜传统方法、打开深度学习时代的,是一系列经典网络。
附录
附录 1:F-beta 分数
F1 把 P 和 R 看作同等重要。如果业务上希望 对其中一个加权 , 可以使用更一般的 F-beta 分数:
- :回到 F1,二者等权;
- (如 F2):偏向 召回率 ——医疗筛查、安防异常检测常用;
- (如 F0.5):偏向 精确率 ——垃圾邮件、风控保守模式常用。
附录 2:分类阈值与 PR 曲线
二分类模型通常先输出一个 概率 (如 sigmoid 输出), 再根据阈值 把它转化为 0 / 1 标签。 阈值的不同会带来 P / R 的不同—— 把所有阈值下的 (Recall, Precision) 描出来,就是 PR 曲线 。
PR 曲线给出一个" 模型整体能力 "的视图,可用 曲线下面积 (AUC-PR / AP)量化对比模型。 本章主线是 多分类 + softmax ,没有显式调阈值的需求, 但后续遇到二分类(尤其是不平衡场景)时,PR 曲线是绕不开的工具。