混淆矩阵颜色匹配数据大小而不是分类精度

Posted

技术标签:

【中文标题】混淆矩阵颜色匹配数据大小而不是分类精度【英文标题】:Confusion Matrix colors match data size and not classification accuracy 【发布时间】:2020-07-19 09:47:29 【问题描述】:

我正在使用 sklearn 库中的 ConfusionMatrixDisplay 在我拥有的两个列表上绘制一个混淆矩阵,虽然结果都是正确的,但有一个细节让我感到困扰。混淆矩阵中颜色的密度似乎与实例的数量而不是分类的准确性相匹配。

这是我用来绘制混淆矩阵的代码:

target_names = ['Empty', 'Human', 'Dog', 'Dog&Human']
labels_names = [0,1,2,3] 
print(classification_report(y_true, y_pred,labels=labels_names, target_names=target_names))    
cm = confusion_matrix(y_true, y_pred,labels=labels_names)
disp = ConfusionMatrixDisplay(confusion_matrix=cm,display_labels=target_names)
disp = disp.plot(cmap=plt.cm.Blues,values_format='g')
plt.show()

现在我从报告和混淆矩阵中得到的结果是:

如您所见,“Dog”和“Dog&Human”类都达到了精度 1,但“Dog”类的颜色是唯一具有浓蓝色的颜色。即使是具有一些错误分类实例的“空”类也具有较深的颜色,使得分类看起来更好。这显然是由于每个类中的数据数量,但是,颜色不应该取决于分类的性能而不是正确检测到的实例数吗?

我尝试对混淆矩阵进行归一化,它解决了这个问题,但我更希望有一个显示实际数字而不是百分比的矩阵。有什么解决办法吗?非常感谢。

【问题讨论】:

【参考方案1】:

confusion_matrix 函数允许您按行或列对矩阵进行归一化,这有助于处理您面临的类不平衡问题。而不是:

confusion_matrix(y_true, y_pred,labels=labels_names)

简单通过:

confusion_matrix(y_true, y_pred,labels=labels_names,normalize='true')

... 按行规范化,我认为这是您想要的。 normalize='pred' 将允许您按列进行标准化。详情请查看here。

【讨论】:

非常感谢您的回答。我之前尝试过normalize='true',但结果有点偏离,但按照您的建议将其更改为normalize='pred',颜色问题和百分比是正确的。但是,有没有办法解决颜色问题而不必标准化?我想保留实际的数据数量,因为这样可以更好地了解情况。

以上是关于混淆矩阵颜色匹配数据大小而不是分类精度的主要内容,如果未能解决你的问题,请参考以下文章

评价-分类算法的评价指标

遥感软件中混淆矩阵是如何产生的

如何使用 LIBSVM 从混淆矩阵中获得分类精度?

机器学习:理论知识

Python遥感图像处理应用篇(二十八):Python绘制遥感图像分类结果混淆矩阵和计算分类精度

Python遥感图像处理应用篇(二十八):Python绘制遥感图像分类结果混淆矩阵和计算分类精度