机器学习 - 混淆矩阵
什么是混淆矩阵(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})