Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Juger un modèle : précision et rappel

Après cette leçon: Je peux calculer la précision et le rappel d’un modèle à partir de sa matrice de confusion.

Leçon de 60 min1 commandeLab JupyterLab de science des données : pandas, Matplotlib et scikit-learn dans le navigateur

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

MotCe que ça veut dire
Matrice de confusionun tableau des vraies étiquettes face aux réponses
Faux positifun cas normal que le modèle signale à tort
Faux négatifun cas à trouver que le modèle laisse passer
Précisionla part des cas signalés qui sont vraiment à trouver
Rappella part des cas à trouver que le modèle a signalés
Jeu de testdes 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é spamLaissé normalTotal
Vraiment spam14 (vrais positifs)6 (faux négatifs)20
Vraiment normal2 (faux positifs)78 (vrais négatifs)80
Total1684100

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

MesureCalculValeur
Exactitude(14 + 78) divisé par 1000,92
Précision14 divisé par (14 + 2)0,875
Rappel14 divisé par (14 + 6)0,7

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Calculer les trois mesures

Code: python
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

Commande
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.

À propos de ce labo et de sa source: Lab JupyterLab de science des données : pandas, Matplotlib et scikit-learn dans le navigateur

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.