121 votes

Tracer la matrice de confusion sklearn avec des étiquettes

Je veux tracer une matrice de confusion pour visualiser les performances du classificateur, mais elle n'affiche que les chiffres des étiquettes, pas les étiquettes elles-mêmes :

from sklearn.metrics import confusion_matrix
import pylab as pl
y_test=['business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business']

pred=array(['health', 'business', 'business', 'business', 'business',
       'business', 'health', 'health', 'business', 'business', 'business',
       'business', 'business', 'business', 'business', 'business',
       'health', 'health', 'business', 'health'], 
      dtype='|S8')

cm = confusion_matrix(y_test, pred)
pl.matshow(cm)
pl.title('Matrice de confusion du classificateur')
pl.colorbar()
pl.show()

Comment puis-je ajouter les étiquettes (santé, entreprise..etc) à la matrice de confusion ?

23voto

scls Points 379

Peut-être que vous seriez intéressé par https://github.com/pandas-ml/pandas-ml/

qui implémente une implémentation en Python Pandas de la Matrice de Confusion.

Quelques fonctionnalités:

  • tracer la matrice de confusion
  • tracer la matrice de confusion normalisée
  • statistiques de classe
  • statistiques globales

Voici un exemple:

In [1]: from pandas_ml import ConfusionMatrix
In [2]: import matplotlib.pyplot as plt

In [3]: y_test = ['business', 'business', 'business', 'business', 'business',
        'business', 'business', 'business', 'business', 'business',
        'business', 'business', 'business', 'business', 'business',
        'business', 'business', 'business', 'business', 'business']

In [4]: y_pred = ['health', 'business', 'business', 'business', 'business',
       'business', 'health', 'health', 'business', 'business', 'business',
       'business', 'business', 'business', 'business', 'business',
       'health', 'health', 'business', 'health']

In [5]: cm = ConfusionMatrix(y_test, y_pred)

In [6]: cm
Out[6]:
Predicted  business  health  __all__
Actual
business         14       6       20
health            0       0        0
__all__          14       6       20

In [7]: cm.plot()
Out[7]: 

In [8]: plt.show()

Tracer la matrice de confusion

In [9]: cm.print_stats()
Matrice de Confusion:

Predicted  business  health  __all__
Actual
business         14       6       20
health            0       0        0
__all__          14       6       20

Statistiques Globales:

Précision: 0.7
IC à 95%: (0.45721081772371086, 0.88106840959427235)
Taux d'absence d'information: À faire
P-Value [Acc > NIR]: 0.608009812201
Kappa: 0.0
P-Value du Test de McNemar: À faire

Statistiques de Classe:

Classes                                  business health
Population                                     20     20
P: Condition positive                          20      0
N: Condition négative                          0     20
Résultat du test positif                       14      6
Résultat du test négatif                        6     14
VP: Vrai Positif                               14      0
VN: Vrai Négatif                                0     14
FP: Faux Positif                                0      6
FN: Faux Négatif                                6      0
TPR: (Sensibilité, taux de succès, rappel)   0.7    NaN
TNR=SPC: (Spécificité)                        NaN    0.7
PPV: Valeur Préd Positive (Précision)           1      0
VNP: Valeur Préd Négative                       0      1
FPR: Faux-pos                              NaN    0.3
FDR: Taux de découverte fausse                 0      1
FNR: Taux d'erreur                         0.3    NaN
ACC: Exactitude                             0.7    0.7
Score F1                            0.8235294      0
MCC: Coefficient de corrélation de Matthews        NaN    NaN
Information                                  NaN    NaN
Cohérence                                       0      0
Prévalence                                     1      0
LR+: Taux de vrais positifs               NaN    NaN
LR-: Taux de vrais négatifs               NaN    NaN
DOR: Rapport des cotes diagnostiques      NaN    NaN
FOR: Taux d'omission fausse                   1      0

13voto

Rahul Verma Points 1862
    à partir de sklearn.metrics import confusion_matrix
    import seaborn as sns
    import matplotlib.pyplot as plt
    model.fit(train_x, train_y,validation_split = 0.1, epochs=50, batch_size=4)
    y_pred=model.predict(test_x,batch_size=15)
    cm =confusion_matrix(test_y.argmax(axis=1), y_pred.argmax(axis=1))  
    index = ['neutral','happy','sad']  
    columns = ['neutral','happy','sad']  
    cm_df = pd.DataFrame(cm,columns,index)                      
    plt.figure(figsize=(10,6))  
    sns.heatmap(cm_df, annot=True)

Matrice de confusion

9voto

mujjiga Points 49

Il existe un moyen très simple de le faire en utilisant ConfusionMatrixDisplay. Il prend en charge display_labels qui peuvent être utilisés pour afficher des étiquettes pour le graphique

import numpy as np
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
np.random.seed(0)
y_true = np.random.randint(0,3, 100)
y_pred = np.random.randint(0,3, 100)

labels = ['chat', 'chien', 'rat']

cm = confusion_matrix(y_true, y_pred)
ConfusionMatrixDisplay(cm, display_labels=labels).plot()
#plt.savefig("Matrice_de_confusion.png")

Résultat:

description de l'image ici

Réf: ConfusionMatrixDisplay

Modification 1:

Pour changer les étiquettes de l'axe X en position verticale (nécessaire lorsque les étiquettes de classe se chevauchent dans le graphique) et également tracer directement à partir des prédictions.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
np.random.seed(0)

n = 10
y_true = np.random.randint(0,n, 100)
y_pred = np.random.randint(0,n, 100)

labels = [f'class_{i+1}' for i in range(n)]

fig, ax = plt.subplots(figsize=(15, 15))
ConfusionMatrixDisplay.from_predictions(
    y_true, y_pred, display_labels=labels, xticks_rotation="vertical",
    ax=ax, colorbar=False, cmap="plasma")

Résultat: description de l'image ici

3voto

BSalita Points 933

Modèle donné, validx, validy. Avec l'aide précieuse d'autres réponses, voici ce qui correspond à mes besoins.

sklearn.metrics.plot_confusion_matrix

import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(26,26))
sklearn.metrics.plot_confusion_matrix(model, validx, validy, ax=ax, cmap=plt.cm.Blues)
ax.set(xlabel='Prédit', ylabel='Réel', title='Matrice de confusion Réel vs Prédit')

0voto

Manoj Goswami Points 1
classificateur = svm.SVC(kernel="linear", C=0.01).fit(X_train, y_train)
disp = ConfusionMatrixDisplay.from_estimator(
       classificateur,
       X_test,
       y_test,
       display_labels=nom_classes,
       cmap=plt.cm.Blues,
       normalize=normaliser,
)

disp.ax_.set_title(titre) # cette ligne est votre réponse

plt.show()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X