Python: comment normaliser une matrice de confusion?
J'ai calculé une matrice de confusion pour mon classificateur à l'aide de la méthode confusion_matrix() de la sklearn paquet. Les éléments de la diagonale de la matrice de confusion représentent le nombre de points pour lesquels la prédiction de l'étiquette est égale à la vraie étiquette, tandis que les éléments diagonaux sont ceux qui sont mal étiquetés par le classificateur.
Je tiens à normaliser ma confusion de la matrice de sorte qu'il ne contient que des nombres entre 0 et 1. Je voudrais lire le pourcentage de bien classés échantillons de la matrice.
J'ai trouvé plusieurs méthodes comment normaliser une matrice (ligne et colonne de normalisation), mais je ne sais pas beaucoup au sujet de maths et je ne suis pas sûr si c'est la bonne approche. Quelqu'un peut-il aider s'il vous plaît?
J'ai édité la question pour le rendre un peu plus clair. En gros, j'ai juste envie de transformer le nombre de classés échantillons à des pourcentages de sorte que je peux voir le nombre de classifier correctement les échantillons sur la diagonale de la matrice de l'exemple.
OriginalL'auteur Kaly | 2014-01-04
Vous devez vous connecter pour publier un commentaire.
Je suis en supposant que
M[i,j]
signifieElement of real class i was classified as j
. Si sa l'inverse, vous allez avoir besoin de transposer tout ce que je dis. Je vais aussi utiliser la matrice ci-dessous pour des exemples concrets:Il y a essentiellement deux choses que vous pouvez faire:
Trouver comment chaque classe a été classé
La première chose que l'on peut se poser est quel est le pourcentage d'éléments de la véritable classe
i
ici classés comme chaque classe. Pour ce faire, nous prenons une ligne de fixation de lai
et de diviser chaque élément par la somme des éléments de la ligne. Dans notre exemple, les objets de la classe 2 sont classés dans les catégories 1 à 4 reprises, sont correctement classés dans la classe 2 à 5 fois et sont classés dans la classe 3 à 6 fois. Pour trouver les pourcentages nous venons tout diviser par la somme 4 + 5 + 6 = 15Trouver ce que les classes sont responsables pour chaque classification
La deuxième chose que vous pouvez faire est de regarder chaque résultat de votre classifier et de se demander combien de ces résultats proviennent de chaque classe. Sa va être comme pour les autres cas, mais avec des colonnes au lieu de lignes. Dans notre exemple, notre classificateur retourne "1" 1 temps lorsque la classe d'origine est de 1, 4 temps lorsque la classe d'origine est de 2 et 7 fois lorsque la classe d'origine est 3. Pour trouver les pourcentages de nous diviser par la somme 1 + 4 + 7 = 12
--
Bien sûr, les deux méthodes que j'ai donné ne s'appliquent à une seule rangée de colonnes à un moment et je ne sais pas si ce serait une bonne idée de modifier votre matrice de confusion dans ce formulaire. Toutefois, cela devrait donner les pourcentages que vous recherchez.
OriginalL'auteur hugomg
Supposons que
Ensuite, pour trouver le nombre d'échantillons par classe ont reçu leur label, vous avez besoin
La diagonale contient les valeurs requises. Une autre façon de calculer ces est de réaliser que ce que vous êtes en informatique est le rappel par classe:
De même, si l'on divise par la somme sur
axis=0
, vous bénéficiez de la précision (fraction de la classe-k
prédictions qui ont la vérité terrain étiquettek
):C / C.astype(np.float).sum(axis=1)
seulement les éléments de la diagonale sont significatives. N'est-il pas préférable d'utilisernp.transpose( np.transpose(C) / C.astype(np.float).sum(axis=1) )
de sorte que l'ensemble de la matrice a de sens des valeurs?Je suis d'accord avec @arun. Mais au lieu d'utiliser la transposition vous pouvez utiliser
keepdims
en somme commeC / C.astype(np.float).sum(axis=1, keepdims=True)
OriginalL'auteur Fred Foo
La matrice de sortie par sklearn de
confusion_matrix()
est tels queafin d'obtenir les pourcentages de chaque classe (souvent appelé la spécificité et la sensibilité dans la classification binaire) vous avez besoin de normaliser en ligne: remplacer chaque élément d'une ligne par elle-même, divisée par la somme des éléments de cette ligne.
Noter que sklearn a un résumé de la fonction qui calcule les métriques à partir de la matrice de confusion : classification_report. C'sorties de précision et de rappel plutôt que de spécificité et de sensibilité, mais ceux-ci sont souvent considérés comme les plus informatifs en général (surtout pour déséquilibrée multi-classe de la classification.)
OriginalL'auteur damienfrancois
De la sklearn documentation (parcelle exemple)
où cm est la confusion de la matrice fournie par sklearn.
OriginalL'auteur Antoni