Les deux variations de la matrice de confusion

Les deux variations de la matrice de confusion

Vous savez peut-être déjà qu’il existe deux écoles de pensée (wiki contre python) sur la façon d’afficher une matrice de confusion.

Pour chaque débutant, il arrive un moment où l’on voit l’autre variation et qui penche la tête pour la comprendre. La littérature prend en charge une disposition tandis que le code semble en vomir l’autre.

Voici les variations:

Perspective 1: Classe réelle (vraie) sous forme de colonnes

comparé à:

Perspective 2: Classe prédite sous forme de colonnes

Il ne s’agit pas simplement d’échanger les lignes et les colonnes, mais aussi le fait que Vrais positifs qui étaient dans le coin supérieur gauche sont maintenant remplacés par Vrais négatifs.

Si vous utilisez des fonctions scikit-learn intégrées comme confusion_matrix, vous devez être conscient de la disposition d’entrée et de sortie, sinon tous vos calculs de sensibilité (rappel), de spécificité, de précision, de score F1 vont être erronés.

D’accord, voyons un exemple concret pour le comprendre, grâce au code.

Notre ensemble de données

Ceci est notre ensemble de données de résultats médicaux de 17 personnes. Ils sont soit malades (résultat de test positif) ou sains (résultat de test négatif). La première colonne montre leur état réel tandis que la deuxième colonne est celle prédite par notre algorithme. Le code utilisé pour générer ceci:

Si comme moi, vous avez étudié la plupart des statistiques via des livres et publications riches en exemples du domaine médical, les Actuals (ou Étalon-or) sera en haut sous forme de colonnes et Vrai positif dans la cellule en haut à gauche. Notre ensemble de données ressemblera à ceci:

Perspective 1: chiffres réels au sommet

Voici le code python pour générer ceci:

cm = confusion_matrix(data.Predicted, data.Actual, labels=[‘Positive’, ‘Negative’])print(cm)

Notez comment nous passons data.Predicted d’abord et data.Actual plus tard. Aussi l’ordre de labels est Positive première.

Production:

Ma mémoire pirate pour me souvenir de l’ordre des arguments:

De gauche à droite

Pour calculer toutes les métriques, on peut utiliser le sklearn classification_report une fonction.

J’adore cette fonction car l’ordre des arguments réels et prédits reste le même, quelle que soit votre perspective. Tout ce que vous devez spécifier différemment est l’ordre des étiquettes.

report = classification_report(data.Actual, data.Predicted, labels=[‘Positive’, ‘Negative’])print(report)

C’est toujours Réel première, Prédit plus tard – par ordre alphabétique, avec élégance. La sortie qu’il génère est:

Rapport de classification

Ceux qui l’ont appris grâce à la documentation de programmation et aux tutoriels détestent la représentation ci-dessus. C’est toujours l’inverse!

Prédictions en tête

Le hack de mémoire reste le même, lu de gauche à droite mais cette fois donne plus d’importance à Négatifs en les mentionnant d’abord dans le labels argument.

cm2 = confusion_matrix(data.Actual, data.Predicted, labels=[‘Negative’, ‘Positive’])print(cm2)

Et le bon vieux classification_report reste le même, le seul changement étant dans l’ordre des étiquettes:

report2 = classification_report(data.Actual, data.Predicted, labels=[‘Negative’, ‘Positive’])print(report2)
Rapport de classification – 2

Voilà, les deux résultats parfaitement synchronisés maintenant!

Je devais souvent chercher mes notes pour me souvenir de Précision ou quelle était la formule pour Sensibilité (aussi connu sous le nom Rappel). Voici donc un hack de mémoire que j’utilise pour m’en souvenir.

Tout d’abord, les formules réelles pour eux, afin que vous puissiez vous identifier facilement. J’explique ici sur la base de Perspective 1, mais vous pouvez le changer très facilement pour la perspective 2 si vous le souhaitez.

J’aime tout d’abord les classer par ordre alphabétique, afin de ne pas les mélanger – 1. Prévision 2. Recall 3. Sspécificité

Précision = TP / (TP + FP)

Rappel = TP / (TP + FN)

Spécificité = TN / (TN + FP)

Ma mémoire pirate pour m’en souvenir:

La précision est la première cellule divisée par la somme des lignes: 2/6 = 0,33

Le rappel est la première cellule divisée par la somme des colonnes: 2/7 = 0,29

La spécificité est la dernière cellule divisée par la somme des colonnes: 6/10 = 0,60

C’est ça! Rendu ma vie un peu plus facile, j’espère que cela vous aidera aussi. Avez-vous des trucs et astuces qui vous conviennent? Faites-le moi savoir dans la section commentaires ou envoyez-moi une ligne séparément.