没有估计器的 plot_confusion_matrix

Posted

技术标签:

【中文标题】没有估计器的 plot_confusion_matrix【英文标题】:plot_confusion_matrix without estimator 【发布时间】:2020-07-01 17:50:28 【问题描述】:

我正在尝试使用 plot_confusion_matrix,

from sklearn.metrics import confusion_matrix

y_true = [1, 1, 0, 1]
y_pred = [1, 1, 0, 0]

confusion_matrix(y_true, y_pred)

输出:

array([[1, 0],
       [1, 2]])

现在,在使用以下内容时;使用“类”或不使用“类”

from sklearn.metrics import plot_confusion_matrix

plot_confusion_matrix(y_true, y_pred, classes=[0,1], title='Confusion matrix, without normalization')

plot_confusion_matrix(y_true, y_pred, title='Confusion matrix, without normalization')

我希望得到类似这样的输出,除了里面的数字,

绘制简单的图表,它应该不需要估算器。

使用 mlxtend.plotting,

from mlxtend.plotting import plot_confusion_matrix
import matplotlib.pyplot as plt
import numpy as np

binary1 = np.array([[4, 1],
                   [1, 2]])

fig, ax = plot_confusion_matrix(conf_mat=binary1)
plt.show()

它提供相同的输出。

基于this

它需要一个分类器,

disp = plot_confusion_matrix(classifier, X_test, y_test,
                                 display_labels=class_names,
                                 cmap=plt.cm.Blues,
                                 normalize=normalize)

我可以在没有分类器的情况下绘制它吗?

【问题讨论】:

我可以在没有分类器的情况下绘制它吗? 【参考方案1】:

plot_confusion_matrix 需要经过训练的分类器。如果您查看source code,它所做的是执行预测以为您生成y_pred

y_pred = estimator.predict(X)
    cm = confusion_matrix(y_true, y_pred, sample_weight=sample_weight,
                          labels=labels, normalize=normalize)

因此,为了在不指定分类器的情况下绘制混淆矩阵,您必须使用其他工具,或者自己动手。 一个简单的选择是使用 seaborn:

import seaborn as sns

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

【讨论】:

谢谢。我必须使用 pandas 和 seaborn 来实现它。我可以使用 scikit-learn 的工具吗?我在这里看到,它没有使用[分类器],(datascience.stackexchange.com/questions/40067/…) 没有@RakibulHassan。在链接中,正在使用自定义功能。为什么不自己定义呢? 谢谢。我认为它看起来很相似,我们可以不使用 ConfusionMatrixDisplay 吗?【参考方案2】:

我在这里有点晚了,但我认为其他人可能会从我的回答中受益。

正如其他人提到的那样,使用plot_confusion_matrix 不是没有分类器的选项,但仍然可以使用 sklearn 在没有分类器的情况下获得外观相似的混淆矩阵。下面的函数正是这样做的。

def confusion_ma(y_true, y_pred, class_names):
    cm = confusion_matrix(y_true, y_pred, normalize='true')
    disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=class_names)
    disp.plot(cmap=plt.cm.Blues)
    return plt.show()

confusion_matrix 函数返回一个简单的 ndarry 矩阵。通过将其与预测标签一起传递给ConfusionMatrixDisplay 函数,可以获得类似的矩阵。在定义中,我添加了要显示的 class_names 而不是 0 和 1,选择用于标准化输出并指定颜色图 - 根据您的需要进行相应更改。

【讨论】:

其实这应该是公认的答案!【参考方案3】:

由于 plot_confusion_matrix 要求参数 'estimator' 不为 None,答案是:不,你不能。但是你可以用其他方式绘制你的混淆矩阵,例如看到这个答案:How can I plot a confusion matrix?

【讨论】:

【参考方案4】:

我在 Amazon SageMaker 中运行 conda_python3 内核的 Jupyter 笔记本中测试了以下“身份分类器”。原因是 SageMaker 的转换工作是异步的,因此不允许在 plot_confusion_matrix 的参数中使用分类器,y_pred 必须在调用函数之前计算。

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 确实需要估算器,但如果此解决方案适合您的用例,您不一定必须使用其他工具 IMO。

simplified POC from the notebook

【讨论】:

【参考方案5】:

我解决了使用自定义分类器的问题;您可以构建任何自定义分类器并将其作为类传递给 plot_confusion 矩阵:

class MyModelPredict(object):
    def __init__(self, model):
        self._estimator_type = 'classifier'
        
    def predict(self, X):
        return your_custom_prediction

model = MyModelPredict()
plot_confusion_matrix(model, X, y_true)

【讨论】:

以上是关于没有估计器的 plot_confusion_matrix的主要内容,如果未能解决你的问题,请参考以下文章

访问单个树估计器以预测来自梯度提升分类器估计器的值

使用管道作为估计器的 VotingClassifier

为啥使用 1 个估计器的 adaboost 比简单的决策树更快?

如何使用带有 SVC 估计器的 OneVsRestClassifier 的 GridSearchCV?

在 sklearn 管道中转换估计器的结果

TensorFlow 高级估计器的预处理数据集