机器学习 - 混淆矩阵

什么是混淆矩阵(confusion matrix)?

它是一个表格,用于分类问题中评估模型中的错误发生在哪里。

行代表实际结果应该有的类别。而列代表了我们所做的预测。使用这个表,我们可以很容易地看出哪些预测是错误的。

创建混淆矩阵

混淆矩阵可以通过逻辑回归做出的预测来创建。

现在,我们将使用 NumPy 生成实际值和预测值:

import numpy

接下来,我们需要为 "actual" 和 "predicted" 值生成数字。

actual = numpy.random.binomial(1, 0.9, size = 1000)
predicted = numpy.random.binomial(1, 0.9, size = 1000)

为了创建混淆矩阵,我们需要从 sklearn 模块中导入 metrics。

from sklearn import metrics

导入 metrics 后,我们可以在实际值和预测值上使用混淆矩阵函数。

confusion_matrix = metrics.confusion_matrix(actual, predicted)

为了创建一个更易理解的可视化展示,我们需要将表格转换为混淆矩阵展示。

cm_display = metrics.ConfusionMatrixDisplay(confusion_matrix = confusion_matrix, display_labels = [0, 1])

可视化展示需要我们从 matplotlib 中导入 pyplot。

import matplotlib.pyplot as plt

最后,为了展示图表,我们可以使用 pyplot 中的 plot() 和 show() 函数。

cm_display.plot()
plt.show()

查看整个实例的实际运行效果:

实例

import matplotlib.pyplot as plt
import numpy
from sklearn import metrics

actual = numpy.random.binomial(1,.9,size = 1000)
predicted = numpy.random.binomial(1,.9,size = 1000)

confusion_matrix = metrics.confusion_matrix(actual, predicted)

cm_display = metrics.ConfusionMatrixDisplay(confusion_matrix = confusion_matrix, display_labels = [0, 1])

cm_display.plot()
plt.show()

亲自试一试

结果:

混淆矩阵

结果解释

创建的混淆矩阵有四个不同的象限:

  • True Negative 真正(左上角象限)
  • False Positive 真负(右上角象限)
  • False Negative 假正(左下角象限)
  • True Positive 假负(右下角象限)

True 意味着值被准确地预测了,False 意味着存在错误或错误的预测。

现在我们已经创建了一个混淆矩阵,我们可以计算不同的度量来量化模型的质量。首先,让我们看看准确性。

创建的度量标准

矩阵为我们提供了许多有用的度量标准,帮助我们评估分类模型。

不同的度量标准包括:准确性、精确度、敏感性(召回率)、特异性和 F 分数,下面将进行解释。

准确性

准确性衡量模型正确的频率。

如何计算

(True Positive + True Negative) / Total Predictions

中文译为:(真正例 + 真反例) / 总预测数

实例

Accuracy = metrics.accuracy_score(actual, predicted)

亲自试一试

精确度

在预测为正的结果中,真正为正的比例是多少?

如何计算

True Positive / (True Positive + False Positive)

中文译为:真正例 / (真正例 + 假正例)

精确度不评估正确预测的反例:

实例

Precision = metrics.precision_score(actual, predicted)

亲自试一试

敏感性(召回率)

在所有正例中,预测为正的比例是多少?

敏感性(有时称为召回率)衡量模型在预测正例方面的表现如何。

这意味着它查看真正例和假反例(即被错误预测为反例的正例)。

如何计算

True Positive / (True Positive + False Negative)

中文译为:真正例 / (真正例 + 假反例)

敏感性对于理解模型预测正例的能力很有用:

实例

Sensitivity_recall = metrics.recall_score(actual, predicted)

亲自试一试

特异性

模型在预测反例方面的表现如何?

特异性与敏感性相似,但它是从反例的角度来看的。

如何计算

True Negative / (True Negative + False Positive)

中文译为:真反例 / (真反例 + 假正例)

因为它是召回率的相反概念,所以我们使用 recall_score 函数,采用相反的位置标签:

实例

Specificity = metrics.recall_score(actual, predicted, pos_label=0)

亲自试一试

F-分数

F 分数是精确度和敏感性的“调和平均数”。

它同时考虑了假正例和假反例,并且对于不平衡的数据集很有用。

如何计算

2 * ((Precision * Sensitivity) / (Precision + Sensitivity))

中文译为:2 * ((精确度 * 敏感性) / (精确度 + 敏感性))

这个分数没有考虑真反例的值:

实例

F1_score = metrics.f1_score(actual, predicted)

亲自试一试

所有计算合在一起:

实例

# 度量标准
print({"准确性":Accuracy,"精确度":Precision,"敏感性_召回率":Sensitivity_recall,"特异性":Specificity,"F1分数":F1_score})

亲自试一试