La matrice de confusion est un moyen de tabuler le nombre d'erreurs de classification, c'est-à-dire le nombre de classes prédites qui se sont retrouvées dans une mauvaise classe de classification basée sur les vraies classes.
Alors que sklearn.metrics.confusion_matrix fournit une matrice numérique, je trouve plus utile de générer un `` rapport '' en utilisant ce qui suit:
import pandas as pd
y_true = pd.Series([2, 0, 2, 2, 0, 1, 1, 2, 2, 0, 1, 2])
y_pred = pd.Series([0, 0, 2, 1, 0, 2, 1, 0, 2, 0, 2, 2])
pd.crosstab(y_true, y_pred, rownames=['True'], colnames=['Predicted'], margins=True)
ce qui se traduit par:
Predicted 0 1 2 All
True
0 3 0 0 3
1 0 1 2 3
2 2 1 3 6
All 5 2 5 12
Cela nous permet de voir que:
- Les éléments diagonaux indiquent le nombre de classifications correctes pour chaque classe: 3, 1 et 3 pour les classes 0, 1 et 2.
- Les éléments hors diagonale fournissent les erreurs de classification: par exemple, 2 de la classe 2 ont été classés de manière erronée comme 0, aucune de la classe 0 n'a été classée de manière erronée comme 2, etc.
- Le nombre total de classifications pour chaque classe à la fois
y_true
et y_pred
, à partir des sous - totaux « Tous »
Cette méthode fonctionne également pour les étiquettes de texte, et pour un grand nombre d'échantillons dans l'ensemble de données peut être étendu pour fournir des rapports de pourcentage.
import numpy as np
import pandas as pd
# create some data
lookup = {0: 'biscuit', 1:'candy', 2:'chocolate', 3:'praline', 4:'cake', 5:'shortbread'}
y_true = pd.Series([lookup[_] for _ in np.random.random_integers(0, 5, size=100)])
y_pred = pd.Series([lookup[_] for _ in np.random.random_integers(0, 5, size=100)])
pd.crosstab(y_true, y_pred, rownames=['True'], colnames=['Predicted']).apply(lambda r: 100.0 * r/r.sum())
La sortie est alors:
Predicted biscuit cake candy chocolate praline shortbread
True
biscuit 23.529412 10 23.076923 13.333333 15.384615 9.090909
cake 17.647059 20 0.000000 26.666667 15.384615 18.181818
candy 11.764706 20 23.076923 13.333333 23.076923 31.818182
chocolate 11.764706 5 15.384615 6.666667 15.384615 13.636364
praline 17.647059 10 30.769231 20.000000 0.000000 13.636364
shortbread 17.647059 35 7.692308 20.000000 30.769231 13.636364
où les chiffres représentent maintenant le pourcentage (plutôt que le nombre de cas) des résultats qui ont été classés.
Bien noter, que la sklearn.metrics.confusion_matrix
sortie peut être visualisée directement en utilisant:
import matplotlib.pyplot as plt
conf = sklearn.metrics.confusion_matrix(y_true, y_pred)
plt.imshow(conf, cmap='binary', interpolation='None')
plt.show()