Le machine learning en partant de zéro · Leçon 0.1 · 1 sur 33 leçons prêtes · 15 min
Tout le processus en 15 minutes, du début à la fin
En bref
Le parcours complet d’un projet de machine learning sur un seul jeu de données, de la question à l’évaluation. Sans référence, un score ne dit rien.
Avant d’apprendre les morceaux, regardez la partie entière. C’est ainsi qu’on apprend le football : d’abord un match, ensuite les exercices de passe. Dans cette leçon, vous parcourez un projet complet de machine learning en un quart d’heure, sur un seul jeu de données : des manchots de trois espèces, mesurés par des chercheurs sur des îles au large de l’Antarctique. Chaque module suivant du cours ouvre l’une des six étapes que vous voyez ici d’un coup.
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 : Presque tous, plus de 9 sur 10
Deux questions en reconnaissent 98 sur 103 (95,1 %), une question 81 (78,6 %). Deviner tout simplement, « toujours Adelie », sans aucun modèle, réussit 45 fois (43,7 %), et c’est cela qui dit si 95,1 % est beaucoup. Une troisième question n’aide pas : 96 sur 103 (93,2 %).
À vous de jouer
- Choisissez 0 question. C’est deviner sans modèle : à combien de manchots « toujours Adelie » convient-il ?
- Passez à 1, puis à 2 questions. Lisez les questions de l’arbre sous le graphique : sur quelles mensurations porte-t-il ?
- Avec 2 questions, déplacez le curseur du découpage. Y a-t-il un découpage où l’avance sur le hasard disparaît ?
- Revenez au découpage 1 et choisissez 3 questions. Une question de plus aide-t-elle toujours ?
Une fois que vous l’avez vérifié dans le lab, nommons les étapes que vous venez de parcourir.
L’idée en quelques mots
Tout projet de machine learning, des manchots à la détection de fraude dans une banque, passe par les mêmes six étapes :
- Question. Que prédisez-vous exactement, et à partir de quoi ? Ici : l’espèce d’un manchot à partir de quatre mensurations. Une bonne question se vérifie, car nous connaissons la vraie espèce.
- Données. Le fichier contient 344 manchots, mais 2 n’ont aucune mesure, il en reste donc 342. Le sexe manque dans 11 lignes. Si l’on supprimait toute ligne ayant un trou, il en resterait 333, mais nous n’utilisons pas le sexe ici, donc nous ne perdons que ces 2.
- Découpage. 103 manchots, soit 30 %, sont cachés au modèle. Le modèle apprend sur les 239 autres, et on ne le teste que sur les manchots cachés. La partie pour apprendre est le jeu d’entraînement, la partie cachée le jeu de test.
- Référence. Avant de construire un modèle, comptez ce que donne une réponse sans réfléchir. Parmi les manchots d’apprentissage, Adelie est le plus fréquent, donc « toujours Adelie » trouve 45 des 103 manchots de test : 43,7 %.
- Modèle. Un arbre de décision est une suite de questions oui/non. Avec deux questions, il interroge d’abord la nageoire (jusqu’à 207 mm ou plus longue), puis la longueur ou la hauteur du bec.
- Évaluation. L’arbre en reconnaît 98 sur 103, soit 95,1 % : 51,5 points de plus que deviner.
Les modules suivants du cours ouvrent ces étapes une à une : comment un modèle apprend à partir d’exemples et à quoi le comparer (module 1), comment mesurer un résultat (module 2), si le résultat résiste à de nouvelles données (module 3), ce qui abîme les données (module 4), quels modèles choisir (module 5) et ce qui arrive à un modèle dans le monde réel (module 6).
Jak to policzono
- Données : Palmer Penguins (Gorman, Williams et Fraser, 2014 ; paquet palmerpenguins : Horst, Hill et Gorman, 2020), licence CC0. 344 manchots dans le fichier, 342 avec les quatre mesures.
- Découpage : 70/30 avec le même mélange d’espèces dans les deux parties ; le découpage 1 est le même que
train_test_split(test_size=0.3, stratify=y, random_state=1)dans scikit-learn. - Modèle : arbre de décision (CART, indice de Gini), au plus 1, 2 ou 3 questions sur chaque chemin.
- Référence : l’espèce la plus fréquente parmi les manchots d’apprentissage.
Pourquoi ça marche
Le score sur les manchots cachés a un sens parce que le modèle ne les a pas vus. Testé sur les manchots d’apprentissage, il pourrait simplement se souvenir des réponses. C’est pourquoi l’arbre à trois questions obtient 97,5 % sur les manchots d’apprentissage, mais seulement 93,2 % sur les cachés, moins que l’arbre à deux questions. La troisième question a commencé à apprendre des manchots individuels au lieu d’une règle. C’est le surapprentissage, le sujet du module 3.
L’arbre réussit si bien parce que les espèces ont vraiment des corps différents. Les Gentoo ont de longues nageoires, donc la première question les sépare presque : parmi les manchots d’apprentissage dont la nageoire dépasse 207 mm, 85 sur 91 sont des Gentoo. Parmi les nageoires plus courtes, un long bec trahit un Chinstrap et un bec court un Adelie : dans le groupe à nageoire jusqu’à 207 mm et bec jusqu’à 43,4 mm, 101 manchots d’apprentissage sur 103 sont des Adelie.
Une référence est nécessaire parce que l’exactitude dépend de la tâche. Avec trois espèces, lancer un dé tomberait juste une fois sur trois, et « toujours l’espèce la plus fréquente » réussit 43,7 % du temps. Un modèle n’a de sens que s’il bat nettement cette réponse simple.
Un découpage est un tirage. Sur 20 découpages dans le lab, deux questions reconnaissent entre 94 et 100 des 103 manchots (de 91,3 % à 97,1 %), et deviner obtient 43,7 % à chaque fois. L’avance reste, même si le nombre exact change.
Erreur fréquente
Vrai ou faux : « 95 % d’exactitude, c’est un excellent résultat ». Faux, ou plutôt : le nombre seul ne le dit pas. L’exactitude dépend des proportions des classes et de la facilité de la tâche. Ici, deviner donne 43,7 %, donc 95,1 % est une énorme amélioration. Mais quand 95 courriels sur 100 sont des messages ordinaires, un filtre qui ne fait rien et laisse passer tous les courriels a lui aussi 95 % d’exactitude et n’attrape aucun spam. D’abord la référence, ensuite l’enthousiasme.
Là où l’analogie s’arrête : un match de football a une fin, et un projet va rarement en ligne droite. Après l’évaluation, on revient souvent à la question ou aux données, parce que le score a montré ce qui manque.
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
- Tout projet de machine learning passe par les mêmes étapes : question, données, découpage, référence, modèle et évaluation.
- Un modèle se juge sur des données qu’il n’a pas vues ; le score sur les données d’apprentissage est gonflé.
- Un nombre sans référence ne dit rien : 95,1 %, c’est beaucoup, parce que deviner donne 43,7 %.
- Un découpage est un tirage : vérifiez donc le score sur plusieurs découpages.
Pour aller plus loin : formule, code, pratique
Les maths
L’exactitude est la part de réponses correctes : exactitude = correctes / toutes. Deviner « toujours Adelie » donne 45 / 103 ≈ 0,437, et l’arbre à deux questions 98 / 103 ≈ 0,951. La différence vaut 98 / 103 − 45 / 103 = 53 / 103 ≈ 0,515, soit 51,5 points.
La réponse « toujours la classe la plus fréquente » a une exactitude égale à la part de cette classe dans le jeu de test. Les Adelie sont 151 manchots sur 342 (44,2 %) ; le découpage garde le mélange d’espèces, donc le test en contient 45 sur 103. Choisir au hasard une des trois espèces tomberait juste en moyenne 1 / 3 ≈ 33,3 % du temps.
Un arbre de profondeur d découpe les données en au plus 2^d groupes : avec 2 questions, cela fait 4 groupes, et chacun prédit l’espèce qui y domine parmi les manchots d’apprentissage.
En code (Python)
La même expérience dans scikit-learn : le découpage 1 du lab, la référence, des arbres de profondeur 1 à 3 et l’arbre à deux questions sur 100 découpages différents. Le notebook lié sous la sortie télécharge lui-même les données.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
df = pd.read_csv("data/raw/penguins.csv")
cols = ["bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g"]
d = df.dropna(subset=cols) # seulement les manchots avec toutes les mesures
print(f"penguins {len(df)}, with measurements {len(d)}, without any gap {len(df.dropna())}")
X, y = d[cols], d["species"]
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, stratify=y, random_state=1)
guess = ytr.value_counts().idxmax() # référence : l'espèce la plus fréquente à l'apprentissage
print(f"train {len(Xtr)}, test {len(Xte)}; always {guess}: {(yte == guess).sum()} of {len(yte)} = {(yte == guess).mean():.3f}")
for depth in (1, 2, 3):
tree = DecisionTreeClassifier(max_depth=depth, random_state=0).fit(Xtr, ytr)
print(f"depth {depth}: {(tree.predict(Xte) == yte).sum()} of {len(yte)} = {tree.score(Xte, yte):.3f} (train {tree.score(Xtr, ytr):.3f})")
scores = []
for seed in range(100): # 100 découpages aléatoires différents
a, b, c, e = train_test_split(X, y, test_size=0.3, stratify=y, random_state=seed)
scores.append(DecisionTreeClassifier(max_depth=2, random_state=0).fit(a, c).score(b, e))
print(f"depth 2 on 100 splits: mean {sum(scores) / 100:.3f}, min {min(scores):.3f}, max {max(scores):.3f}")
Sortie
penguins 344, with measurements 342, without any gap 333
train 239, test 103; always Adelie: 45 of 103 = 0.437
depth 1: 81 of 103 = 0.786 (train 0.791)
depth 2: 98 of 103 = 0.951 (train 0.967)
depth 3: 96 of 103 = 0.932 (train 0.975)
depth 2 on 100 splits: mean 0.949, min 0.883, max 0.990
Sur le découpage 1, les résultats sont les mêmes que dans le lab. Sur 100 autres découpages, l’arbre à deux questions réussit en moyenne 94,9 %, au pire 88,3 %, au mieux 99,0 %, et deviner obtient 43,7 % à chaque fois.
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
- Commencez toujours par une référence. Dans scikit-learn,
DummyClassifier(strategy="most_frequent")s’en charge ; en régression, la moyenne. - Cachez le jeu de test dès le départ et ne le regardez pas pendant que vous choisissez un modèle. Pour choisir, il y a la validation (module 3).
- Quand les classes ont des tailles différentes, découpez avec stratification (
stratify=y) pour que les deux parties gardent les mêmes proportions. - Donnez le score de plusieurs découpages ou d’une validation croisée, pas un seul nombre issu d’un seul tirage.
- Notez la graine aléatoire (
random_state) pour que d’autres puissent reproduire le résultat, et vérifiez la licence des données avant de les utiliser.
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 :