17

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?

3 Answers 3

34

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

Sign up to request clarification or add additional context in comments.

7 Comments

ConfusionMatrixDisplay is exactly what I was looking for. Thank you!
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,7004],[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!
The problem with this approach is we can't normalize the confusion matrix.
I cannot normalize the matrix with this approach
@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?
|
4

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

1 Comment

Please try to give proper explanation of the answer.
0

You could use a one-line "identity classifier" if that fits your use case.

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

( see my original answer in: plot_confusion_matrix without estimator )

2 Comments

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.
@Hoppeduppeanut sure., I included the relevant code block here too. thanks

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.