摘要:混淆矩阵是评估分类模型性能的重要工具,通过对比实际类别和预测类别来展示分类结果。它包含四个关键指标:真阳性(TP)、真阴性(TN)、假阳性(FP)和假阴性(FN)。以垃圾邮件分类为例,TP表示正确识别的垃圾邮件,TN表示正确识别的非垃圾邮件,FP表示非垃圾邮件被误判为垃圾邮件,FN表示垃圾邮件被误判为非垃圾邮件。通过混淆矩阵可以计算准确率、精确率、召回率等性能指标。在Python中可以使用scikit-learn的confusion_matrix()函数实现,并配合Seaborn库进行可视化展示。混淆矩阵为分类模型的评估和改进提供了直观有效的方法。
目录
什么是混淆矩阵?
混淆矩阵实用示例
基于混淆矩阵的分类指标
准确性
精度
召回还是敏感
特异性
F1 积分
第一类错误率
II型错误率
如何在 Python 中实现混淆矩阵?
什么是混淆矩阵?
机器学习中的混淆矩阵是衡量分类问题性能的最简单方法,当输出可以是两种或更多类型的类时。它不过是一个有两个维度的表格,即“实际”和“预测”,而且这两个维度都有“真阳性(TP)”、“真阴性(TN)”、“假阳性(FP)”、“假阴性(FN)”,如下所示 −
举个例子,将电子邮件分类为“垃圾邮件”和“非垃圾邮件”,以便更好地理解。这里垃圾邮件标注为“正面”,而合法(非垃圾邮件)则标注为负面邮件。
与混淆矩阵相关的术语解释如下 −
真阳性(TP)− 当实际类别和预测类别数据点皆为1时,情况即为真阳性。分类模型正确预测数据样本的正向类别标签。例如,“垃圾邮件”被归类为“垃圾邮件”。
真负(TN)− 当实际类别和预测类别数据点均为0时,情况即为真负。该模型正确预测了数据样本的负面类别标签。例如,“非垃圾邮件”邮件被归类为“非垃圾邮件”。
假阳性(FP)− 当实际数据点类别为0,预测类别为1时,即为假阳性。该模型错误地预测了数据样本的正向类别标签。例如,一封“非垃圾邮件”被错误归类为“垃圾邮件”。这被称为第一类错误。
假阴性(FN)− 当实际数据类别为1,预测类别为0时,即为假阴性。模型错误地预测了数据样本的负面类别标签。例如,一封“垃圾邮件”被错误归类为“非垃圾邮件”。它也被称为II型错误。
我们使用混淆矩阵来寻找正确和错误的分类 −
- 正确的分类——TP和TN是正确分类的数据点。
- 错误分类− FP 和 FN 是错误分类的数据点。
我们可以利用混淆矩阵计算不同的分类指标,如准确性、精确度、召回率等。但在讨论这些指标之前,让我们先了解如何借助一个实用的示例来创建混淆矩阵。
混淆矩阵实用示例
让我们举一个实用的例子,区分电子邮件“垃圾邮件”和“非垃圾邮件”。这里我们把垃圾邮件的班级表示为正面(1),非垃圾邮件为负面(0)。所以电子邮件被分类为以下两种类型——
- 垃圾桶 (1) − 正类勒贝尔
- 非垃圾邮件(0) − 负类勒贝尔
实际和预测的类别/类别如下 −
| 实际分类 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 |
| 预测分类 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 |
根据上述结果,我们来确定某个特定分类属于TP、TN、FP或FN。请看下面的表格——
| 实际分类 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 |
| 预测分类 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 |
| 结果 | TN | TP | TN | TP | FN | FP | TN | FN | TP | TP |
在上表中,当我们比较实际分类集与预测分类时,观察到有四种不同的结局类型。首先,真阳性(1,1),即实际分类为阳性,预测分类也是正值。这意味着分类器正确识别了阳性样本。第二,假阴性(1,0),即实际分类为阳性,预测分类为阴性。分类器将阳性样本识别为阴性。
第三种是假阳性(0,1),即实际分类为阴性,预测分类为正值。阴性样本被错误地识别为正值。第四,真负(0,0),即实际和预测的分类均为负。模型正确识别阴性样本为阴性样本。
我们来计算每个类别的样本总数。
- TP(真阳性):4
- 假阴性(FN):2
- 假阳性(FP):1
- TN(真阴性):3
现在我们创建混淆矩阵,如下 −
| 实际级别 | |||
| 正(1) | 负面(0) | ||
预测班级 | 正(1) | 4(TP) | 1(FP) |
| 负面(0) | 2(FN) | 3(田纳西州) | |
到目前为止,我们已经为上述问题创建了混淆矩阵。我们从上述矩阵推断一些含义 −
- 在10封邮件中,有4封“垃圾邮件”被正确归类为“垃圾邮件”(TP)。
- 在10封邮件中,有两封“垃圾邮件”被错误地归类为“非垃圾邮件”(FN)。
- 在10封邮件中,有一封“非垃圾邮件”被错误归类为“垃圾邮件”(FP)。
- 在10封邮件中,有三封“非垃圾邮件”被正确归类为“非垃圾邮件”(TN)。
- 所以在10封邮件中,有7封邮件被正确分类(TP和TN),另外3封邮件被错误分类(FP和FN)。
基于混淆矩阵的分类指标
我们可以利用混淆矩阵定义许多分类卡特伦性能指标。我们将考虑上述实际例子,并利用该示例中的数值计算指标。其中一些如下 −
- 准确性
- 精度
- 召回还是敏感
- 特异性
- F1 积分
- 第一类错误率
- II型错误率
准确性
准确性是评估分类模型的最常用指标。它是总修正预测与所有预测的比率。数学上,我们可以使用以下公式计算准确率−
我们计算准确率 −
因此,该模型的分类准确率为70%。
精度
准确度衡量真阳性病例在所有预测阳性病例中的比例。它是通过真阳性实例数与真阳性和假阳性实例之和的比率计算的。
我们计算精度 −
召回还是敏感
回忆(灵敏度)定义为分类器对阳性分类的数量。我们可以用以下公式计算它
我们计算召回率 −
特异性
特异性与回忆不同,定义为分类器返回的阴性数量。我们可以用以下公式 − 来计算它
我们计算特异性−
F1 积分
F1评分是一种平衡的衡量标准,兼顾了准确度和回忆能力。它是精确性和记忆的谐波平均。
我们可以利用以下公式计算F1分数 −
我们计算F1分数−
因此,F1 分数为 0.727。
第一类错误率
第一类错误发生在分类器预测为正向分类但实际上是负分类时。I型错误率计算为−
II型错误率
II型错误发生在分类器预测为负但实际上是正类时。II型错误率可计算为−
如何在 Python 中实现混淆矩阵?
要在 Python 中实现混淆矩阵,可以使用 scikit-learn 库sklearn.metrics模块中的confusion_matrix() 函数。
注:请注意,confusion_matrix()函数返回一个二维数组,对应于以下混淆矩阵−
| 预测班级 | |||
| 负面(0) | 正(1) | ||
实际级别 | 负面(0) | 真阴性(田纳西州) | 假阳性(FP) |
| 正(1) | 假阴性(FN) | 真阳性(TP) | |
这里有一个简单的示例,说明如何使用confusion_matrix()函数 −
from sklearn.metrics import confusion_matrix # Actual values y_actual = [0, 1, 0, 1, 1, 0, 0, 1, 1, 1] # Predicted values y_pred = [0, 1, 0, 1, 0, 1, 0, 0, 1, 1] # Confusion matrix cm = confusion_matrix(y_actual, y_pred) print(cm)在这个例子中,我们有两个数组:y_actual包含目标变量的实际值,y_pred代表目标变量的预测值。然后调用confusion_matrix()函数,将y_actual和y_pred作为参数传递。该函数返回一个二维数组,代表混淆矩阵。
上述代码的输出将如下 −
[[3 1] [2 4]]
将上述结果与我们之前创建的混淆矩阵进行比较。
- 真阴性(TN):3
- 假阳性(FP):1
- 假阴性(FN):2
- 真阳性(TP):4
我们也可以用热力图可视化混淆矩阵。下面是我们如何使用Seaborn库中的热图()函数实现这一点
import seaborn as sns # Plot confusion matrix as heatmap sns.heatmap(cm, annot=True, cmap='summer')这将生成一个热图,显示混淆矩阵−
在该热图中,横轴表示预测值,纵轴表示实际值。热力图中每个方块的颜色表示各类别的样本数量。