Confusion Matrix
混淆矩阵按类别统计模型预测结果与真实标签。了解如何读懂混淆矩阵、它能得出哪些指标,以及检测任务中的混淆矩阵形式。
混淆矩阵是一种表格,用于统计分类模型的预测与真实标签的对应情况。一条轴列出实际类别,另一条轴列出预测类别,每个单元格统计落入对应类别组合的样本数。正确预测位于对角线上,所有错误预测都位于对角线之外,落在明确指出哪一类被误判成哪一类的单元格中。因此,混淆矩阵是查看模型错误的标准首选视图,也是计算准确率、精确率、召回率和F1 分数的数据来源。
解读二分类混淆矩阵#
有两个类别时,矩阵包含四个单元格:
- 真正例 (TP):被预测为正例的正例样本,例如被标记为有缺陷的缺陷零件。
- 假正例 (FP):被预测为正例的负例样本,也称为 I 类错误或误报。
- 假负例 (FN):被预测为负例的正例样本,也称为 II 类错误或漏检。
- 真负例 (TN):被预测为负例的负例样本。
大多数二分类指标都是这四项计数的比值。精确率为 TP / (TP + FP),召回率为 TP / (TP + FN),准确率为 (TP + TN) 除以四项计数之和。哪个非对角线单元格更重要,取决于具体应用:癌症筛查会通过调优来降低假负例,而垃圾邮件过滤器则会通过调优来降低假正例。
多类别混淆矩阵#
有 N 个类别时,矩阵的大小为 N × N。在scikit-learn 的 confusion_matrix所采用的方向中,每一行代表一个真实类别,每一列代表一个预测类别。沿着一行查看,可以看到该类别的样本被分到了哪些类别,因此该行对角线单元格的值除以行总数,就是该类别的召回率。沿着一列查看,可以看到模型预测为该类别的样本实际属于哪些类别,因此该列对角线单元格的值除以列总数,就是该类别的精确率。有些工具会绘制转置后的矩阵,因此应根据坐标轴标签来解读图表。
from sklearn.metrics import confusion_matrix
# 10 张图像的真实标签和预测标签
y_true = ["cat", "cat", "cat", "dog", "dog", "dog", "dog", "fox", "fox", "fox"]
y_pred = ["cat", "cat", "dog", "dog", "dog", "dog", "cat", "fox", "dog", "fox"]
# 行表示真实类别,列表示预测类别,顺序与此标签顺序一致
labels = ["cat", "dog", "fox"]
matrix = confusion_matrix(y_true, y_pred, labels=labels)
print(matrix)猫、狗和狐狸对应的打印行分别是 [2 1 0]、[1 3 0] 和 [0 1 2]。对角线包含 10 张图像中的 7 张,因此准确率为 0.7。狗这一列收录了一张猫和一张狐狸的图像,因此狗的精确率为 3 / 5 = 0.6;狗这一行有一张图像被误分为猫,因此狗的召回率为 3 / 4 = 0.75。归一化矩阵会将每个单元格除以其真实类别的总数,因此对角线显示每个类别的召回率,并使规模差异很大的类别可以相互比较。
目标检测的混淆矩阵#
检测会增加一个背景类别,因为检测器可能在没有物体的地方报告一个框,也可能完全漏掉一个物体。首先根据交并比 (IoU)将预测与标签匹配,然后进行计数:匹配的样本对计入对应类别的单元格,未匹配的预测作为背景对应的假正例计数,未匹配的标签则作为预测为背景的假负例计数。背景与背景对应的单元格始终为空,因为无法统计空白图像区域,所以检测混淆矩阵没有真负例。YOLO26验证会为背景增加一行和一列来构建此矩阵,将 IoU 高于 0.45 的预测与标签进行匹配,并将其保存为 confusion_matrix.png,其中纵轴为预测类别,横轴为真实类别。
from ultralytics import YOLO
# Load a pretrained YOLO26 nano detector
model = YOLO("yolo26n.pt")
# Validation builds the confusion matrix and saves it as confusion_matrix.png
metrics = model.val(data="coco8.yaml")
matrix = metrics.confusion_matrix.matrix # rows: predicted class, columns: true class
# 80 COCO classes plus one background row and column
print(matrix.shape)
# Class 0 is "person": correct detections and people the model missed
print(f"Person TP: {matrix[0, 0]:.0f}, missed: {matrix[-1, 0]:.0f}")矩阵的形状为 (81, 81),最后一行统计了没有任何预测与之匹配的已标注人员。
混淆矩阵与相关工具#
- ROC 曲线:每个决策阈值对应一个点,每个点将该阈值下的混淆矩阵概括为真正例率和假正例率。
- 平均精度均值 (mAP):主要的检测评分,由所有置信度水平下相同的 TP 和 FP 决策构成,但不会显示哪些类别被混淆。
- 准确率:将矩阵压缩为一个数字,即对角线计数除以总数。在负例占 95% 的数据集上,始终预测“负例”的模型能得到 95% 的准确率,而它的矩阵显示真正例为零。










