混淆矩阵(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 | import pandas as pd |
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 读图步骤
- 看对角线:越深/越大,该类越准。
- 找大块 off-diagonal:相邻情绪(fear ↔ sadness)常互混。
- 看 INVALID 行/列:生成式任务中格式失败集中在此。
- 对比微调前后两张矩阵:非对角质量是否向对角线迁移。
4.2 可视化
热力图(seaborn / matplotlib)是标准做法;微调前后各保存一张,便于写入实验报告。
五、局限性与常见误用
- 只展示不分析:有矩阵却不查最大 off-diagonal,浪费诊断价值。
- test 过小:某格只有 1~2 次计数,不宜过度解读。
- 标签顺序不一致:
labels=参数不固定会导致矩阵行列错位。 - 忽略 INVALID:把解析失败强行映射到最近类,会掩盖格式退化。
- 静态快照:不记录典型错误样本文本,难以指导数据增广。
六、与其他指标的关系
| 指标 | 关系 |
|---|---|
| Accuracy | (\sum_c M_{cc} / \sum_{i,j} M_{ij}) |
| macro F1 | 由每类从矩阵推出的 F1 再平均 |
| Cohen’s Kappa | 校正随机一致后的矩阵摘要;类不平衡时比 accuracy 更稳 |
七、实践建议
- 微调报告固定产出:pre / post 混淆矩阵 + 差分热力图。
- 对 off-diagonal 最大的单元格,抽样 5~10 条原文做 qualitative 分析。
- 生成式分类务必单列 INVALID,与六类并列。
- 与
classification_report同页展示:矩阵看结构,report 看数字。