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’étudier la qualité d’un outil de classification dans l’étape de test.

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.

Le test (évaluation des performances d’un classifieur) doit toujours se faire sur un échantillon indépendant du set d’apprentissage. C’est pour cela que nous devons avoir deux sets indépendants : le set d’apprentisage et le set de test ne contenant pas les mêmes individus.

La matrice de confusion est représentée sous la forme d’un tableau de contingence à double entrée qui croise les groupes prédits par l’ordinateur avec les groupes prédits 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 erreurs).

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

Prenons cette matrice de confusion qui s’intéresse à 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 paramètres principaux sont :

  • TP : Vrai positif (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 : Vrai négatif (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é comme des mandoras et qui ne sont pas des mandoras.

  • FP : Faux positif (False Positive). C’est le nombre d’items des autres groupes qui sont classé 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égatif (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é comme des mandoras par l’ordinateur mais qui en sont.

À vous de jouer !
h5p

1.2.2 Métriques de performance

De très nombreuses métriques existent afin de quantifier l’ajustement d’un modèle sur base de la matrice de confusion.

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

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)

\[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 donc, 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 fractions 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
  • 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\]

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

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

A 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é 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.

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 seule nombre pour une classe données, 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).

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

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