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.
Pour comprendre les bases de Confusion Matrix, vous pouvez jeter un œil ici.
Voici les variations:
comparé à:
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.
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:
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:
Je viens de le lire comme on lit l’anglais – de gauche à droite. Et je suis positif c’est la disposition que l’on doit utiliser.
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:
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!
La position de Faux positifs et Faux négatifs restent les mêmes dans une matrice de confusion 2×2, quelle que soit la perspective que vous choisissez.
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)
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.