1.2 Mesure de performances

Avant de nous lancer dans la découverte de différents algorithmes, nous devons nous intéresser aux outils et métriques qui permettent d’évaluer la qualité d’un classifieur dans l’étape de test. C’est, en effet, à travers eux que vous pourrez juger de la pertinence ou non de votre classifieur.

1.2.1 Matrice de confusion

L’outil le plus important pour évaluer la qualité d’un algorithme de classification supervisée est la matrice de confusion. Cette matrice est représentée sous la forme d’un tableau de contingence à double entrée qui croise les classes prédites par l’ordinateur avec les classes prédites manuellement pour ces mêmes items. En cas de concordance, les items sont dénombrés sur la diagonale de cette matrice carrée. Donc, tous les dénombrements hors diagonale représentent des erreurs faites par l’ordinateur (en vertu de l’hypothèse de base que le classement manuel est fait sans ambiguïté et sans erreur).

Espèce 1 Espèce 2 Espèce 3 Espèce 4
Espèce 1 correct erreur erreur erreur
Espèce 2 erreur correct erreur erreur
Espèce 3 erreur erreur correct erreur
Espèce 4 erreur erreur erreur correct

Considérons la matrice de confusion suivante, obtenue suite à la classification de trois fruits.

Tableau 1.1: Matrice de confusion dont les colonnes représentent la classification par ordinateur et les lignes la classification manuelle.
Orange Mandora Mandarine
Orange 25 0 0
Mandora 0 16 8
Mandarine 1 9 18

Quel que soit le nombre de classes, il est toujours possible de réduire la matrice de confusion dès lors qu’on se focalise sur une classe en particulier. Par exemple, si nous nous intéressons à la qualité de notre algorithme pour classer les mandoras, nous pouvons réduire notre matrice de confusion de la manière suivante (deux matrices simplifiées similaires peuvent naturellement être calculées pour les deux autres classes, orange et mandarine).

Tableau 1.2: Matrice de confusion dont les colonnes représentent la classification par ordinateur et les lignes la classification manuelle pour les mandoras.
Mandora Pas mandora
Mandora TP = 16 FN = 8
Pas mandora FP = 9 TN = 44

Les métriques principales sont :

  • TP : Vrais positifs (True Positive). C’est le nombre d’items du groupe d’intérêt correctement classé. Concernant nos mandoras, il s’agit du nombre d’items classé comme des mandoras par l’ordinateur et qui sont des mandoras.

  • TN : Vrais négatifs (True Negative). C’est le nombre d’items classé dans tous les autres groupes comme un autre groupe. Concernant nos mandoras, il s’agit du nombre d’items qui ne sont pas classés comme des mandoras et qui ne sont pas des mandoras.

  • FP : Faux positifs (False Positive). C’est le nombre d’items des autres groupes qui sont classés dans notre groupe d’intérêt. Concernant nos mandoras, il s’agit du nombre d’items classé comme des mandoras par l’ordinateur et qui ne sont pas des mandoras.

  • FN : Faux négatifs (False Negative). C’est le nombre d’items classé dans le groupe d’intérêt qui sont d’un autre groupe. Concernant nos mandoras, il s’agit du nombre d’items qui ne sont pas classés comme des mandoras par l’ordinateur, mais qui en sont.

Tableau 1.3: Matrice de confusion théorique dont les colonnes représentent la classification par ordinateur et les lignes la classification manuelle.
Positif Négatif
Positif TP FN
Négatif FP TN
À vous de jouer !
h5p

1.2.2 Métriques de performance

De nombreuses métriques existent afin de quantifier la qualité d’un classifieur sur base de la matrice de confusion. Partons d’un exemple fictif afin d’illustrer les calculs :

# Classification manuelle en 3 classes A, B, C (la "vérité")
manu <- c("A", "B", "C", "A", "A", "C", "B", "C", "B", "B")
# Classification automatique (par l'ordinateur)
auto <- c("B", "B", "C", "C", "A", "C", "B", "C", "A", "B")

# Matrice de confusion
matconf <- table(Manuel = manu, Automatique = auto)
knitr::kable(as.matrix(matconf),
  caption = "Données fictives de classification en trois classes A, B et C.")
Tableau 1.4: Données fictives de classification en trois classes A, B et C.
A B C
A 1 1 1
B 1 3 0
C 0 0 3
  • Taux de reconnaissance global (Accuracy en anglais)

\[acc(\%) = \frac{(TP+TN)}{(TP+TN+FP+FN)}\cdot 100\]

Il s’agit d’une métrique qui quantifie globalement le modèle et qui se généralise facilement à plus de deux classes. Si vous observez bien les termes dans l’équation, vous constaterez que c’est en fait la somme des valeurs sur la diagonale divisée par la somme totale. Cela nous mène au calcul à la main suivant dans R, sachant que diag() extrait les éléments sur la diagonale d’une matrice carrée :

# Taux global de reconnaissance (en %)
acc <- (sum(diag(matconf)) / sum(matconf)) * 100
acc
# [1] 70
  • Erreur globale (Error)

\[err = 100 - acc(\%) = (1-\frac{(TP+TN)}{(TP+TN+FP+FN)}) \cdot 100\]

L’erreur globale est le complément du taux de reconnaissance global et la somme des deux est toujours de 100%.

# Erreur globale (en %)
100 - acc
# [1] 30
  • Rappel (Recall)

\[recall(\%) = \frac{TP}{(TP+FN)} \cdot 100\]

Dans la littérature, vous pouvez également retrouver les noms suivants : taux de vrais positifs True Positive Rate (TPR), sensitivité Sensitivity, Power, Probability of detection. Le rappel est une métrique centrale dans la mesure où elle se focalise, pour une classe donnée, sur la fraction d’items du set d’apprentissage que l’ordinateur a pu trouver. Cela répond donc à une question particulière du type : “est-ce que je suis capable d’aller trouver mes items d’intérêt dans l’ensemble ?” Donc, pour les métriques qui s’intéressent à une classe en particulier (c’est valable pour les suivantes également), nous en avons autant que de classes. Voici comment on calcule le rappel pour les classes A, B et C à la main dans R sur notre exemple fictif :

# Rappel pour la classe A (%)
recallA <- matconf[1, 1] / sum(matconf[1, ]) * 100
recallA
# [1] 33.33333
# Rappel pour la classe B (%)
recallB <- matconf[2, 2] / sum(matconf[2, ]) * 100
recallB
# [1] 75
# Rappel pour la classe C (%)
recallB <- matconf[3, 3] / sum(matconf[3, ]) * 100
recallB
# [1] 100
À vous de jouer !
h5p
  • Spécificité (specificity)

\[specif(\%) = \frac{TN}{(TN+FP)} \cdot 100\]

Dans la littérature, vous pouvez également retrouver les noms suivants : taux de vrais négatifs True Negative Rate (TNR), sélectivité Selectivity. La spécificité apparaît complémentaire au rappel, même si traditionnellement, on complète souvent rappel par précision (voir ci-dessous). On peut aussi la calculer à partir du taux de faux positifs (FPR) :

\[FPR(\%) = \frac{FP}{TN + FP} \cdot 100\]

À partir du FPR, la spécificité se calcule alors comme son complément :

\[specif(\%) = 100 - FPR = (1-\frac{FP}{TN + FP}) \cdot 100\]

À noter aussi le taux de faux négatifs (FNR) qui est un point de vue complémentaire naturellement au taux de faux positifs  :

\[FNR(\%) = \frac{FN}{TP + FN} \cdot 100\]

Pour calculer ces métriques à la main dans R sur notre exemple fictif, nous ferons :

# Taux de faux négatifs (par ligne) pour A (en %)
FNR <- ((sum(matconf[1, ]) - matconf[1, 1]) / sum(matconf[1, ])) * 100
FNR
# [1] 66.66667
# Taux de faux positifs (par colonne) pour A (en %)
# Notez que TN + FP est en fait tout sauf la première ligne
FPR <- ((sum(matconf[, 1]) - matconf[1, 1]) / sum(matconf[-1, ])) * 100
FPR
# [1] 14.28571
# Spécificité pour A (en %)
specA <- 100 - FPR
specA
# [1] 85.71429
  • Précision (Precision)

\[prec(\%) = \frac{TP}{(TP+FP)} \cdot 100\]

Dans la littérature, vous pouvez également retrouver les noms suivants : Positive Predicted Value (PPV), Reproducibility, Repeatability. La précision s’intéresse à une question très différente du rappel, mais néanmoins complémentaire : “quelle est la fraction effectivement de classe X que l’ordinateur a classée comme X ?”

Un calcul manuel dans R donne :

# Précision pour A (en %)
precA <- matconf[1, 1] / sum(matconf[, 1]) * 100
precA
# [1] 50

Si la classification ne peut se faire sans erreurs (cas le plus fréquent), nous pouvons améliorer la précision, mais au détriment du rappel, ou vice-versa. Selon le contexte, nous avons plutôt intérêt à favoriser l’un ou l’autre. Par exemple, pour le dépistage de la COVID-19, il vaut mieux un test avec un rappel le plus élevé possible (pour ne pas déclarer des patients malades comme faussement sains), quitte à sacrifier un peu la précision (avoir une fraction un peu plus grande de faux positifs dans la fraction de la population considérée comme atteinte par le test… et qui ferait une quarantaine inutilement).

Dans d’autres situations, il vaut mieux, au contraire, favoriser la précision. Si nous voulons inclure des sujets atteints d’une maladie rare dans une étude, nous n’aurons pas intérêt à échantillonner la population au hasard. En effet, notre échantillon contiendra trop d’individus sains par rapport aux rares malades. Nous pourrions alors utiliser la classification supervisée pour déterminer qui est malade ou sain, et ensuite effectuer un échantillonnage stratifié dans les deux classes (50% de chaque classe dans l’échantillon final pour notre étude). Évidemment, dans ce cas, si la précision est très faible, nous aurons énormément de faux positifs dans la fraction détectée comme malade. Cela réduirait alors la représentativité des individus malades dans l’échantillon, par rapport à un classifieur qui montre une précision plus grande pour la classe des malades.

À vous de jouer !
h5p

Ces deux exemples sont plutôt extrêmes. Dans la majorité des cas, nous recherchons plutôt un bon équilibre entre rappel et précision, et ce, pour toutes les classes. Les mesures suivantes de score F ou précision balancée tentent de synthétiser rappel et précision, ou rappel et spécificité en un seul nombre pour une classe donnée, afin de représenter au mieux cette recherche d’un compromis entre les deux.

  • Score F (F-measure)

\[Fmeas = 2 \cdot \frac{(precision \cdot recall)}{(precision + recall)}\]

Dans la littérature, vous pouvez également retrouver les noms suivants : F1-score, harmonic mean of precision and recall.

# Mesure F ou F1-score pour A (en %)
2 * (recallA * precA) / (recallA + precA)
# [1] 40
  • Précision balancée (Balanced accuracy)

\[ball\ acc = \frac{(specificity + recall)}{2}\]

# Précision balancée pour A (en %)
(specA + recallA) / 2
# [1] 59.52381
À vous de jouer !

Effectuez maintenant les exercices du tutoriel C01La_confusion (Matrice de confusion et métriques).

BioDataScience3::run("C01La_confusion")
Pour en savoir plus

Vous pouvez retrouver des indices supplémentaires via le lien suivant : Statistics calculated on confusion matrix

À vous de jouer !

Ce projet est un projet par groupe. Les groupes doivent correspondre aux rangées de la salle de cours.

Réalisez en groupe le travail C01Ga_metrics.

Travail en groupe de 4 pour les étudiants inscrits au cours de Science des Données Biologiques III à l’UMONS à terminer avant le 2022-10-14 23:59:59.

Initiez votre projet GitHub Classroom

Voyez les explications dans le fichier README.md.