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’un des outils les plus importants 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 le long de la diagonale de cette matrice carrée. Donc, tous les dénombrements hors diagonale représentent des erreurs faites par l’ordinateur (en vertu du postulat de base que le classement manuel est établi 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 aux performances de notre classifieur pour 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 dans cette dernière matrice de confusion réduite à une taille de 2x2 (on parle aussi de classification binaire) sont :

  • TP : Vrais positifs (True Positive en anglais). C’est le nombre d’items de la classe 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 effectivement des mandoras.

  • TN : Vrais négatifs (True Negative). C’est le nombre d’items classé dans toutes les autres classes de manière correcte. Concernant nos mandoras, il s’agit du nombre d’items qui ne sont pas classés comme des mandoras et qui ne sont effectivement pas des mandoras.

  • FP : Faux positifs (False Positive). C’est le nombre d’items des autres classes qui sont erronément classés dans notre classe d’intérêt. Concernant nos mandoras, il s’agit du nombre d’items classés comme des mandoras par l’ordinateur alors qu’ils n’en sont pas.

  • FN : Faux négatifs (False Negative). C’est le nombre d’items de la d’intérêt qui sont classés par l’ordinateur dans une autre classe. Concernant nos mandoras, il s’agit du nombre de mandoras qui sont erronément classées par l’ordinateur comme des oranges ou des mandarines.

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 pour quantifier les performances d’un classifieur sur base de la matrice de confusion (dont certaines nécessitent la simplification en matrice 2x2, mais pas toutes). Partons d’un exemple fictif pour 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(\%) = \left(1-\frac{TP+TN}{TP+TN+FP+FN} \right) \cdot 100\]

L’erreur globale est le complément du taux de reconnaissance global et la somme des deux est toujours de 100%. Il s’agit aussi de la somme des éléments hors diagonale divisée par la somme totale de la matrice carrée. Cette métrique se généralise également à des cas à plus de deux classes.

# 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 = \left(1-\frac{FP}{TN + FP} \right) \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, une maladie contagieuse, 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 partie de la population considérée comme atteinte d’après 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 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 de score F 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)

\[Fscore = 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")

1.2.3 Micro- et macro-moyenne des métriques

Avec la série de métriques présentées ici, vous avez suffisamment d’outils à votre disposition pour quantifier les performances de vos classifieurs selon différents points de vue. Nous en verrons encore quelques autres, ainsi que des graphiques de diagnostic plus loin dans le cours. Un point reste à éclaircir toutefois : quelles sont les métriques utilisables dans les cas à deux classes (classification binaire), à plus de deux classes (classification multiclasse), et comment généraliser à plus de deux classes ? Vous savez déjà que le cas multiclasse peut toujours se résumer à deux classes lorsque l’on a choisi une classe cible : en réduisant la matrice de confusion à cette classe versus le reste. Cela nous mène à calculer la métrique pour chaque classe qui devient cible tour à tour. Pour cette raison, on l’appelle métrique par classe.

  • Les métriques qui se généralisent au cas multiclasse sont le taux de reconnaissance global et l’erreur globale.

  • Les métriques limitées à la classification binaire (calculées “par classe” dans le cas multi) sont toutes les autres (à part la précision balancée qui a une version multiclasse que nous n’avons pas discutée ici).

Il existe une technique qui permet de résumer globalement les métriques qui se calculent par classe seulement en une seule valeur pour l’ensemble du classifieur dans le cas multiclasse. Il s’agit de calculer la métrique pour chaque classe, et ensuite d’effectuer la moyenne de toutes les valeurs obtenues. En fait, il y a deux moyens d’y arriver :

  • Soit on fait le calcul “un contre tous” en rassemblant tout ce qui n’est pas de la classe cible en une classe “autre” comme nous avons fait jusqu’ici dans le calcul “par classe”. Cela nous amène à calculer p métriques pour les p classes, et ensuite d’en faire la moyenne. C’est ce qu’on appelle la métrique macro-moyenne (macro-average en anglais). À noter que la moyenne peut être simple ou pondérée en fonction de la représentation des différentes classes dans le set de test. Si la moyenne est pondérée, la métrique donnera plus d’importance aux classes abondantes. Ce n’est pas toujours désiré, car alors, le classifieur sera d’autant moins performant que les classes sont rares… au bénéfice de performances globales. Or ces performances globales sont déjà quantifiées par le taux global de reconnaissance ou l’erreur globale qui en est le complément.

  • Soit le calcul se fait deux à deux par paire de classes jusqu’à avoir calculé la métrique pour toutes les paires possibles. Cette approche est la même que pour le calcul d’une matrice de distances entre individus, ou pour le calcul d’une matrice de corrélations, par exemple. Cependant, le calcul est optimisé et réalisé différemment, mais le principe est celui-là. Dans ce cas, nous appellerons cette métrique micro-moyenne (micro-average en anglais). Ce calcul tient compte des proportions relatives des individus à travers toute la matrice de confusion et se rapproche de la version pondérée de la variante macro-moyenne pour cette raison. En présence de classes très déséquilibrées, nous avons donc le même biais que pour la version pondérée (et pour le taux global de reconnaissance ou l’erreur globale) qui accorde plus d’importance aux classes les plus abondantes. D’autre part, la méthode micro-moyenne considère tour à tour un individu mal classé comme faux positif et comme faux négatif selon la classe cible. Il en résulte que le nombre moyen de faux positifs et de faux négatifs est toujours le même. Donc, les variantes micro-moyennes de rappel, précision et score F sont toutes trois égales et les deux points de vue de l’analyse (récupérer un maximum d’items avec le rappel, ou obtenir un classement exempt d’items mal classés avec la précision) s’effacent complètement. Par contre, la métrique quantifiera mieux que la macro-moyenne non pondérée les performances globales toutes classes confondues et se rapprochera à cet égard du taux global de reconnaissance.

Nous pourrons noter ces métriques globales de deux façons. Prenons le rappel. Soit nous écrivons macro-rappel et micro-rappel, soit nous écrivons rappel(macro-moyenne) et rappel(micro-moyenne). On ajoutera l’adjectif “pondérée” (“weighted” en anglais) si nécessaire, comme rappel(micro-moyenne pondérée). Les deux notations se rencontrent.

Plus loin dans le résumé d’une matrice de confusion effectuée avec le package {mlearning}, vous verrez qu’une telle métrique est calculée pour le score F (à la fois la version macro- et micro-moyenne) qui fait un compromis entre rappel et précision. Ainsi les scores F(macro-moyenne) et F(micro-moyenne) sont également de bonnes métriques globales, et elles seront même plus utiles lorsqu’il y a de fortes disparités dans les performances d’une classe à l’autre que le taux de reconnaissance globale (surtout dans la version non pondérée de la macro-moyenne et en présence de proportions par classes très déséquilibrées).

Pour en savoir plus
À vous de jouer !

Ce projet sera traité par groupe de quatre étudiants.

Réalisez en groupe le travail C01Ga_metrics, partie I.

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

Initiez votre projet GitHub Classroom

Voyez les explications dans le fichier README.md, partie I.