Comment juger un modèle de classification ?
Juger un modèle de classification, c’est mesurer à quel point ses réponses sont justes sur des données qu’il n’a jamais vues. L’exactitude seule ne suffit pas : un modèle peut sembler bon en se trompant sur les rares cas qui comptent.
La matrice de confusion, la précision et le rappel disent quelles erreurs sont faites.
À la fin de cette leçon
Remarque
Je peux calculer la précision et le rappel d’un modèle à partir de sa matrice de confusion.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Matrice de confusion | un tableau des vraies étiquettes face aux réponses |
| Faux positif | un cas normal que le modèle signale à tort |
| Faux négatif | un cas à trouver que le modèle laisse passer |
| Précision | la part des cas signalés qui sont vraiment à trouver |
| Rappel | la part des cas à trouver que le modèle a signalés |
| Jeu de test | des données gardées de côté pour juger le modèle |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une forte exactitude peut cacher un modèle inutile
Sur cent courriels, vingt sont des spams. Un « filtre » qui répond toujours « normal » ne trouve aucun spam. Pourtant il a raison 80 fois sur 100.
L’exactitude est la part des réponses justes. Elle ne dit rien des erreurs qui coûtent cher. Il faut compter chaque sorte d’erreur à part.
La matrice de confusion compte quatre cas
On choisit le cas à trouver, ici le spam : c’est le « positif ». Chaque courriel tombe dans une case.
Un vrai positif est un spam bien signalé. Un faux positif est un courriel normal signalé à tort. Un faux négatif est un spam laissé passer. Un vrai négatif est un courriel normal bien laissé.
Exemple travaillé : un filtre sur cent courriels
| Signalé spam | Laissé normal | Total | |
|---|---|---|---|
| Vraiment spam | 14 (vrais positifs) | 6 (faux négatifs) | 20 |
| Vraiment normal | 2 (faux positifs) | 78 (vrais négatifs) | 80 |
| Total | 16 | 84 | 100 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
La précision et le rappel posent deux questions
La précision demande : parmi les courriels signalés, quelle part est vraiment du spam ? Ici 14 sur 16.
Le rappel demande : parmi les vrais spams, quelle part le filtre a-t-il trouvée ? Ici 14 sur 20. Une précision basse fait perdre de bons courriels. Un rappel bas laisse entrer les spams.
Exemple travaillé : trois mesures du même filtre
| Mesure | Calcul | Valeur |
|---|---|---|
| Exactitude | (14 + 78) divisé par 100 | 0,92 |
| Précision | 14 divisé par (14 + 2) | 0,875 |
| Rappel | 14 divisé par (14 + 6) | 0,7 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Calculer les trois mesures
def mesures(vp, fp, fn, vn):
exactitude = (vp + vn) / (vp + fp + fn + vn)
if vp + fp == 0:
precision = 0
else:
precision = vp / (vp + fp)
if vp + fn == 0:
rappel = 0
else:
rappel = vp / (vp + fn)
print("exactitude", round(exactitude, 3))
print("précision", round(precision, 3))
print("rappel", round(rappel, 3))
# Le filtre de cent courriels dont vingt spams.
mesures(14, 2, 6, 78)
print("---")
# Un « filtre » qui répond toujours normal.
mesures(0, 0, 20, 80)
# Changez les quatre nombres du premier appel et relancez.
Une erreur fréquente
Attention
Beaucoup pensent qu’une exactitude de 80 % fait un bon modèle. Si 80 % des cas sont normaux, répondre toujours « normal » donne déjà 80 %. Regardez la précision et le rappel du cas rare, et comparez à la réponse paresseuse.
Un jeu de test donne un jugement honnête
Un modèle réglé sur certaines données paraît toujours bon sur elles. On en garde donc une partie de côté, le jeu de test, que le modèle ne voit jamais pendant son réglage.
Les mesures se calculent sur ce jeu. Elles disent alors comment le modèle se comportera sur des cas nouveaux.
Dans le labo, une règle jugée deux fois
Dans hires.csv, prenons la règle « si la température est de 15 degrés ou plus, le jour est plein » (300 locations ou plus). Elle n’est pas entraînée : imaginez qu’un élève l’ait réglée sur les jours qui ne sont pas dans le jeu de test.
La commande suivante prend un jour sur quatre, soit 92 jours, comme jeu de test. Elle affiche deux listes de quatre nombres : vrais positifs, faux positifs, faux négatifs, vrais négatifs. La première liste est pour les 92 jours, la seconde pour les 273 autres.
Compter les cas sur deux groupes de jours
docker exec jupyter python3 -c "import csv; L = list(csv.DictReader(open('hires.csv'))); f = lambda g: [sum(1 for r in g if float(r['temp_c']) >= 15 and int(r['hires']) >= 300), sum(1 for r in g if float(r['temp_c']) >= 15 and int(r['hires']) < 300), sum(1 for r in g if float(r['temp_c']) < 15 and int(r['hires']) >= 300), sum(1 for r in g if float(r['temp_c']) < 15 and int(r['hires']) < 300)]; print(f(L[::4]), f([r for n, r in enumerate(L) if n % 4 != 0]))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Pour aller plus loin
Dans votre carnet, changez le seuil de la règle de 15 à 12 degrés puis à 18 degrés. Refaites les quatre comptes sur le jeu de test.
Dites ce qui monte et ce qui baisse entre la précision et le rappel quand le seuil descend.