混淆矩阵(Confusion Matrix)详解

混淆矩阵(Confusion Matrix)把分类结果整理成「真值 × 预测」的计数表。它不压缩成单一数字,而是回答:模型具体在哪些类别对上、哪些类别互相搞混——是微调诊断里最有信息密度的一张表。

段末注释:对角线元素为各类 TP(True Positive,真阳性);非对角线 (M_{ij}) 表示真值为 (i) 却被预测为 (j) 的样本数。

系列索引:微调评估指标导读


一、直观含义

对 (C) 类分类,矩阵 (M \in \mathbb{R}^{C \times C}):

  • 行:真实标签
  • 列:预测标签
  • (M_{ij}):真实为类 (i)、预测为类 (j) 的样本数

正确预测落在对角线 (M_{ii});混淆落在非对角线——例如「真 fear 预测成 sadness」的次数。


二、使用场景与所需数据

场景 价值
多类分类微调验收 — 定位 weak class
错误分析 / 迭代数据 — 决定补哪些类样本
二分类 可用,但 ROC-AUC 也常用
开放生成 不适用

数据要求:与 Accuracy 相同——每条样本一对 ((y_i, \hat{y}_i))。生成式任务建议增加 INVALID 伪类,统计无法解析的输出。


三、计算方式

3.1 构建

1
2
3
4
5
6
7
8
import pandas as pd
from sklearn.metrics import confusion_matrix

label_names = ["sadness", "joy", "love", "anger", "fear", "surprise"]
ALL_LABELS = label_names + ["INVALID"] # 可选

cm = confusion_matrix(y_true, y_pred, labels=ALL_LABELS)
cm_df = pd.DataFrame(cm, index=ALL_LABELS, columns=ALL_LABELS)

3.2 由矩阵推导 P/R/F1

对类 (c):

$$
TP_c = M_{cc},\quad FP_c = \sum_{i \neq c} M_{ic},\quad FN_c = \sum_{j \neq c} M_{cj}
$$

代入即得 Precision / Recall / F1

3.3 归一化(可选)

行归一化(按真值):每行和为 1,显示「该类被预测成各列的比例」——便于比较 recall 结构。

1
cm_norm = cm.astype(float) / cm.sum(axis=1, keepdims=True)

四、如何解读

4.1 读图步骤

  1. 看对角线:越深/越大,该类越准。
  2. 找大块 off-diagonal:相邻情绪(fear ↔ sadness)常互混。
  3. 看 INVALID 行/列:生成式任务中格式失败集中在此。
  4. 对比微调前后两张矩阵:非对角质量是否向对角线迁移。

4.2 可视化

热力图(seaborn / matplotlib)是标准做法;微调前后各保存一张,便于写入实验报告。


五、局限性与常见误用

  1. 只展示不分析:有矩阵却不查最大 off-diagonal,浪费诊断价值。
  2. test 过小:某格只有 1~2 次计数,不宜过度解读。
  3. 标签顺序不一致labels= 参数不固定会导致矩阵行列错位。
  4. 忽略 INVALID:把解析失败强行映射到最近类,会掩盖格式退化。
  5. 静态快照:不记录典型错误样本文本,难以指导数据增广。

六、与其他指标的关系

指标 关系
Accuracy (\sum_c M_{cc} / \sum_{i,j} M_{ij})
macro F1 由每类从矩阵推出的 F1 再平均
Cohen’s Kappa 校正随机一致后的矩阵摘要;类不平衡时比 accuracy 更稳

七、实践建议

  1. 微调报告固定产出:pre / post 混淆矩阵 + 差分热力图。
  2. 对 off-diagonal 最大的单元格,抽样 5~10 条原文做 qualitative 分析。
  3. 生成式分类务必单列 INVALID,与六类并列。
  4. classification_report 同页展示:矩阵看结构,report 看数字。
-------------本文结束感谢您的阅读-------------