Le machine learning en partant de zéro · Leçon 2.1 · 8 sur 33 leçons prêtes · 10 min
Classification : tracer une frontière
En bref
Un classifieur transforme des mesures en catégorie. La régression logistique donne une probabilité et une frontière, montrées sur deux espèces de manchots.
Échauffement Deux questions de leçons précédentes. Une minute, sans jamais bloquer la leçon.
En Antarctique, une biologiste mesure le bec et les nageoires d’un manchot. De quelle espèce s’agit-il ? C’est une autre sorte de question que « de combien la maladie va-t-elle progresser ? ». La réponse n’est pas un nombre sur une échelle, mais un choix entre des catégories. Les droites et les petits pas vers le bas des leçons précédentes peuvent-ils s’en charger ? Oui, avec une astuce bien trouvée.
Choisissez une réponse et votre degré de certitude.
Répondez pour débloquer le labo.
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,3
Au seuil 0,3 l’exactitude est de 98,6 % (3 erreurs), à 0,5 seulement 96,8 % (7 erreurs), à 0,9 92,2 % et à 0,1 90,4 %. Le seuil 0,5 n’a rien de sacré : le meilleur seuil dépend de la proportion des classes et de l’erreur qui coûte le plus cher.
À vous de jouer
- Regardez d’abord la frontière. Repérez les manchots situés du mauvais côté : ce sont les cas où le modèle se trompe même avec sa meilleure droite.
- Déplacez le curseur du seuil de probabilité vers une extrémité et regardez la frontière glisser vers l’une des espèces. Remarquez que la droite se déplace mais garde sa direction.
- Placez le seuil près d’un extrême et comptez comment les erreurs changent : une espèce n’est maintenant presque jamais manquée, au détriment de l’autre.
- Trouvez des manchots proches de la frontière et comparez-les avec des manchots éloignés. Lesquels vérifieriez-vous à la main ?
L’idée en quelques mots
Voyons maintenant ce que vous venez de manipuler, en termes simples.
Prédire une catégorie s’appelle la classification. Dans cette leçon, nous utilisons le jeu de données Palmer Penguins : 344 manchots de trois espèces, venant d’îles proches de la station Palmer en Antarctique, chacun avec des mesures du bec, des nageoires et du corps. Pour que tout tienne sur un plan, nous prenons deux espèces et deux mesures, si bien que chaque manchot est un point sur un plan – une mesure à l’horizontale, l’autre à la verticale – dont on connaît l’espèce.
Un classifieur doit couper ce plan en deux régions : « espèce A ici, espèce B là ». La ligne entre les régions est la frontière de décision. La régression logistique, malgré son nom, est un modèle de classification, et sa frontière est une droite.
L’astuce, c’est que la régression logistique ne répond pas seulement « A » ou « B ». Elle répond par une probabilité : « ce manchot appartient à l’espèce B avec une probabilité de 0,9 ». Pensez à la météo. La prévisionniste annonce « 80 % de risque de pluie », et c’est vous qui décidez si cela suffit pour prendre un parapluie. Le modèle joue la prévisionniste ; le seuil est votre règle du parapluie.
Pourquoi ça marche
Le modèle calcule d’abord un score, exactement comme la régression linéaire : une somme pondérée des variables plus une ordonnée à l’origine, z = w₁x₁ + w₂x₂ + b. Ce score peut prendre n’importe quelle valeur, alors on le comprime dans l’intervalle de 0 à 1 grâce à la fonction sigmoïde :
p = 1 / (1 + e^(−z))
Un grand score positif donne une probabilité proche de 1, un grand score négatif une probabilité proche de 0, et un score d’exactement zéro donne 0,5. Les manchots loin de la frontière reçoivent des probabilités assurées ; ceux qui en sont proches reçoivent des probabilités voisines de un demi – le modèle hésite, et il le dit.
Les poids sont appris par descente de gradient, comme dans la leçon 4, mais avec une autre perte. Au lieu de l’erreur quadratique, le modèle utilise la perte logistique (log loss, aussi appelée entropie croisée). Elle punit à peine une réponse juste et assurée, et punit très durement une réponse fausse et assurée. Cela pousse le modèle à n’être sûr de lui que lorsque les données le justifient.
Enfin, le seuil transforme la probabilité en décision : probabilité au-dessus du seuil → espèce B, en dessous → espèce A. La valeur habituelle est 0,5, mais rien ne l’impose. Déplacer le seuil déplace la frontière. Comme la probabilité dépend de la somme pondérée, chaque seuil correspond à une droite de même direction, simplement décalée : l’avis du modèle sur la direction dans laquelle les espèces diffèrent reste le même, seule change votre exigence de certitude.
Erreur fréquente
Deux erreurs sont courantes. La première consiste à prendre 0,5 pour une loi. Le seuil est une décision sur les coûts, pas une partie du modèle ; en médecine, on peut accepter beaucoup de fausses alertes pour manquer moins de cancers. La seconde consiste à lire la probabilité comme une certitude. Une probabilité de 0,97 signifie que le modèle s’attend à se tromper dans environ trois cas semblables sur cent – et seulement si les nouvelles données ressemblent aux données d’entraînement. Un manchot d’une population que le modèle n’a jamais vue peut recevoir une réponse assurée et fausse.
Une frontière qui classe correctement la plupart des manchots, cela semble bien, mais « la plupart » cache beaucoup de choses : quelles erreurs, combien, et de quelle gravité ? Dans la prochaine leçon, nous ouvrons la boîte des erreurs et apprenons à les compter correctement.
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.
À retenir
- La classification prédit une catégorie ; la frontière de décision sépare les régions de chaque classe.
- La régression logistique fait passer une somme pondérée par la sigmoïde pour obtenir une probabilité.
- Le seuil transforme une probabilité en décision ; c’est un choix sur les coûts, pas un 0,5 figé.
- Changer le seuil décale la frontière d’une régression logistique sans la faire pivoter.
Pour aller plus loin : formule, code, pratique
Les maths
Le modèle calcule un score z = w·x + b et le transforme en probabilité avec la sigmoïde, p = 1 / (1 + e^(−z)). Il est entraîné en minimisant la perte logistique L = −mean( y·ln p + (1 − y)·ln(1 − p) ), dont le gradient est simplement mean((p − y)·x) pour chaque poids.
- La prédiction est la classe 1 quand
p ≥ t. Comme la sigmoïde est croissante, c’est la même chose quez ≥ ln(t / (1 − t)). - Pour
t = 0.5, le membre de droite vaut 0, donc la frontière est la droitew·x + b = 0. Pourt = 0.3, il vaut−0.85: même direction, décalée vers la classe 0. wfixe la direction de la frontière.tne fait que la faire glisser.- Une réponse fausse mais sûre d’elle coûte cher avec la perte logistique, puisque
−ln pcroît sans limite quandptend vers 0.
En code (Python)
Le modèle du lab : Adelie contre manchot à jugulaire d’après la longueur et la hauteur du bec, standardisées, évalué sur les mêmes manchots à quatre seuils :
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
df = pd.read_csv("data/raw/penguins.csv")
df = df[df["species"].isin(["Adelie", "Chinstrap"])].dropna(subset=["bill_length_mm", "bill_depth_mm"])
X, y = df[["bill_length_mm", "bill_depth_mm"]], df["species"] == "Chinstrap"
model = make_pipeline(StandardScaler(), LogisticRegression()).fit(X, y)
p = model.predict_proba(X)[:, 1] # probabilité de manchot à jugulaire
for t in [0.1, 0.3, 0.5, 0.9]:
wrong = int(((p >= t) != y).sum()) # manchot à jugulaire quand p >= t
print(f"threshold {t}: {wrong} mistakes, accuracy {1 - wrong / len(y):.1%}")
Sortie
threshold 0.1: 21 mistakes, accuracy 90.4%
threshold 0.3: 3 mistakes, accuracy 98.6%
threshold 0.5: 7 mistakes, accuracy 96.8%
threshold 0.9: 17 mistakes, accuracy 92.2%
Le notebook lié sous la sortie télécharge lui-même les données. Le meilleur seuil ici est 0,3, pas le 0,5 par défaut.
Télécharger le notebook (.ipynb). Ouvrez-le dans Jupyter ou importez-le dans Google Colab ; il télécharge lui-même les données manquantes.
Pour les praticiens
predict()utilise toujours 0,5. Pour un autre seuil, prenezpredict_probaet comparez vous-même, comme ci-dessus, ou enveloppez le modèle dansFixedThresholdClassifier(seuil fixe) ouTunedThresholdClassifierCV(seuil choisi par validation croisée), tous deux dans scikit-learn 1.5 ou plus récent.- Choisissez le seuil sur des données de validation, pas sur les lignes dont vous rendez compte. Les 98,6 % ici sont mesurés sur les mêmes manchots que ceux sur lesquels le modèle a été ajusté, donc ils sont optimistes.
- Standardisez les variables.
LogisticRegressionapplique par défaut une régularisation L2 (C=1.0), et cette pénalité dépend de l’échelle de chaque variable. - Comparez l’exactitude à la référence de la classe majoritaire, et quand les classes sont déséquilibrées ou que les coûts diffèrent, regardez les deux types d’erreur séparément.
- Une probabilité ne vaut que ce que valent les données sur lesquelles elle a été ajustée. Pour un animal d’une autre population, une réponse assurée peut quand même être fausse.
Cela vous a-t-il aidé ?
Merci ! Cela nous aide à nous améliorer.
Aller plus loin dans l’Atlas
Articles de l’encyclopédie sur les notions de cette leçon :