跳至主要内容

机器学习中的混淆矩阵是什么?模型评估工具详解

了解混淆矩阵如何将模型预测划分为真正类、假正类、真负类与假负类。继续阅读,理解其结构、计算步骤,以及在处理类别不平衡与错误分析中的用途。
· 12分钟 阅读

使用 AI 探索

今年是数据科学领域创新迭出的年份,人工智能与机器学习频频登上头条。尽管 2023 年的进展有目共睹,但同样重要的是认识到:许多机器学习的突破,之所以成为可能,是因为模型经历了正确的评估流程。数据从业者的任务,是确保采用准确的评估与流程来衡量机器学习模型的表现。这不是锦上添花,而是必不可少。

如果您正在学习数据科学之道,本文将带您通过混淆矩阵这一相对简单却功能强大的工具,掌握模型评估的关键步骤。

那么,让我们开始深入了解混淆矩阵。

什么是混淆矩阵?

混淆矩阵是用于评估模型性能的工具,通常以表格形式可视化呈现。它能为数据从业者提供更深入的洞察,了解模型的表现、错误与薄弱环节,从而进一步通过微调来分析与改进模型。

混淆矩阵的结构

我们先用“识别一封邮件是否为垃圾邮件”的例子,来学习混淆矩阵的基本结构。

  • 真正类(TP) - 模型预测为正类且正确。例如,将垃圾邮件识别为垃圾邮件。
  • 真负类(TN) - 模型预测为负类且正确。例如,将正常邮件识别为非垃圾邮件。
  • 假正类(FP) - 模型将负类错误预测为正类。例如,将正常邮件识别为垃圾邮件。
  • 假负类(FN) - 模型将正类错误预测为负类。例如,将垃圾邮件识别为正常邮件。

要真正理解混淆矩阵,请看下面这张可视化图:

混淆矩阵的结构

混淆矩阵的基本结构

混淆矩阵相关术语

要深入理解混淆矩阵,必须掌握用于衡量模型表现的重要指标。

我们来定义这些关键指标:

准确率(Accuracy)

准确率衡量正确分类的总数占全部样本的比例。

混淆矩阵的准确率公式

召回率/灵敏度(Recall/Sensitivity)

召回率/灵敏度衡量真正类数量占实际正类总数的比例。

混淆矩阵的召回率公式

精确率(Precision)

精确率衡量真正类数量占被预测为正类总数的比例。

混淆矩阵的精确率公式

特异度(Specificity)

特异度衡量真负类数量占实际负类总数的比例。

混淆矩阵的特异度公式

F1 分数

F1 分数是精确率与召回率的调和平均,给出单一综合指标。

混淆矩阵的 F1 分数公式

混淆矩阵的作用

要更好地理解混淆矩阵,您需要知道它的目的及其广泛应用的原因。

在衡量模型表现或一般事物时,人们往往关注准确率。然而,过度依赖准确率可能导致错误决策。为理解这一点,我们将讨论将准确率作为单一指标使用的局限性。

将准确率作为单一指标的局限

如上所述,准确率衡量正确分类总数占样本总数的比例。但单独使用这一指标有如下局限:

  • 类别不平衡:没有任何数据是完美的,使用准确率应结合其预测能力来评估。例如,当数据集中某一类远多于另一类时,模型可能只要预测多数类就能获得很高的准确率。
  • 错误类型:在具体情境下理解模型的表现,有助于微调并提升效果。例如,通过混淆矩阵区分 FP 与 FN 等错误类型,能帮助您探索模型的局限。

针对这些局限,混淆矩阵结合多种指标,能够为如何改进模型性能提供更细致的洞察。

混淆矩阵的优势

如混淆矩阵的基本结构所示,预测被分解为四类:真正类、真负类、假正类与假负类。

这一细分带来了有价值的洞见与改进方案:

  • 解决类别不平衡:如前所述,单独使用准确率在处理不平衡数据时存在局限。引入精确率与召回率等指标,能够提供更均衡、更准确的刻画。例如,在金融等行业,假正与假负可能带来严重后果。
  • 区分错误类型:了解机器学习模型产生的不同错误类型,有助于识别其局限与改进空间。
  • 权衡关系:在混淆矩阵中使用不同指标存在权衡关系,并会相互影响。例如,提升精确率通常会降低召回率。理解这些受影响的指标值,将指导您改进模型表现。

计算混淆矩阵

现在我们已经了解了混淆矩阵的基础、术语与用途,接下来手动计算一个混淆矩阵,并通过实践例子来说明。

手动计算混淆矩阵

以下是手动计算混淆矩阵的分步指南。

定义结果

第一步是明确任务的两种可能结果:正类或负类。

收集预测

确定可能结果后,下一步是收集模型的所有预测,包括各类别被预测的次数及其出现情况。

分类结果

汇总所有预测后,将结果归入四类:

  • 真正类(TP)
  • 真负类(TN)
  • 假正类(FP)
  • 假负类(FN)

创建矩阵

完成分类后,将其以矩阵表格呈现,便于使用多种指标进一步分析。

混淆矩阵实践示例

让我们通过一个实际示例来演示这一过程。

继续沿用“识别邮件是否为垃圾邮件”的例子,构造一份假想数据集,其中垃圾邮件为正类,非垃圾邮件为负类。我们有如下数据:

  • 在 200 封邮件中,实际有 80 封是垃圾邮件,模型正确识别出其中60封为垃圾邮件(TP)。
  • 在 200 封邮件中,实际有 120 封不是垃圾邮件,模型正确识别出其中100封为非垃圾邮件(TN)。
  • 在 200 封邮件中,模型将20封非垃圾邮件错误识别为垃圾邮件(FP)。
  • 在 200 封邮件中,模型漏检20封垃圾邮件并将其识别为非垃圾邮件(FN)。

至此我们已定义结果并收集了数据;下一步是将结果归入四类:

  • 真正类:60
  • 真负类:100
  • 假正类:20
  • 假负类:20

接下来将其整理为混淆矩阵:

实际 / 预测

垃圾邮件(正类)

非垃圾邮件(负类)

垃圾邮件(正类)

60(TP)

20(FN)

非垃圾邮件(负类)

20(FP)

100(TN)

那么,这个混淆矩阵告诉了我们什么?

  • 真正类与真负类代表预测准确。
  • 假正类代表模型将负类错误预测为正类。
  • 假负类代表模型未能识别并预测正类。

基于该混淆矩阵,我们可以计算多种指标:准确率、召回率/灵敏度、精确率、特异度以及 F1 分数。

混淆矩阵的指标输出

混淆矩阵的指标输出

精确率 vs. 召回率

您可能会好奇,为什么 F1 分数的公式要同时包含精确率与召回率。当处理类别不平衡数据,或需要在精确率与召回率之间取得平衡时,F1 分数尤为关键。

精确率衡量正类预测的准确性。它回答的是:“当模型预测为 TRUE 时,有多大概率是对的?”尤其在假正成本很高的情境中,精确率很重要。

召回率(或灵敏度)衡量模型正确识别的实际正类比例。它回答的是:“当实际类别为 TRUE 时,分类器有多大概率预测正确?”

当漏检正类(FN)的代价显著高于将负类误判为正类时,召回率就尤为重要。

  • 精确率的使用场景:假正可能带来严重后果。例如,金融领域的分类模型将交易误判为欺诈。在这类场景中,精确率至关重要。
  • 召回率的使用场景:识别所有正类案例可能至关重要。例如,医疗领域的分类模型若未能正确诊断将造成严重影响。在必须尽可能识别全部正类的情形下,召回率很重要。

在 Python 中使用 Scikit-learn 构建混淆矩阵

为更直观地理解,我们将使用 Python 的 Scikit-learn 与随机森林分类器来创建一个混淆矩阵。

第一步是导入所需的库并构建合成数据集。

# Import Libraries
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns

# Synthetic Dataset
X, y = make_classification(n_samples=1000, n_features=20,
                           n_classes=2, random_state=42)

# Split into Training and Test Sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

下一步,使用一个简单的随机森林分类器来训练模型。

# Train the Model
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)

与实践示例相同,我们需要对结果进行分类并生成混淆矩阵。先在测试集上进行预测,然后生成混淆矩阵:

# Predict on the Test Data
y_pred = model.predict(X_test)

# Generate the confusion matrix
cm = confusion_matrix(y_test, y_pred)

接下来,生成混淆矩阵的可视化:

# Create a Confusion Matrix
plt.figure(figsize=(8, 8))
sns.heatmap(cm, annot=True, fmt='d', cmap='Greens')
plt.title('Confusion Matrix')
plt.ylabel('True label')
plt.xlabel('Predicted label')
plt.show()

输出如下:

混淆矩阵示例

随机森林的混淆矩阵输出

搞定 🎉 您已成功使用 Scikit-learn 创建了第一个混淆矩阵!

结语

本文探讨了混淆矩阵的定义、围绕该评估工具的重要术语,以及不同指标的局限与意义。能够手动计算混淆矩阵,是您数据科学知识体系中的重要一环;同时,使用 Scikit-learn 等库将其落地执行同样必不可少。

如果您希望进一步学习混淆矩阵,可在 R 中练习:Understanding Confusion Matrix in R。也可以通过我们的Model Validation in Python课程更深入学习,在其中掌握模型验证基础、验证技术,并开始创建经过验证且高性能的模型。

Nisha Arya Ahmed

作者

Nisha Arya Ahmed

勤于学习,期望运用我的数据科学技术背景与出色的人际沟通能力,提升并拓展我的技术认知与写作能力。

我从药理学转入数据科学领域,并在 Lambda School 完成了为期 9 个月的训练营。

我对在机器学习和人工智能领域实践并提升自己的编程与技术写作能力充满兴趣。

目前,我是一名数据科学家兼自由职业技术写作者。

主题