Matrice de confusion

Ce tutoriel présente la matrice de confusion, son utilisation dans le cadre d’une classification multiclasse et les biais qui peuvent être mal perçu lors de la discussion des résultats.

matrice de confusion

Matrice de confusion 2x2

Une matrice de confusion permet de représentation les résultats d’une classification binaire. Les Vrais Positifs, les Faux Positifs, les Vrais Négatifs et les Faux Négatifs.

matrice de confusion

Les éléments en bleu sont ceux correctement prédit (Y chapeau), et ceux en rouge incorrectement.

Voyons comment construire une matrice de confusion et comprendre ses terminologies. Considérons que nous devons modéliser un classificateur qui classe 2 sortes de fruits. Nous avons 2 types de fruits – les pommes et les raisins – et nous voulons que notre modèle d’apprentissage automatique identifie ou classe le fruit donné comme pomme ou raisin.

Nous prélevons donc 15 échantillons de 2 fruits, dont 8 appartiennent à la classe Pommes et 7 appartiennent à la classe Raisin. La classe n’est rien d’autre que la sortie, dans cet exemple, nous avons 2 classes de sortie : Pommes et Raisins. Nous représenterons Apple comme classe 1 et Grape comme classe 0.

La classe réelle pour 8 pommes et 7 raisins peut être représentée comme suit :

Réel = [1,1,1,1,1,1,1,1,0,0,0,0,0,0,0]

Le modèle classificateur prédit 1 pour Apple et 0 pour raisin.

Supposons que le classificateur prend les 15 entrées et fasse les prédictions suivantes :

  • Sur 8 pommes, il en classera 5 correctement comme pommes et en prédira à tort 3 comme raisins.
  • Sur 7 raisins, il en classera 5 correctement comme raisins et en prédit à tort 2 comme pommes.

La prédiction du classificateur peut être la suivante :

Prédiction = [1,0,0,0,1,1,1,1,0,0,0,0,0,1,1]

# Creation of confusion matrix in using sklearn
from sklearn.metrics import confusion_matrix
#Let actual value be 1 for apple and 0 grapes for our example
ACTUAL = [1,1,1,1,1,1,1,1,0,0,0,0,0,0,0]
# Let the predicted values be
PREDICTION= [1,0,0,0,1,1,1,1,0,0,0,0,0,1,1]
# Confusion matrix for actual and predicted values.
matrix = confusion_matrix(ACTUAL,PREDICTION, labels=[1,0])
print('Confusion matrix : n',matrix)
# outcome values order in sklearn
TP, FN, FP, TN = confusion_matrix(ACTUAL,PREDICTION,labels=[1,0]).reshape(-1)
print('Outcome values : n', TP, FN, FP, TN)

Pour notre exemple, la valeur positive est Apple et la valeur négative est Raisin.

Vrai positif : cela signifie que la valeur réelle et les valeurs prédites sont les mêmes. Dans notre cas, la valeur réelle est aussi une pomme, et la prédiction du modèle est également une pomme. Si vous observez la cellule TP, la valeur positive est la même pour Réel et prédit.

Faux négatif : cela signifie que la valeur réelle est positive. Dans notre cas, il s’agit de pomme, mais le modèle l’a prédit comme négatif, c’est-à-dire du raisin. Le modèle a donc donné une mauvaise prédiction. Cela était censé donner un résultat positif (pomme), mais cela a donné un résultat négatif (raisin). Ainsi, quel que soit le résultat négatif que nous obtenons, il est faux ; d’où le nom de faux négatif.

Faux positif : cela signifie que la valeur réelle est négative. Dans notre cas, il s’agit du raisin, mais le modèle l’a prédit comme positif, c’est-à-dire la pomme. Le modèle a donc donné une mauvaise prédiction. Il était censé donner un résultat négatif (raisin), mais il a donné un résultat positif (pomme), donc quel que soit le résultat positif que nous obtenons, il est faux, d’où le nom de faux positif.

Vrai négatif : cela signifie que la valeur réelle et les valeurs prédites sont les mêmes. Dans notre cas, les valeurs réelles sont les raisins, et la prédiction est également les raisins. Les valeurs pour l’exemple ci-dessus sont : TP=5, FN=3, FP=2, TN=5.

Vous connaissez la théorie, mettons-la maintenant en pratique. Codons une matrice de confusion avec la bibliothèque Scikit-learn (sklearn) en Python.

Sklearn a deux fonctions intéressantes : confusion_matrix() et classification_report().

Sklearn confusion_matrix() renvoie les valeurs de la matrice Confusion. Le résultat est cependant légèrement différent de ce que nous avons étudié jusqu’à présent. Il prend les lignes comme valeurs réelles et les colonnes comme valeurs prédites. Le reste du concept reste le même.

Sklearn classification_report() génère la précision, le rappel et le score f1 pour chaque classe cible. En plus de cela, il a également des valeurs supplémentaires : micro moyenne, macro moyenne et moyenne pondérée.

La moyenne Mirco est la précision/rappel/score f1 calculé pour toutes les classes.

La moyenne macro est la moyenne de la précision/rappel/score f1.

La moyenne pondérée est simplement la moyenne pondérée de la précision/rappel/score f1.

Matrice de confusion multiclasse, exemple 3x3

Essayons de comprendre la matrice de confusion pour 3 classes et la matrice de confusion pour plusieurs classes avec un ensemble de données populaire – l’IRIS DATASET.

L’ensemble de données contient 3 fleurs comme sorties ou classes, Versicolor, Virginia et Setosa.

À l’aide de la longueur des pétales, de la largeur des pétales, de la longueur des sépales et de la largeur des sépales, le modèle doit classer l’instance donnée comme fleur Versicolor ou Virginia, ou Setosa.

Appliquons ici un modèle de classificateur. Nous pouvons utiliser la régression logistique, mais un classificateur d’arbre de décision est appliqué à l’ensemble de données ci-dessus. L’ensemble de données comporte 3 classes ; nous obtenons donc une matrice de confusion 3 X 3.

Mais comment connaître les valeurs TP, TN, FP et FN ?

Dans le problème de classification multiclasse, nous n’obtiendrons pas directement les valeurs TP, TN, FP et FN comme dans le problème de classification binaire. Pour la validation, nous devons calculer pour chaque classe.

#importing packages
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
#Importing of dataset to dataframe. 
df = pd.read_csv("../input/iris-flower-dataset/IRIS.csv")
#To see first 5 rows of the dataset
df.head()
#To know the data types of the variables.
df.dtypes
#Speceis is the output class,to know the count of each class we use value_counts()
df['Species'].value_counts()
#Separating independant variable and dependent variable("Species")
X = df.drop(['Species'], axis=1)
y = df['Species']
# print(X.head())
print(X.shape)
# print(y.head())
print(y.shape)
# Splitting the dataset to Train and test
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
#to know the shape of the train and test dataset.
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)
#We use Support Vector classifier as a classifier
from sklearn.svm import SVC
from sklearn.metrics import confusion_matrix
#training the classifier using X_Train and y_train 
clf = SVC(kernel = 'linear').fit(X_train,y_train)
clf.predict(X_train)
#Testing the model using X_test and storing the output in y_pred
y_pred = clf.predict(X_test)
# Creating  a confusion matrix,which compares the y_test and y_pred
cm = confusion_matrix(y_test, y_pred)
# Creating a dataframe for a array-formatted Confusion matrix,so it will be easy for plotting.
cm_df = pd.DataFrame(cm,
                     index = ['SETOSA','VERSICOLR','VIRGINICA'], 
                     columns = ['SETOSA','VERSICOLR','VIRGINICA'])
#Plotting the confusion matrix
plt.figure(figsize=(5,4))
sns.heatmap(cm_df, annot=True)
plt.title('Confusion Matrix')
plt.ylabel('Actal Values')
plt.xlabel('Predicted Values')
plt.show()

Comme indiqué précédemment, FN : la valeur faux négatif d’une classe sera la somme des valeurs des lignes correspondantes, à l’exception de la valeur TP. FP : La valeur faux positif d’une classe sera la somme des valeurs de la colonne correspondante à l’exception de la valeur TP. TN : la valeur vrai-négative d’une classe sera la somme des valeurs de toutes les colonnes et lignes, à l’exception des valeurs de cette classe pour laquelle nous calculons les valeurs. Et TP : la valeur vraie-positive est celle où la valeur réelle et la valeur prédite sont les mêmes.

La matrice de confusion pour l’ensemble de données IRIS est la suivante :

matrice de confusion

Calculons les valeurs TP, TN, FP et FN pour la classe Setosa en utilisant les astuces ci-dessus :

TP : La valeur réelle et la valeur prédite doivent être identiques. Donc concernant la classe Setosa, la valeur de la cellule 1 est la valeur TP.

FN : la somme des valeurs des lignes correspondantes à l’exception de la valeur TP

FN = (cellule 2 + cellule3) = (0 + 0) = 0

FP : La somme des valeurs de la colonne correspondante à l’exception de la valeur TP.

FP = (cellule 4 + cellule 7) = (0 + 0) = 0

TN : la somme des valeurs de toutes les colonnes et lignes, à l’exception des valeurs de la classe pour laquelle nous calculons les valeurs.

TN = (cellule 5 + cellule 6 + cellule 8 + cellule 9) = 17 + 1 +0 + 11 = 29

De même, pour la classe Versicolor, les valeurs/métriques sont calculées comme ci-dessous :

TP : 17 (cellule 5)

FN : 0 + 1 = 1 (cellule 4 +cellule 6)

FP : 0 + 0 = 0 (cellule 2 + cellule 8)

TN : 16 +0 +0 + 11 =27 (cellule 1 + cellule 3 + cellule 7 + cellule 9).

Vous pouvez essayer le cours de Virginie.

Mesure d'interprétation

La matrice de confusion nous permet de mesurer le rappel et la précision, qui, avec la précision et la courbe AUC-ROC, sont les mesures utilisées pour mesurer les performances des modèles ML.

Le rappel peut être expliqué en disant, parmi toutes les classes positives, combien nous en avons prédit correctement. Le rappel doit être aussi élevé que possible.

La précision peut être expliquée en disant, parmi toutes les classes que nous avons prédites comme positives, combien sont réellement positives. La précision doit être la plus élevée possible.

Parmi toutes les classes (positives et négatives), la précision détermine combien d’entre elles nous avons prédit correctement. Dans ce cas, ce sera 4/7. La précision doit être la plus élevée possible.

matrice de confusion

Il est difficile de comparer deux modèles avec une faible précision et un rappel élevé ou vice versa. Donc pour les rendre comparables, nous utilisons le F-Score. Le score F permet de mesurer simultanément le rappel et la précision. Il utilise la moyenne harmonique à la place de la moyenne arithmétique en punissant davantage les valeurs extrêmes.

F1-score

Il existe beaucoup d’autres mesures de précision, chacun ayant lors utilité et des utilisations bien particulière :

matrice de confusion

a- le nombre de cas réels positifs dans les données

b- Un résultat de test qui indique correctement la présence d’une condition ou d’une caractéristique

c- Erreur de type II : un résultat de test qui indique à tort qu’une condition ou un attribut particulier est absent

d- le nombre de cas négatifs réels dans les données

e- Erreur de type I : un résultat de test qui indique à tort qu’une condition ou un attribut particulier est présent

f- Un résultat de test qui indique correctement l’absence d’une condition ou d’une caractéristique

Evaluer les biais et arbre de décision

Lors de l’évaluation d’un modèle, les métriques recueillies par rapport à un ensemble de test ou de validation complète ne permettent pas toujours de se faire une idée précise du degré d’équité de ce modèle.

Prenons l’exemple d’un nouveau modèle développé pour prédire la présence de tumeurs,évalué sur un ensemble de validation de 1 000 patients. 500 enregistrements correspondants à des femmes et 500 à des hommes. La matrice de confusion suivante récapitule les résultats obtenus pour les 1 000 exemples :

Vrais positifs (VP) : 16 Faux positifs (FP) : 4
Faux négatif (FN): 6 Vrais négatif (VN): 974

Precision = 0.800, Recall = 0.727

Ces résultats semblent prometteurs: précision de 80% et rappel de 72,7%. Mais que se passe-t-il si nous calculons le résultat séparément pour chaque ensemble de patients ? Répartissons les résultats dans deux matrices de confusion distinctes: l’une pour les femmes et l’autre pour les hommes. Pour les répartitions, il est aussi possible de s’aider de l’arbre de décision !

matrice de confusion

Lorsque nous calculons séparément les métriques pour les patients de sexe féminin et masculin, nous observons des différences marquées dans les performances du modèle pour chaque groupe.

Femmes:

  • Sur les 11 femmes qui ont des tumeurs, le modèle prédit correctement un résultat positif pour 10 patients (taux de rappel: 90,9%). En d’autres termes, le modèle ne détecte pas de tumeur dans 9,1% des cas de femmes.

  • De même, lorsque le modèle renvoie un résultat positif de tumeur chez les femmes, il est correct dans 10 cas sur 11 (taux de précision: 90,9%). En d’autres termes, le modèle prédit de manière incorrecte la tumeur dans 9,1% des cas de femmes.

Hommes:

  • Toutefois, sur les 11 patients masculins qui ont des tumeurs, le modèle prédit correctement un résultat positif pour seulement 6 patients (taux de rappel: 54,5%). Cela signifie que le modèle ne détecte pas de tumeur dans 45,5% des cas pour les hommes.

  • Lorsque le modèle donne un résultat positif de tumeur chez les hommes, il est correct dans seulement 6 cas sur 9 (soit un taux de précision de 66,7%). En d’autres termes, le modèle prédit de manière incorrecte la tumeur dans 33,3% des cas pour les hommes.

Nous disposons désormais d’une bien meilleure compréhension des biais inhérents aux prédictions du modèle, ainsi que des risques associés à chaque sous-groupe si celui-ci devait être utilisé à des fins médicales par la population globale.