Recherche de site Web

Évaluation des modèles d'apprentissage profond : la matrice de confusion, l'exactitude, la précision et le rappel


En vision par ordinateur, la détection d'objets est le problème de la localisation d'un ou plusieurs objets dans une image. Outre les techniques traditionnelles de détection d'objets, les modèles avancés d'apprentissage profond tels que R-CNN et YOLO peuvent réaliser une détection impressionnante sur différents types d'objets. Ces modèles acceptent une image comme entrée et renvoient les coordonnées du cadre de délimitation autour de chaque objet détecté.

Ce didacticiel traite de la matrice de confusion et de la façon dont la précision, le rappel et l'exactitude sont calculés. Dans un autre tutoriel, le mAP sera abordé.

Plus précisément, nous couvrirons :

  • Matrice de confusion pour la classification binaire
  • Matrice de confusion pour la classification multiclasse
  • Calcul de la matrice de confusion avec Scikit-learn
  • Exactitude, précision et rappel
  • Précision ou rappel ?
  • Conclusion

Conditions préalables

Afin de suivre cet article, vous aurez besoin d'une expérience avec le code Python et d'une compréhension débutante du Deep Learning. Nous partirons du principe que tous les lecteurs ont accès à des machines suffisamment puissantes pour pouvoir exécuter le code fourni.

Si vous n'avez pas accès à un GPU, nous vous suggérons d'y accéder via le cloud. De nombreux fournisseurs de cloud proposent des GPU. Les droplets GPU DigitalOcean sont actuellement en disponibilité anticipée, apprenez-en plus et inscrivez-vous pour vous intéresser aux droplets GPU ici

Pour obtenir des instructions sur la prise en main du code Python, nous vous recommandons d'essayer ce guide du débutant pour configurer votre système et vous préparer à exécuter des didacticiels pour débutants.

Matrice de confusion pour la classification binaire

Dans la classification binaire, chaque échantillon d'entrée est affecté à l'une des deux classes. Généralement, ces deux classes se voient attribuer des étiquettes telles que 1 et 0, ou positif et négatif. Plus précisément, les deux étiquettes de classe peuvent être quelque chose comme malin ou bénigne (par exemple si le problème concerne la classification du cancer), ou succès ou <échec (par exemple s'il s'agit de classer les résultats des tests des étudiants).

Supposons qu'il existe un problème de classification binaire avec les classes positives et négatives. Voici un exemple des étiquettes de sept échantillons utilisés pour entraîner le modèle. C'est ce qu'on appelle les étiquettes de vérité terrain de l'échantillon.

positive, negative, negative, positive, positive, positive, negative

Notez que les étiquettes de classe sont utilisées pour nous aider, nous, les humains, à différencier les différentes classes. Ce qui revêt une grande importance pour le modèle est un score numérique. Lorsqu’un seul échantillon est transmis au modèle, celui-ci ne renvoie pas nécessairement une étiquette de classe, mais plutôt un score. Par exemple, lorsque ces sept échantillons sont introduits dans le modèle, leurs scores de classe pourraient être :

0.6, 0.2, 0.55, 0.9, 0.4, 0.8, 0.5

Sur la base des scores, chaque échantillon reçoit une étiquette de classe. Comment convertir ces scores en labels ? Nous faisons cela en utilisant un seuil. Ce seuil est un hyperparamètre du modèle et peut être défini par l'utilisateur. Par exemple, le seuil pourrait être de 0,5 – alors tout échantillon supérieur ou égal à 0,5 recevra l'étiquette positive. Sinon, c'est négatif. Voici les étiquettes prévues pour les échantillons :

positive (0.6), negative (0.2), positive (0.55), positive (0.9), negative (0.4), positive (0.8), positive (0.5)

À titre de comparaison, voici à la fois les étiquettes de vérité terrain et celles prédites. À première vue, nous pouvons voir 4 prédictions correctes et 3 prédictions incorrectes. Notez que la modification du seuil peut donner des résultats différents. Par exemple, définir le seuil sur 0,6 ne laisse que deux prédictions incorrectes.

Ground-Truth: positive, negative, negative, positive, positive, positive, negative
Predicted   : positive, negative, positive, positive, negative, positive, positive

Pour extraire plus d'informations sur les performances du modèle, la matrice de confusion est utilisée. La matrice de confusion nous aide à visualiser si le modèle est « confus » en discriminant les deux classes. Comme le montre la figure suivante, il s’agit d’une matrice 2×2. Les étiquettes des deux lignes et colonnes sont Positive et Négative pour refléter les deux étiquettes de classe. Dans cet exemple, les étiquettes de ligne représentent les étiquettes de vérité terrain, tandis que les étiquettes de colonne représentent les étiquettes prédites. Cela pourrait être modifié.

Les 4 éléments de la matrice (les éléments en rouge et vert) représentent les 4 métriques qui comptent le nombre de prédictions correctes et incorrectes faites par le modèle. Chaque élément reçoit une étiquette composée de deux mots :

  1. Vrai ou Faux
  2. Positif ou Négatif

Il est Vrai lorsque la prédiction est correcte (c'est-à-dire qu'il y a une correspondance entre les étiquettes prédites et celles de la vérité terrain), et Faux lorsqu'il y a une inadéquation entre les étiquettes prédites et réelles. -les étiquettes de vérité. Positif ou Négatif fait référence à l'étiquette prédite.

En résumé, chaque fois que la prédiction est fausse, le premier mot est Faux. Sinon, c'est Vrai. L'objectif est de maximiser les métriques avec le mot Vrai (True Positive et True Negative), et de minimiser les deux autres métriques ( Faux positif et Faux négatif). Les quatre métriques de la matrice de confusion sont donc :

  1. En haut à gauche (Vrai positif) : combien de fois le modèle a-t-il correctement classé un échantillon positif comme positif ?
  2. En haut à droite (Faux négatif) : combien de fois le modèle a-t-il incorrectement classé un échantillon positif comme négatif ?
  3. En bas à gauche (Faux positif) : combien de fois le modèle a-t-il incorrectement classé un échantillon négatif comme positif ?
  4. En bas à droite (Vrai Négatif) : combien de fois le modèle a-t-il correctement classé un échantillon Négatif comme Négatif ?

Nous pouvons calculer ces quatre métriques pour les sept prédictions que nous avons vues précédemment. La matrice de confusion résultante est donnée dans la figure suivante.

C'est ainsi que la matrice de confusion est calculée pour un problème de classification binaire. Voyons maintenant comment cela serait calculé pour un problème multi-classes.

Matrice de confusion pour la classification multiclasse

Et si nous avons plus de deux classes ? Comment calculer ces quatre métriques dans la matrice de confusion pour un problème de classification multi-classes ? Simple!

Supposons qu'il y ait 9 échantillons, où chaque échantillon appartient à l'une des trois classes : Blanc, Noir ou Rouge. Voici les données de vérité terrain pour les 9 échantillons.

Red, Black, Red, White, White, Red, Black, Red, White

Lorsque les échantillons sont introduits dans un modèle, voici les étiquettes prédites.

Red, White, Black, White, Red, Red, Black, White, Red

Pour faciliter la comparaison, ils sont ici côte à côte.

Ground-Truth: Red, Black, Red,   White, White, Red, Black, Red,   White
Predicted:    Red, White, Black, White, Red,   Red, Black, White, Red

Avant de calculer la matrice de confusion, une classe cible doit être spécifiée. Définissons la classe Red comme cible. Cette classe est marquée comme Positive et toutes les autres classes sont marquées comme Négative.

Positive, Negative, Positive, Negative, Negative, Positive, Negative, Positive, Negative
Positive, Negative, Negative, Negative, Positive, Positive, Negative, Negative, Positive

Il n'y a plus que deux classes (Positive et Négative). Ainsi, la matrice de confusion peut être calculée comme dans la section précédente. Notez que cette matrice est uniquement destinée à la classe Red.

Pour la classe Blanc, remplacez chacune de ses occurrences par Positive et toutes les autres étiquettes de classe par Négative. Après remplacement, voici les étiquettes de vérité terrain et prédites. La figure suivante montre la matrice de confusion pour la classe White.

Negative, Negative, Negative, Positive, Positive, Negative, Negative, Negative, Positive
Negative, Positive, Negative, Positive, Negative, Negative, Negative, Positive, Negative

De même, voici la matrice de confusion pour la classe Black.

Calcul de la matrice de confusion avec Scikit-Learn

La populaire bibliothèque Scikit-learn en Python possède un module appelé metrics qui peut être utilisé pour calculer les métriques dans la matrice de confusion.

Pour les problèmes de classe binaire, la fonction confusion_matrix() est utilisée. Parmi ses paramètres acceptés, nous utilisons ces deux-là :

  1. y_true : les étiquettes de vérité terrain.
  2. y_pred : les étiquettes prédites.

Le code suivant calcule la matrice de confusion pour l'exemple de classification binaire dont nous avons discuté précédemment.

import sklearn.metrics

y_true = ["positive", "negative", "negative", "positive", "positive", "positive", "negative"]
y_pred = ["positive", "negative", "positive", "positive", "negative", "positive", "positive"]

r = sklearn.metrics.confusion_matrix(y_true, y_pred)
print(r)

array([[1, 2],
       [1, 3]], dtype=int64)

Notez que l’ordre des métriques diffère de celui évoqué précédemment. Par exemple, la métrique True Positive se trouve dans le coin inférieur droit tandis que True Negative se trouve dans le coin supérieur gauche. Pour résoudre ce problème, nous pouvons retourner la matrice.

import numpy

r = numpy.flip(r)
print(r)

array([[3, 1],
       [2, 1]], dtype=int64)

Pour calculer la matrice de confusion pour un problème de classification multi-classe, la fonction multilabel_confusion_matrix() est utilisée, comme indiqué ci-dessous. En plus des paramètres y_true et y_pred, un troisième paramètre nommé labels accepte une liste des étiquettes de classe.

import sklearn.metrics
import numpy

y_true = ["Red", "Black", "Red",   "White", "White", "Red", "Black", "Red",   "White"]
y_pred = ["Red", "White", "Black", "White", "Red",   "Red", "Black", "White", "Red"]

r = sklearn.metrics.multilabel_confusion_matrix(y_true, y_pred, labels=["White", "Black", "Red"])
print(r)

array([
    [[4 2]
     [2 1]]

    [[6 1]
     [1 1]]

    [[3 2]
     [2 2]]], dtype=int64)

La fonction calcule la matrice de confusion pour chaque classe et renvoie toutes les matrices. L'ordre des matrices correspond à l'ordre des étiquettes dans le paramètre labels.  Pour ajuster l'ordre des métriques dans les matrices, nous utiliserons la fonction numpy.flip(), comme précédemment.

print(numpy.flip(r[0])) # White class confusion matrix
print(numpy.flip(r[1])) # Black class confusion matrix
print(numpy.flip(r[2])) # Red class confusion matrix
White class confusion matrix
[[1 2]
 [2 4]]
Black class confusion matrix
[[1 1]
 [1 6]]
Red class confusion matrix
[[2 2]
 [2 3]]

Dans le reste de ce didacticiel, nous nous concentrerons sur deux classes seulement. La section suivante traite de trois mesures clés calculées sur la base de la matrice de confusion.

Exactitude, précision et rappel

La matrice de confusion propose quatre métriques différentes et individuelles, comme nous l’avons déjà vu. Sur la base de ces quatre métriques, d'autres métriques peuvent être calculées qui offrent plus d'informations sur le comportement du modèle :

  1. Précision
  2. Précision
  3. Rappel

Les sous-sections suivantes traitent de chacune de ces trois mesures.

Précision

La précision est une mesure qui décrit généralement les performances du modèle dans toutes les classes. C’est utile lorsque toutes les classes sont d’égale importance. Il est calculé comme le rapport entre le nombre de prédictions correctes et le nombre total de prédictions.

Voici comment calculer la précision à l'aide de Scikit-learn, en fonction de la matrice de confusion précédemment calculée. La variable acc contient le résultat de la division de la somme des Vrais Positifs et des Vrais Négatifs sur la somme de toutes les valeurs de la matrice. Le résultat est 0,5714, ce qui signifie que le modèle est précis à 57,14 % pour effectuer une prédiction correcte.

import numpy
import sklearn.metrics

y_true = ["positive", "negative", "negative", "positive", "positive", "positive", "negative"]
y_pred = ["positive", "negative", "positive", "positive", "negative", "positive", "positive"]

r = sklearn.metrics.confusion_matrix(y_true, y_pred)

r = numpy.flip(r)

acc = (r[0][0] + r[-1][-1]) / numpy.sum(r)
print(acc)

0.571

Le module sklearn.metrics a une fonction appelée accuracy_score() qui peut également calculer la précision. Il accepte la vérité terrain et les étiquettes prédites comme arguments.

acc = sklearn.metrics.accuracy_score(y_true, y_pred)

Notez que la précision peut être trompeuse. Un cas est celui où les données sont déséquilibrées. Supposons qu'il y ait un total de 600 échantillons, dont 550 appartiennent à la classe Positive et seulement 50 à la classe Négative. Étant donné que la plupart des échantillons appartiennent à une classe, la précision de cette classe sera plus élevée que celle de l’autre.

Si le modèle a effectué un total de 530/550 prédictions correctes pour la classe Positive, contre seulement 5/50 pour la classe Négative, alors la précision totale est de (530 + 5)/600=0,8917. Cela signifie que le modèle est précis à 89,17 %. En gardant cela à l’esprit, vous pourriez penser que pour n’importe quel échantillon (quelle que soit sa classe), le modèle est susceptible de faire une prédiction correcte dans 89,17 % du temps. Ce n'est pas valable, surtout si l'on considère la classe Négative pour laquelle le modèle a mal fonctionné.

Précision

La précision est calculée comme le rapport entre le nombre d'échantillons positifs correctement classés et le nombre total d'échantillons classés comme positifs (que ce soit correctement ou incorrectement). La précision mesure l’exactitude du modèle dans la classification d’un échantillon comme positif.

Lorsque le modèle effectue de nombreuses classifications positives incorrectes, ou peu de classifications positives correctes, cela augmente le dénominateur et rend la précision faible. En revanche, la précision est élevée lorsque :

  1. Le modèle effectue de nombreuses classifications positives correctes (maximisez les vrais positifs).
  2. Le modèle effectue moins de classifications positives incorrectes (minimisez les faux positifs).

Imaginez un homme à qui les autres font confiance ; quand il prédit quelque chose, les autres le croient. La précision est à l'image de cet homme. Lorsque la précision est élevée, vous pouvez faire confiance au modèle lorsqu'il prédit un échantillon comme positif. Ainsi, la précision permet de savoir à quel point le modèle est précis lorsqu'il indique qu'un échantillon est positif.

Sur la base de la discussion précédente, voici une définition de la précision :

La précision reflète la fiabilité du modèle dans la classification des échantillons comme positifs.

Dans la figure suivante, la marque verte signifie qu'un échantillon est classé comme positif et une marque rouge signifie que l'échantillon est négatif. Le modèle a correctement classé deux échantillons positifs, mais a incorrectement classé un échantillon négatif comme positif. Ainsi, le taux de Vrais Positifs est de 2 et le taux de Faux Positifs est de 1, et la précision est de 2/(2+1)=0,667 . En d'autres termes, le pourcentage de confiance du modèle lorsqu'il indique qu'un échantillon est positif est de 66,7 %.

Le but de la précision est de classer tous les échantillons positifs comme positifs, et de ne pas classer à tort un échantillon négatif comme positif. D'après la figure suivante, si les trois échantillons positifs sont correctement classés mais qu'un échantillon négatif est mal classé, la précision est de 3/(3+ 1)=0,75. Ainsi, le modèle est précis à 75 % lorsqu’il indique qu’un échantillon est positif.

La seule façon d'obtenir une précision de 100 % est de classer tous les échantillons positifs comme positifs, en plus de ne pas classer à tort un échantillon négatif comme Positif.

Dans Scikit-learn, le module sklearn.metrics a une fonction nommée precision_score() qui accepte la vérité terrain et les étiquettes prédites et renvoie la précision. Le paramètre pos_label accepte le label de la classe Positive. La valeur par défaut est 1.

import sklearn.metrics

y_true = ["positive", "positive", "positive", "negative", "negative", "negative"]
y_pred = ["positive", "positive", "negative", "positive", "negative", "negative"]

precision = sklearn.metrics.precision_score(y_true, y_pred, pos_label="positive")
print(precision)

0.6666666666666666

Rappel

Le rappel est calculé comme le rapport entre le nombre d'échantillons positifs correctement classés comme positifs et le nombre total d'échantillons positifs. Le rappel mesure la capacité du modèle à détecter des échantillons positifs. Plus le rappel est élevé, plus les échantillons détectés sont positifs.

Le rappel ne concerne que la manière dont les échantillons positifs sont classés. Ceci est indépendant de la manière dont les échantillons négatifs sont classés, par ex. pour la précision. Lorsque le modèle classe tous les échantillons positifs comme positifs, le rappel sera de 100 % même si tous les échantillons négatifs ont été incorrectement classés comme positifs. Regardons quelques exemples.

Dans la figure suivante, il y a 4 cas différents (A à D) et tous ont le même rappel qui est 0.667. Chaque cas diffère uniquement par la façon dont les échantillons négatifs sont classés. Par exemple, dans le cas A, tous les échantillons négatifs sont correctement classés comme négatifs, mais dans le cas D, tous les échantillons négatifs sont correctement classés comme positifs. Quelle que soit la manière dont les échantillons négatifs sont classés, le rappel ne concerne que les échantillons positifs.

Sur les 4 cas présentés ci-dessus, seuls 2 échantillons positifs sont correctement classés comme positifs. Ainsi, le taux de Vrais Positifs est de 2. Le taux de Faux Négatifs est de 1 car un seul échantillon positif est classé comme négatif. En conséquence, le rappel est 2/(2+1)=2/3=0.667.

Peu importe que les échantillons négatifs soient classés comme positifs ou négatifs, il est préférable de négliger complètement les échantillons négatifs, comme le montre la figure suivante. Il vous suffit de prendre en compte les échantillons positifs lors du calcul du rappel.

Qu'est-ce que cela signifie lorsque le rappel est élevé ou faible ? Lorsque le rappel est élevé, cela signifie que le modèle peut classer correctement tous les échantillons positifs comme positifs. Ainsi, on peut faire confiance au modèle dans sa capacité à détecter des échantillons positifs.

Dans la figure suivante, le rappel est de 1,0 car tous les échantillons positifs ont été correctement classés comme positifs. Le taux de Vrais Positifs est de 3, et le taux de Faux Négatifs est de 0. Ainsi, le rappel est égal à 3/(3+0)=1.. Cela signifie que le modèle a détecté tous les échantillons positifs. Étant donné que le rappel néglige la façon dont les échantillons négatifs sont classés, il pourrait encore y avoir de nombreux échantillons négatifs classés comme positifs (c'est-à-dire un taux de faux positifs élevé). Le rappel n’en tient pas compte.

En revanche, le rappel est de 0,0 lorsqu'il ne parvient à détecter aucun échantillon positif. Dans la figure suivante, tous les échantillons positifs sont à tort classés comme négatifs. Cela signifie que le modèle a détecté 0 % des échantillons positifs. Le taux de Vrais Positifs est de 0, et le taux de Faux Négatifs est de 3. Ainsi, le rappel est égal à 0/(0+3)=0..

Lorsque le rappel a une valeur comprise entre 0,0 et 1,0, cette valeur reflète le pourcentage d'échantillons positifs que le modèle a correctement classés comme positifs. Par exemple, s'il y a 10 échantillons positifs et que le rappel est de 0,6, cela signifie que le modèle a correctement classé 60 % des échantillons positifs (c'est-à-dire que 0,6*10=6 les échantillons positifs sont correctement classés).

Semblable à la fonction precision_score(), la fonction recall_score() du module sklearn.metrics calcule le rappel. Le bloc de code suivant montre un exemple.

import sklearn.metrics

y_true = ["positive", "positive", "positive", "negative", "negative", "negative"]
y_pred = ["positive", "positive", "negative", "positive", "negative", "negative"]

recall = sklearn.metrics.recall_score(y_true, y_pred, pos_label="positive")
print(recall)

0.6666666666666666

Après avoir défini à la fois la précision et le rappel, faisons un petit récapitulatif :

  • La précision mesure la fiabilité du modèle dans la classification des échantillons positifs, et le rappel mesure le nombre d'échantillons positifs qui ont été correctement classés par le modèle.
  • La précision prend en compte la manière dont les échantillons positifs et négatifs ont été classés, mais le rappel ne prend en compte que les échantillons positifs dans ses calculs. En d’autres termes, la précision dépend à la fois des échantillons négatifs et positifs, mais le rappel dépend uniquement des échantillons positifs (et est indépendant des échantillons négatifs).
  • La précision prend en compte le moment où un échantillon est classé comme positif, mais elle ne se soucie pas de classer correctement tous les échantillons positifs. Le rappel se soucie de classer correctement tous les échantillons positifs, mais il ne se soucie pas de savoir si un échantillon négatif est classé comme positif.
  • Lorsqu'un modèle a un rappel élevé mais une faible précision, alors le modèle classe correctement la plupart des échantillons positifs mais il contient de nombreux faux positifs (c'est-à-dire qu'il classe de nombreux échantillons négatifs comme positifs). Lorsqu'un modèle a une haute précision mais un faible rappel, alors le modèle est précis lorsqu'il classe un échantillon comme positif mais il ne peut classer que quelques échantillons positifs.

Voici quelques questions pour tester votre compréhension :

  1. Si le rappel est de 1,0 et que l'ensemble de données contient 5 échantillons positifs, combien d'échantillons positifs ont été correctement classés par le modèle ? (5)
  2. Étant donné que le rappel est de 0,3 lorsque l'ensemble de données contient 30 échantillons positifs, combien d'échantillons positifs ont été correctement classés par le modèle ? (échantillons 0,3*30=9)
  3. Si le rappel est de 0,0 et que l'ensemble de données contient 14 échantillons positifs, combien d'échantillons positifs ont été correctement classés par le modèle ? (0)

Précision ou rappel ?

La décision d'utiliser la précision ou le rappel dépend du type de problème à résoudre. Si l’objectif est de détecter tous les échantillons positifs (sans se soucier de savoir si les échantillons négatifs seraient classés à tort comme positifs), alors utilisez le rappel. Utilisez la précision si le problème est sensible à la classification d'un échantillon comme positif en général, c'est-à-dire en incluant des échantillons négatifs qui ont été faussement classés comme positifs.

Imaginez que l'on vous donne une image et qu'on vous demande de détecter toutes les voitures qui s'y trouvent. Quelle métrique utilisez-vous ? Parce que le but est de détecter toutes les voitures, utilisez le rappel. Cela peut classer à tort certains objets comme des voitures, mais cela permettra finalement de détecter tous les objets cibles.

Supposons maintenant que l’on vous donne une image de mammographie et qu’on vous demande de détecter s’il y a un cancer ou non. Quelle métrique utilisez-vous ? Parce qu'il est sensible à l'identification incorrecte d'une image comme cancéreuse, nous devons en être sûrs lorsque nous classons une image comme positive (c'est-à-dire qu'elle a un cancer). La précision est donc la mesure privilégiée.

Conclusion

Ce tutoriel a abordé la matrice de confusion et comment calculer ses 4 métriques (vrai/faux positif/négatif) dans les problèmes de classification binaire et multiclasse. En utilisant le module metrics de Scikit-learn, nous avons vu comment calculer la matrice de confusion en Python.

Sur la base de ces 4 mesures, nous avons plongé dans une discussion sur l'exactitude, la précision et le rappel. Chaque métrique est définie sur la base de plusieurs exemples. Le module sklearn.metrics permet de calculer chacun d'eux.

Sur la base des concepts présentés ici, dans le prochain didacticiel, nous verrons comment utiliser la courbe précision-rappel, la précision moyenne et la précision moyenne moyenne (mAP).

Articles connexes: