ML Atlas

Le machine learning en partant de zéro · Leçon 2.2 · 9 sur 33 leçons prêtes · 10 min

Évaluer un classifieur : au-delà de l’exactitude

En bref

L’exactitude cache le type d’erreurs d’un modèle. Matrice de confusion, précision et rappel révèlent le compromis créé par un seuil sur des données de tumeurs.

Échauffement Deux questions de leçons précédentes. Une minute, sans jamais bloquer la leçon.
De la leçon 2.1 : Classification : tracer une frontière Que produit la régression logistique avant qu’un seuil soit appliqué ?

Voir la réponse

Bonne réponse : Une probabilité entre 0 et 1 pour l’une des classes

La sigmoïde transforme la somme pondérée en probabilité, et le seuil transforme cette probabilité en décision.

De la leçon 1.6 : Descente de gradient : apprendre à petits pas La perte grimpe à chaque pas. Quelle est la cause la plus probable ?

Voir la réponse

Bonne réponse : Le taux d’apprentissage est trop grand, si bien que chaque pas dépasse le minimum

Avec un pas trop grand, les paramètres sautent chaque fois par-dessus la vallée vers un point plus haut, et l’erreur augmente.

Un détecteur de fumée qui ne sonne jamais ne se trompe jamais sur un faux incendie. Un détecteur qui hurle chaque fois que vous faites griller du pain ne rate jamais un vrai feu. Lequel est le meilleur ? Aucun des deux – et un seul chiffre d’exactitude ne vous dirait même pas lequel vous avez. Cette leçon apprend à compter les erreurs de façon à montrer leur nature, pas seulement leur nombre.

Prédisez, puis vérifiez Vous voulez détecter au moins 95 % des tumeurs malignes (rappel d’au moins 95 %). Quel est le seuil le plus élevé du curseur qui y parvient ?
Quel est votre degré de certitude ?

Labo interactif

Ce labo interactif fonctionne dans un navigateur avec JavaScript activé. Le texte qui l’entoure décrit ce qu’il montre.

Voir la réponse

Bonne réponse : 0,1

Au seuil 0,1 le rappel est de 96,9 % (62 des 64 tumeurs malignes détectées), à 0,2 seulement 92,2 % et à 0,5 82,8 %. Vous le payez en fausses alertes : 20 biopsies saines signalées comme malignes à 0,1 contre 3 à 0,5.

À vous de jouer

  • Déplacez le curseur du seuil vers la gauche. Regardez les faux négatifs de la matrice de confusion diminuer et les faux positifs augmenter, et le rappel et la précision partir dans des directions opposées.
  • Déplacez le curseur du seuil vers la droite et observez l’inverse. Gardez un œil sur l’exactitude : vous dit-elle quel type d’erreur vous commettez ?
  • Trouvez le seuil le plus élevé auquel aucune tumeur maligne n’est manquée. Lisez combien de tumeurs bénignes sont alors signalées à tort.
  • Choisissez le seuil que vous prendriez pour un test de dépistage, et dites en une phrase pourquoi.

L’idée en quelques mots

Voyons maintenant ce que vous venez de manipuler, en termes simples.

Revenons aux 569 tumeurs du sein de la leçon 1. Un modèle attribue un score à chaque tumeur : plus le score est élevé, plus la tumeur a de chances d’être maligne. Un seuil transforme le score en décision. Chaque décision tombe alors dans l’une de quatre cases :

prédite maligneprédite bénigne
réellement malignevrai positif (VP)faux négatif (FN)
réellement bénignefaux positif (FP)vrai négatif (VN)

Ce tableau est la matrice de confusion. La diagonale contient les décisions correctes. Les deux autres cases contiennent deux sortes d’erreurs très différentes : un faux positif est une fausse alerte (une patiente en bonne santé envoyée faire d’autres examens), un faux négatif est un oubli (un cancer renvoyé à la maison).

Le détecteur de fumée résume tout. Le détecteur muet n’a aucun faux positif et une foule de faux négatifs. Le détecteur à tartines, c’est l’inverse. Un bon détecteur équilibre les deux selon ce que coûte chaque erreur.

Pourquoi ça marche

Deux nombres résument la matrice bien mieux que l’exactitude :

précision = VP / (VP + FP) rappel = VP / (VP + FN)

Le rappel (sensibilité) répond à la question : parmi toutes les tumeurs malignes, quelle part avons-nous détectée ? La précision répond : parmi toutes les tumeurs que nous avons déclarées malignes, quelle part l’était vraiment ? Le rappel, c’est ne rien manquer ; la précision, c’est ne pas crier au loup.

Le seuil règle le compromis entre les deux. Baissez-le et davantage de tumeurs sont signalées comme malignes : vous détectez plus de cancers (le rappel monte), mais vous signalez aussi plus de tumeurs bénignes (la précision baisse en général). Montez-le et c’est l’inverse. Aucun seuil ne peut maximiser les deux, à moins que le modèle ne sépare parfaitement les classes. Choisir un seuil n’est donc pas un détail technique, mais une décision de valeurs : combien de fausses alertes êtes-vous prêt à accepter pour éviter un cancer manqué ?

L’exactitude mélange les quatre cases en un seul nombre et masque ce choix. Elle masque aussi le déséquilibre des classes. Comme 357 des 569 tumeurs sont bénignes, un modèle qui déclare tout bénin a raison dans près des deux tiers des cas tout en ne détectant aucun cancer – un rappel de zéro. C’est le paradoxe de l’exactitude : un modèle peut paraître correct selon l’exactitude et être inutile pour ce à quoi il était destiné.

Erreur fréquente

L’erreur la plus courante est de ne rapporter que l’exactitude, surtout sur des données déséquilibrées où une classe est bien plus rare que l’autre. La deuxième est de garder le seuil par défaut de 0,5 sans se demander ce que coûtent les erreurs. Un test de dépistage, où un oubli peut être fatal et une fausse alerte signifie un examen de plus, devrait généralement avoir un seuil plus bas qu’un test qui déclenche une opération. Un troisième piège est de confondre précision et rappel ; retenir les questions auxquelles ils répondent – « parmi ceux que j’ai signalés » contre « parmi ceux qui existent » – aide davantage que d’apprendre les formules par cœur.

Jusqu’ici, nous avons noté les modèles sur un jeu de test fixe. Mais un modèle peut briller sur les données dont il a appris et échouer sur tout le reste. Dans la prochaine leçon, nous provoquons cela exprès : le surapprentissage.

Trouvez l’erreur de l’IA

Voici la réponse d’un chatbot. Une phrase est fausse. Laquelle ?

Question : Au seuil 0,1, mon classifieur de tumeurs détecte 62 des 64 tumeurs malignes, mais il en signale aussi 20 bénignes. Comment dois-je interpréter cela ?

Réponse du chatbot

Montrer la phrase fausse

La phrase fausse : Et comme la précision est la part de toutes les tumeurs malignes que le modèle détecte, elle est tout aussi élevée ici.

C’est la définition du rappel. La précision répond à l’autre question – parmi les tumeurs signalées, combien sont réellement malignes – et au seuil 0,1 les 20 fausses alertes la tirent vers le bas, alors qu’à 0,5 il n’y en a que 3.

Quiz

Trois questions pour vérifier vos acquis. Choisissez une réponse ou dépliez la solution sous chaque question. Au clavier : les flèches choisissent, Entrée ou Espace valide.

1. Un modèle de dépistage manque beaucoup de cancers mais ne déclenche presque jamais de fausse alerte. Quel nombre est bas ?
Voir la réponse

Bonne réponse : Le rappel, soit la part de cancers détectés

Le rappel est la part des vrais positifs qui ont été détectés, donc beaucoup d’oublis signifient un rappel bas.

2. Vous baissez le seuil de décision. Que se passe-t-il généralement ?
Voir la réponse

Bonne réponse : Le rappel monte et la précision baisse

Un seuil plus bas signale davantage de cas comme positifs : on détecte plus de vrais positifs, mais on ajoute aussi des faux positifs.

3. Pourquoi l’exactitude peut-elle être trompeuse sur les données de tumeurs ?
Voir la réponse

Bonne réponse : Les tumeurs bénignes dominent : un modèle peut bien noter en manquant chaque cancer

Avec des classes déséquilibrées, la réponse majoritaire suffit à produire une exactitude honorable et un rappel nul.

À retenir

  • La matrice de confusion répartit les décisions en vrais et faux positifs et négatifs.
  • Le rappel est la part des vrais positifs détectés ; la précision est la part des cas signalés qui sont réels.
  • Le seuil échange du rappel contre de la précision, et le bon équilibre dépend du coût de chaque erreur.
  • L’exactitude masque le type d’erreurs et peut paraître bonne sur des données déséquilibrées tout en manquant chaque positif.

Pour aller plus loin : formule, code, pratique

Les maths

Un seuil t transforme un score en décision : prédire maligne quand score ≥ t. Compter les quatre cases donne les mesures :

  • accuracy = (TP + TN) / n, la part de toutes les décisions qui sont justes ;
  • precision = TP / (TP + FP), la part des alertes qui sont réelles ;
  • recall = TP / (TP + FN), la part des vrais cas qui ont été détectés ;
  • F1 = 2 · precision · recall / (precision + recall), la moyenne harmonique des deux, qui reste basse si l’une des deux est basse.

Abaisser t ne peut qu’ajouter des alertes, donc TP et FP ne baissent jamais et FN ne monte jamais. C’est pourquoi le rappel ne baisse jamais quand t descend, alors que la précision baisse en général. Un modèle qui répond toujours « bénigne » a TP = 0, donc un rappel de 0, et son exactitude est simplement la part de la classe majoritaire : 357 / 569.

En code (Python)

Les 569 tumeurs de la leçon, avec les 10 variables « mean » du lab, une régression logistique avec mise à l’échelle et un découpage de test stratifié à 30 % (171 biopsies, random_state=1). Les comptes propres au lab (TP / FN / FP) sont 53 / 11 / 3 au seuil 0,5 et 62 / 2 / 20 à 0,1. Ce découpage n’est pas celui du lab, donc les comptes diffèrent un peu :

from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

X, b = load_breast_cancer(return_X_y=True, as_frame=True)
X = X.filter(like="mean ")  # les 10 variables « mean », comme dans le lab
y = 1 - b  # dans sklearn 0 = maligne ; on inverse pour que 1 = maligne
print(f"tumours {len(y)}, benign {(y == 0).sum()}, always-benign accuracy {(y == 0).mean():.3f}")
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, stratify=y, random_state=1)
score = make_pipeline(StandardScaler(), LogisticRegression()).fit(Xtr, ytr).predict_proba(Xte)[:, 1]
for t in (0.5, 0.1):
    flag = score >= t
    tp, fp, fn = (flag & (yte == 1)).sum(), (flag & (yte == 0)).sum(), (~flag & (yte == 1)).sum()
    print(f"t={t}: TP {tp} FN {fn} FP {fp} precision {tp / (tp + fp):.3f} recall {tp / (tp + fn):.3f}")

Sortie

tumours 569, benign 357, always-benign accuracy 0.627
t=0.5: TP 53 FN 11 FP 2 precision 0.964 recall 0.828
t=0.1: TP 61 FN 3 FP 13 precision 0.824 recall 0.953

À 0,5, le rappel est ici de 0,828, comme dans le lab, mais à 0,1 il est de 0,953 contre 96,9 % dans le lab, et les fausses alertes sont 13 au lieu de 20. Le rappel varie d’un découpage à l’autre, ce qui est tout l’objet de la leçon 2. Abaisser le seuil de 0,5 à 0,1 augmente quand même le rappel et diminue la précision, comme le dit la leçon. La référence « toujours bénigne » a l’air correcte du point de vue de l’exactitude et ne détecte aucun cancer.

Pour les praticiens
  • Donnez la précision et le rappel (ou toute la matrice de confusion) à côté de l’exactitude, et dites toujours quelle classe est « positive ».
  • Choisissez le seuil sur des données de validation, d’après le coût de chaque erreur, pas par habitude. Le 0,5 par défaut n’est qu’une convention.
  • Calculez toujours la référence qui prédit la classe majoritaire. Si votre exactitude en est proche, le modèle a peu appris.
  • Le rappel et la précision à un seuil ne sont qu’un point d’une courbe. Pour comparer deux modèles équitablement, comparez-les au même rappel ou regardez toute la courbe précision-rappel.
  • Un score n’est qu’un classement tant qu’il n’est pas calibré. Ne lisez pas 0,3 comme « 30 % de chances » sans vérifier la calibration.

Aller plus loin dans l’Atlas

Articles de l’encyclopédie sur les notions de cette leçon :