使用没有分类器的 scikit-learn 绘制混淆矩阵

Posted

技术标签:

【中文标题】使用没有分类器的 scikit-learn 绘制混淆矩阵【英文标题】:Plot Confusion Matrix with scikit-learn without a Classifier 【发布时间】:2020-03-28 14:44:28 【问题描述】:

我有一个使用sklearn.metrics.confusion_matrix 创建的混淆矩阵。

现在,我想用sklearn.metrics.plot_confusion_matrix 绘制它,但第一个参数是经过训练的分类器,在documentation 中指定。问题是我没有分类器;结果是人工计算得出的。

是否仍然可以通过 scikit-learn 将混淆矩阵绘制在一行中,还是我必须使用 matplotlib 自己编写代码?

【问题讨论】:

【参考方案1】:

您可以直接导入plot_confusion_matrix 表明您安装了最新版本的scikit-learn (0.22)。所以你可以看看plot_confusion_matrix()的源代码,看看它是如何使用estimator的。

从latest sources here,估计器用于:

    使用confusion_matrix计算混淆矩阵 获取标签(y 的唯一值,对应于混淆矩阵中的 0,1,2..)

所以如果你已经有了这两个东西,你只需要下面的部分:

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

disp = ConfusionMatrixDisplay(confusion_matrix=cm,
                              display_labels=display_labels)


# NOTE: Fill all variables here with default values of the plot_confusion_matrix
disp = disp.plot(include_values=include_values,
                 cmap=cmap, ax=ax, xticks_rotation=xticks_rotation)

plt.show()

请看评论中的注释。

老版本可以看一下matplotlib部分是怎么编码的here

【讨论】:

ConfusionMatrixDisplay 正是我想要的。谢谢! 如何获得混淆矩阵的对数缩放?上下文是:import numpy as np ; from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay; disp = ConfusionMatrixDisplay(confusion_matrix=np.asarray([[13099,7004],[27420,544967]]), display_labels= np.asarray([0,1])) ; disp.plot()。这里真底片的比例使一切都相形见绌,所以颜色缩放在这里有点毫无意义,除非有一种方法可以对数缩放颜色?提前致谢! 这种方法的问题是我们不能标准化混淆矩阵。 我无法用这种方法对矩阵进行归一化 @ShamsulArefinSajib ,您能否详细解释一下。 ConfusionMatrixDisplay 只需使用 cm 矩阵来绘制它。您是说不能在其中传递标准化的cm 矩阵吗?【参考方案2】:

以下代码是根据真实值和预测值创建混淆矩阵。如果您已经创建了混淆矩阵,则可以运行下面的最后一行。

import seaborn as sns
from sklearn.metrics import confusion_matrix

cm = confusion_matrix(y_true, y_pred)
f = sns.heatmap(cm, annot=True, fmt='d')

【讨论】:

请尽量给出正确的答案解释。【参考方案3】:

如果适合您的用例,您可以使用单行“身份分类器”。

IC = type('IdentityClassifier', (), "predict": lambda i : i, "_estimator_type": "classifier")
plot_confusion_matrix(IC, y_pred, y_test, normalize='true', values_format='.2%');

(请参阅我的原始答案:plot_confusion_matrix without estimator)

【讨论】:

在发布答案时,请避免将仅链接的答案留给其他 Stack Overflow 帖子。相反,请edit您的答案包括链接帖子中与所问问题相关且量身定制的最重要细节。 @Hoppeduppeanut 当然。我在这里也包含了相关的代码块。谢谢

以上是关于使用没有分类器的 scikit-learn 绘制混淆矩阵的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn 虚拟分类器的理论基础是啥?

SciKit-learn - 训练高斯朴素贝叶斯分类器

如何获得 scikit-learn SVM 分类器的所有 alpha 值?

在 scikit-learn 中获得二元概率分类器的最大准确度

在 scikit-learn 库中使用 sgd 求解器的 SGDClassifier 与 LogisticRegression

如何使用 scikit-learn 和 matplotlib 为不平衡数据集绘制 SVC 分类?