混淆矩阵
按真实类别与预测类别统计正确、误报和漏报,是分类错误分析的基础。
学习前需要掌握
背景与问题
同样的准确率可能来自不同错误:系统可能频繁误报,也可能漏掉大量真正的正例。混淆矩阵把真实类别与预测类别交叉计数,让错误结构变得可见。
读矩阵之前,必须知道哪个标签是正类,以及行列分别代表什么。没有这些约定,四个数字本身无法解释。
概念定义
二分类包含 TP、FP、FN、TN;多分类主对角线是正确预测,非对角线显示具体混淆方向。
直观理解
把每个真实类别的答案流向各预测类别,错误方向一目了然。
核心原理
在 scikit-learn 的约定中,行是真实标签,列是预测标签;显式指定 labels 可以固定排列。二分类采用标签顺序 0、1 时,第一行依次是 TN、FP,第二行依次是 FN、TP。
原始计数反映工作量与错误数量,按真实类别归一化则显示每类样本流向各预测类别的比例。按预测类别归一化回答另一个问题:某个预测标签中的真实构成是什么,不能混用分母。
每类 support 是该类真实样本数。少数类只有几个样本时,比例会非常不稳定;还应结合样本规模和错误代价解释,而不是只看颜色深浅。
多分类矩阵的每个非对角格表示一种具体混淆,可以帮助定位近似类别、标签规则或数据切片。矩阵依赖阈值和评价样本分布,不能把一次矩阵直接推广到其他人群或业务流量。
数学表达
核心表达
必须明确正类定义和行列约定;同时报告原始数量、归一化比例和每类 support。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1产生独立预测
- 2固定标签顺序
- 3计算矩阵
- 4查看对角/非对角
代码对应位置
示例 1固定标签顺序并核对行归一化:用固定 8 个样本复核矩阵方向、计数与分母,不依赖训练模型。
案例:8 个构造样本的两种分母
设真实负类与正类各 4 个;负类中误报 1 个,正类中漏报 2 个,矩阵是第一行 3、1,第二行 2、2。总体正确 5 个,但正类召回率只有 2 / 4 = 0.5。
按真实类别归一化后第二行是 0.5、0.5;按预测类别看,预测为正的 3 个中有 2 个正确,精确率为 2 / 3。这说明召回率与精确率读取同一矩阵,却使用不同分母。所有数值均为教学构造。
计算与实现步骤
- 产生独立预测
- 固定标签顺序
- 计算矩阵
- 查看对角/非对角
- 按类归一化
- 回查错误样本
代码实现
示例 1
固定标签顺序并核对行归一化
example_01.py用途:用固定 8 个样本复核矩阵方向、计数与分母,不依赖训练模型。
from sklearn.metrics import confusion_matrix
y_true = [0, 0, 0, 0, 1, 1, 1, 1]
y_pred = [0, 0, 0, 1, 0, 0, 1, 1]
counts = confusion_matrix(y_true, y_pred, labels=[0, 1])
by_true = confusion_matrix(y_true, y_pred, labels=[0, 1], normalize="true")
assert counts.tolist() == [[3, 1], [2, 2]]
print("counts:", counts.tolist())
print("row_normalized:", by_true.tolist())代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
用固定 8 个样本复核矩阵方向、计数与分母,不依赖训练模型。
y_pred- 模型对输入产生的预测结果。
Step 1 · 1–1 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
from sklearn.metrics import confusion_matrixStep 2 · 3–9 行
输出中间参数、形状或最终指标,用于核对代码是否符合预期。
y_true = [0, 0, 0, 0, 1, 1, 1, 1]
y_pred = [0, 0, 0, 1, 0, 0, 1, 1]
counts = confusion_matrix(y_true, y_pred, labels=[0, 1])
by_true = confusion_matrix(y_true, y_pred, labels=[0, 1], normalize="true")
assert counts.tolist() == [[3, 1], [2, 2]]
print("counts:", counts.tolist())
print("row_normalized:", by_true.tolist())预期输出或运行结果
本地 scikit-learn 1.8.0 的核对输出: counts: [[3, 1], [2, 2]] row_normalized: [[0.75, 0.25], [0.5, 0.5]]
常见错误 · 3 条
- 不说明标签排列和行列含义,就直接把左上格称为 TP。
- 只看归一化比例不看 support,或把行归一化当成预测可信度。
- 修改阈值后继续沿用旧矩阵解释当前系统行为。
实际应用
- 分类评价
- 错误分析
常见错误
- 不说明标签排列和行列含义,就直接把左上格称为 TP。
- 只看归一化比例不看 support,或把行归一化当成预测可信度。
- 修改阈值后继续沿用旧矩阵解释当前系统行为。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。