机器学习中的混淆矩阵示例

⚡ 智能摘要

混淆矩阵是分类模型的性能衡量表,它将预测标签与已知的实际标签进行比较,准确地揭示分类器对哪些类别分类正确,对哪些类别分类错误。

  • 🔘 四种结果: 二元矩阵的每个单元格分别填满真阳性、真阴性、假阳性和假阴性。
  • ☑️ 错误类型: 假阳性属于第一类错误,而假阴性属于第二类错误。
  • ✅ 衍生指标: 准确率、精确率、召回率、特异性和 F1 分数都来自相同的四个计数。
  • 🧪 超越精准度: 在数据不平衡的情况下,准确率会夸大模型的性能,而矩阵则揭示了它实际上在哪个类别上表现不佳。
  • 🛠️ 多类视图: N 个类别会生成一个 N×N 的网格,其中对角线上包含了所有正确的预测。
  • ⚙️ Python 路线: scikit-learn 使用 confusion_matrix() 和 classification_report() 两行代码构建同一个表格。

机器学习中的混淆矩阵及其示例

什么是混淆矩阵?

A 混淆矩阵 是一种用于衡量绩效的技术 机器学习 分类。混淆矩阵是一个表格,它展示了分类模型在已知真实值的测试数据集上的表现。混淆矩阵这个术语本身很简单,但其背后的专业术语却可能令人困惑,因此下面将用通俗易懂的语言解释每个部分。

该矩阵适用于任何 监督分类器 —逻辑回归、决策树、 朴素贝叶斯模型 或者 深度神经网络 因为它只比较两列标签:模型预测的结果和实际发生的结果。

混淆矩阵的四个结果

混淆矩阵通过比较实际类别和预测类别来直观显示分类器的准确率。二元混淆矩阵由以下方块组成:

二元混淆表显示了 TP、FP、FN 和 TN 象限
混淆表

上表描绘了每个二元混淆矩阵包含的四个方格:

  • TP:真阳性: 预测值被正确预测为实际正值。
  • FP:假阳性: 预测值被错误地预测为实际正值,即负值被预测为正值。
  • FN:假阴性: 正值预测为负值
  • TN:真阴性: 预测值被正确预测为实际负值

统计学给这两个误差单元格起了各自的名字。假阳性就是一个 类型I错误 模型发出了本不该发出的警报。假阴性是指 II型错误 模型本应发出警报,却保持沉默。了解哪种方法对你的问题来说成本更高,就能决定你之后应该调整哪个指标。

您可以根据混淆矩阵计算准确率,如下公式所示:

根据四个混淆矩阵结果推导出的准确率公式

混淆矩阵示例

混淆矩阵是一种有用的机器学习方法,它可以用来衡量召回率、精确率、准确率以及AUC-ROC曲线。下面的足球例子用通俗易懂的方式解释了真阳性、真阴性、假阳性和假阴性的含义。

真实的正面:

你做出了积极的预测,结果也确实如此。例如,你预测法国会赢得世界杯,而法国最终也赢得了冠军。

真正的否定:

你预测结果为阴性,而事实也的确如此。你预测英格兰不会赢,结果他们输了。

假阳性:

你的预测是正的,而且是假的。

你曾预测英格兰会赢,但他们输了。

假阴性:

你的预测是负面的,但结果证明它是错误的。

你曾预测法国不会赢,但它赢了。

你应该记住,第一个词描述预测是否正确(真或假),第二个词描述模型预测的结果(正或负)。

如何计算混淆矩阵

以下是计算混淆矩阵的详细步骤。 数据挖掘:

  • 步骤1) 首先,你需要一个测试数据集及其预期结果值。
  • 步骤2) 预测测试数据集中的所有行。
  • 步骤3) 将预期结果与预测结果进行比较并计数:
    1. 每个类别正确预测的总数。
    2. 每个类别的错误预测总数。

之后,这些数字按以下方法组织:

  • 矩阵中的每一行都对应一个实际的类别。
  • 矩阵中的每一列都与一个预测类别相关联。
  • 正确和错误分类的总数都输入到表中。
  • 一个类别的正确预测总数将填入该类别实际行与其预测列相交的单元格中——即对角线单元格。
  • 对于某一类别,所有错误预测的总和将计入该类别的实际值行,以及模型实际选择的预测类别的列中。

行和列的角色是一种约定俗成的规则,而非硬性规定。有些绘图工具会颠倒布局,因此在解读矩阵之前务必先阅读坐标轴标签。这里使用的矩阵方向——行代表实际值,列代表预测值——是 scikit-learn 生成的。

使用混淆矩阵的其他重要术语

一旦确定了这四个计数,一系列辅助术语就可以描述同一张表的不同部分:

  • 阳性预测值(PPV): 这与精确率非常接近。两者之间的一个显著区别在于,阳性预测值考虑了患病率。在类别完全平衡的情况下,阳性预测值与精确率相同。
  • 零错误率: 这个术语定义了如果你总是预测多数类,那么你的预测出错的概率是多少。你可以把它当作一个基准指标,用来衡量你的分类器性能。
  • F 分数: F1 分数是真正率(召回率)和精确率的加权平均分数。
  • 中华民国曲线: ROC曲线绘制了不同阈值下真阳性率与假阳性率的关系图。它还展示了灵敏度(召回率)和特异性(真阴性率)之间的权衡关系。
  • 精确: 精度指标显示了正类的准确度。它衡量正类预测的正确性。

精确率公式:真阳性率除以真阳性率加假阳性率

当分类器完美地将所有正例分类为负例时,得分最高为 1。单独使用精确率意义不大,因为它忽略了负例。该指标通常与召回率结合使用。召回率也称为灵敏度或真正例率,其表达式如下所示。

  • 灵敏度: 灵敏度计算的是正确检测到的正类样本的比例。该指标显示了模型识别正类样本的能力。

灵敏度公式:真阳性数除以真阳性数加假阴性数

混淆矩阵指标和公式

以上每个指标都是基于相同的四个方面进行计算的,因此将它们与它们各自回答的问题并列查看会很有帮助。

米制 公式 它解答的问题 在以下情况下使用
准确性 (TP + TN)/(TP + TN + FP + FN) 总共有多少预测是正确的? 各级别大致平衡。
平台精度 总收益/(总收益+预期收益) 当模型给出肯定结果时,它的正确率是多少? 误报代价高昂。
召回率(灵敏度) TP / (TP + FN) 在所有真正的阳性病例中,有多少被发现了? 漏诊代价高昂。
特异性 总氮/(总氮+磷) 在所有真实的负面事件中,有多少被澄清了? 负面阶级也很重要。
F1分数 2 × (精确率 × 召回率) / (精确率 + 召回率) 两者之间如何取得平衡? 你需要一个号码来表示这两个情况。

假设一个垃圾邮件过滤器对 100 封邮件进行了测试,结果为:真阳性 (TP) = 45,假阴性 (FN) = 5,假阳性 (FP) = 10,真阴性 (TN) = 40。准确率为 (45 + 40) / 100 = 0.85。精确率为 45 / (45 + 10) = 0.82,召回率为 45 / (45 + 5) = 0.90,特异性为 40 / (40 + 10) = 0.80。F1 分数为 0.86。

这些数据揭示了一个单一准确率指标所掩盖的故事:过滤器能拦截90%的真实垃圾邮件,但每五个被标记的邮件中就有一封会被错误地隔离。这种取舍是否可以接受,取决于每次错误的代价,而这正是为什么我们报告的是综合矩阵而非单纯的准确率。

多类分类的混淆矩阵

分类问题很少只涉及两个标签,矩阵会随着类别的增加而扩展,但形状不变。对于 N 个类别,表格会变成一个 N×N 的网格:对角线上的单元格记录了所有正确的预测结果,而每个非对角线上的单元格则精确地记录了哪些类别被误判为其他类别。

一个将图像分类为猫、狗和兔子的三分类模型会生成一个 3×3 的网格。如果“猫”行“狗”列的单元格包含 12,则表示有 12 张猫的图像被错误地标记为狗。正是这种细节层次使得该矩阵比分数更有用:它指出了模型无法区分的具体类别对。

精确率、召回率和 F1 值是按类别定义的,采用一对多的视角,其中目标类别为正类,其余均为负类。然后,将每个类别的指标以以下三种方式之一进行组合:

  • 宏观平均值: 分别计算每个类别的指标,然后取未加权平均值。每个类别权重相同,因此不会掩盖稀有类别的影响。
  • 微平均: 在计算指标之前,先汇总所有类别的真阳性 (TP)、假阳性 (FP) 和假阴性 (FN) 计数。大类别占主导地位,对于单标签问题,微精度、微召回率和准确率是相同的。
  • 加权平均值: 使用每个类别的真实实例数作为权重,对每个类别的得分进行平均,这样可以清晰地显示类别不平衡情况。

当每个班级都同等重要时,选择宏;当班级分布反映真实流量时,选择加权。

如何创建混淆矩阵 Python

scikit-learn 库会根据两个标签数组构建整个表格,因此无需手动计数。下面的示例比较了十个真实标签和十个预测标签。

from sklearn.metrics import confusion_matrix

y_true = [1, 0, 1, 1, 0, 1, 0, 0, 1, 0]
y_pred = [1, 0, 1, 0, 0, 1, 1, 0, 1, 0]

cm = confusion_matrix(y_true, y_pred)
print(cm)

该调用返回一个 2×2 的 NumPy 数组,其中第 0 行是实际的负类,第 1 行是实际的正类:

[[4 1]
 [1 4]]

根据 scikit-learn 的约定读取数组,得到 TN = 4(左上),FP = 1(右上),FN = 1(左下)和 TP = 4(右下)。将这四个值解包到一行中,即可得到映射。ping 明确:

tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()

要一次性获得每个类别的精确率、召回率和 F1 值(包括上述宏和加权平均值),请调用 classification_report() 而不是手动计算每个指标:

from sklearn.metrics import classification_report

print(classification_report(y_true, y_pred))

对于绘制的版本, ConfusionMatrixDisplay.from_predictions(y_true, y_pred) 将同一表格渲染成带标签的热图。完整的参数列表,包括: labels 和 normalize 选项,已记录在案 scikit-learn 混淆矩阵参考同样的评估步骤也适用于用以下方法构建的模型: TensorFlow因为该指标仅取决于预测的标签。

为什么需要混淆矩阵?

以下是使用混淆矩阵的优点和好处。

  • 它展示了分类模型在进行预测时如何变得混乱。
  • 混淆矩阵不仅可以让你了解分类器犯的错误,还可以让你了解它犯的错误类型。
  • 这种分析有助于克服仅使用分类准确率的局限性。
  • 混淆矩阵的每一列代表该预测类的实例。
  • 混淆矩阵的每一行代表实际类的实例。
  • 它将模型评估转化为诊断,指出需要更多数据或更好特征的具体类别对。

正是由于其诊断价值,混淆矩阵才在任何评估阶段都处于核心地位。 数据科学 工作流程,以及为什么它通常是分类器升级到生产环境之前审查的第一个表。

常见问题

如果只有 2% 的记录是欺诈性的,那么每次都预测“非欺诈”的模型虽然准确率高达 98%,却什么也没发现。矩阵会立即暴露出真正的阳性单元格为空的情况,这就是为什么在数据存在偏差的情况下,召回率比准确率更重要的原因。

归一化矩阵显示的是比例而非原始计数,通常是将每个单元格除以其所在行的总和。它使样本量差异很大的类别能够一目了然地进行比较,但同时也隐藏了样本量——因此,当类别不平衡时,应同时报告两种版本。

在几个不同的概率阈值下重建矩阵,并观察其变化。降低阈值会将记录从假阴性单元格移至真阳性单元格,从而提高召回率,但也会增加假阳性率。选择剩余误差组合成本最低的阈值。

不。矩阵统计的是离散标签匹配项,因此需要类别。回归输出是连续的,其评估指标是平均绝对误差或R平方等误差度量。将连续目标值划分成不同的区间是使矩阵有意义的唯一方法。

通常情况下,召回更为重要,因为漏诊的代价远高于不必要的后续检查。因此,筛查工具的设计目标是将假阴性率控制在接近于零的水平,并允许出现一些假阳性结果,这些假阳性结果随后会通过确认性检查进行过滤。

自动化模型评估工具现在可以扫描每个非对角线单元格,对成本最高的混淆进行排序,并建议哪些类别需要更多训练数据或合并标签。它们还可以自动扫描阈值,将手动比较矩阵的工作转化为排名列表。

GitHub 副驾驶 根据简短的注释,草拟导入语句、指标调用和热图。请将此草稿视为起点——务必自行确认坐标轴顺序和正标签论证,因为转置矩阵会使所有结论都失效。

样本量要足够大,即使最稀有的类别也能在其所在行中占据一个可接受的计数——少量样本会导致指标在不同运行之间剧烈波动。交叉验证(将不同折叠的矩阵相加)比单一的小样本分割能提供更稳定的结果。

总结一下这篇文章: