Plot Confusion Matrix with scikit-learn without a Classifier

24,006

Solution 1

The fact that you can import plot_confusion_matrix directly suggests that you have the latest version of scikit-learn (0.22) installed. So you can just look at the source code of plot_confusion_matrix() to see how its using the estimator.

From the latest sources here, the estimator is used for:

  1. computing confusion matrix using confusion_matrix
  2. getting the labels (unique values of y which correspond to 0,1,2.. in the confusion matrix)

So if you have those two things already, you just need the below part:

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()

Do look at the NOTE in comment.

For older versions, you can look at how the matplotlib part is coded here

Solution 2

The below code is to create confusion matrix from true values and predicted values. If you have already created the confusion matrix you can just run the last line below.

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')
Share:
24,006
Irina
Author by

Irina

Updated on July 27, 2022

Comments

  • Irina
    Irina almost 2 years

    I have a confusion matrix created with sklearn.metrics.confusion_matrix.

    Now, I would like to plot it with sklearn.metrics.plot_confusion_matrix, but the first parameter is the trained classifier, as specified in the documentation. The problem is that I don't have a classifier; the results were obtained doing manual calculations.

    Is it still possible to plot the confusion matrix in one line via scikit-learn, or do I have to code it myself with matplotlib?

  • Irina
    Irina over 4 years
    ConfusionMatrixDisplay is exactly what I was looking for. Thank you!
  • Thomas Leyshon
    Thomas Leyshon over 3 years
    How would one get a log scaling of the confusion matrix? The context is: import numpy as np ; from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay; disp = ConfusionMatrixDisplay(confusion_matrix=np.asarray([[13099,7‌​004],[27420,544967]]‌​), display_labels= np.asarray([0,1])) ; disp.plot() . The scale of the true negatives here dwarfs everything so the colour scaling is sort of pointless here, unless there is a way to scale the colours logarithmically? Thanks in advance!
  • Bilal Chandio
    Bilal Chandio about 3 years
    The problem with this approach is we can't normalize the confusion matrix.
  • Shamsul Arefin
    Shamsul Arefin about 3 years
    I cannot normalize the matrix with this approach
  • Vivek Kumar
    Vivek Kumar about 3 years
    @ShamsulArefinSajib , can you please explain in more detail. ConfusionMatrixDisplay just takes the cm matrix to plot it. Are you saying that you cannot pass a normalized cm matrix in it?
  • Shamsul Arefin
    Shamsul Arefin about 3 years
    I mean the process using plot_confusion_matrix has an argument to plot the normalized version of the matrix. This process does not have anything like that. I have to normalize the matrix myself before passing into it.
  • Vivek Kumar
    Vivek Kumar about 3 years
    @ShamsulArefinSajib Yes, because we are using the source code of the function to make it work without the estimator. So any changes you want to the confusion matrix must be done manually.
  • Hoppeduppeanut
    Hoppeduppeanut almost 3 years
    Please avoid leaving link-only answers to other Stack Overflow posts when posting an answer. Instead, please edit your answer to include the most important details from the linked post that's relevant and tailored to the question being asked.
  • g4s9
    g4s9 almost 3 years
    @Hoppeduppeanut sure., I included the relevant code block here too. thanks
  • Tyler2P
    Tyler2P over 2 years
    Please try to give proper explanation of the answer.