Menu
CoddyTech

Précision et rappel

Fait partie de la section Apprentissage supervisé du Journey Machine Learning de Coddy. Leçon 22 sur 58.

Deux questions évaluent les réponses d’un test à la grippe. Parmi ses alertes à la grippe, combien étaient correctes ? Parmi les cas réels de grippe, combien en a-t-il détectés ?

La matrice de confusion du test de dépistage de la grippe, représentée deux fois. À gauche, intitulée Précision 42 / 45 = 0.933, la colonne « grippe annoncée » est mise en évidence : 3 fausses alertes et 42 cas détectés. À droite, intitulée Rappel 42 / 47 = 0.894, la ligne « grippe » est mise en évidence : 5 cas manqués et 42 cas détectés

La précision répond à la première question : 42 alarmes sur 45. Le rappel répond à la seconde : 42 cas sur 47.

from sklearn.metrics import precision_score, recall_score

print(f"{precision_score(y_test, pred):.3f}")
print(f"{recall_score(y_test, pred):.3f}")

:.3f affiche toujours 3 décimales, donc 0.9 afficherait 0.900. Cela affiche :

0.933
0.894

Choisis en fonction de l’erreur la plus coûteuse. Un cas de grippe non détecté se propage, donc ce test a besoin d’un rappel élevé. Un filtre anti-spam qui classe les vrais courriels comme indésirables a besoin de précision.

challenge icon

Défi

Moyen

Le filtre d’une boutique masque les avis qui semblent faux. Le code de départ crée deux versions à partir d’un même modèle, strict_pred et eager_pred, et lit quelle erreur est la plus pénalisante : missed (un faux avis reste visible) ou hidden (un vrai avis disparaît).

  1. Affiche la précision et le rappel de chaque filtre, avec 3 décimales.
  2. Affiche le filtre qui commet le moins cette erreur, comme ci-dessous (pour missed : Fewer fakes missed: ...).

Pour une autre boutique et hidden :

Strict: precision 0.900, recall 0.450
Eager: precision 0.640, recall 0.800
Fewer real reviews hidden: strict

Essayez vous-même

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_score, recall_score

# Quelle erreur est la plus préjudiciable : missed (un faux avis reste visible) ou hidden (un véritable avis est masqué) ?
worse = input()

# Une ligne par avis : 1 dans fake signifie que l’avis a été rédigé sur commande
reviews = pd.read_csv("reviews.csv")
features = ["words", "exclamations", "account_days", "user_reviews", "stars", "photo"]
X_train, X_test, y_train, y_test = train_test_split(reviews[features], reviews["fake"], test_size=0.25, random_state=0)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
proba = model.predict_proba(X_test)[:, 1]

# Deux filtres issus du même modèle : strict masque un avis dès que la probabilité qu’il soit faux atteint 0.7, eager dès 0.3
strict_pred = proba >= 0.7
eager_pred = proba >= 0.3

# Écrivez votre code ci-dessous
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Apprentissage supervisé

Entraînez-vous par vous-même : Compilateur Python en ligne