Qu’est-ce que le surapprentissage ?
Le surapprentissage (overfitting en anglais) arrive quand un modèle apprend ses exemples par cœur au lieu d’apprendre la règle. Il paraît excellent sur les données d’entraînement et se trompe sur les données nouvelles. Il faut donc savoir le repérer et le réduire.
C’est l’élève qui apprend par cœur les corrigés : il réussit ces exercices, puis échoue au contrôle.
À la fin de cette leçon
Remarque
Je peux repérer le surapprentissage d’un réseau et le réduire.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Surapprentissage | un modèle qui réussit ses exemples et échoue sur des données nouvelles | |
| Jeu d’entraînement | les données qui servent à régler les poids | |
| Jeu de validation | des données gardées pour surveiller l’entraînement | |
| Jeu de test | des données gardées pour la note finale | |
| Arrêt précoce | arrêter l’entraînement quand la validation ne progresse plus | |
| Patience | le nombre d’époques sans progrès qu’on accepte | 2 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Trois jeux de données pour trois usages
On découpe les données avant d’entraîner. Le jeu d’entraînement règle les poids. Le jeu de validation surveille l’entraînement et sert à choisir les réglages.
Le jeu de test reste fermé jusqu’à la fin. On l’ouvre une seule fois, pour la note finale. Si on s’en sert pour choisir, il n’est plus neuf.
Exemple travaillé : découper 365 jours
| Jeu | Part | Jours | Rôle |
|---|---|---|---|
| Entraînement | 60 % | 219 | Régler les poids |
| Validation | 20 % | 73 | Surveiller et choisir |
| Test | 20 % | 73 | Note finale, une seule fois |
| Total | 100 % | 365 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Deux courbes qui s’écartent signalent le surapprentissage
À chaque époque, on note la perte sur l’entraînement et la perte sur la validation. Au début, les deux baissent ensemble.
Puis la perte d’entraînement continue de baisser, alors que celle de validation remonte. L’écart grandit. Le réseau apprend le bruit des exemples, plus la règle.
Exemple travaillé : six époques
| Époque | Perte d’entraînement | Perte de validation | Écart |
|---|---|---|---|
| 1 | 9 | 9,5 | 0,5 |
| 2 | 6 | 6,8 | 0,8 |
| 3 | 4 | 5,2 | 1,2 |
| 4 | 3 | 5,0 | 2,0 |
| 5 | 2,5 | 5,6 | 3,1 |
| 6 | 2,2 | 6,4 | 4,2 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Les écarts des six époques
docker exec jupyter python3 -c "t = [9, 6, 4, 3, 2.5, 2.2]; v = [9.5, 6.8, 5.2, 5.0, 5.6, 6.4]; print([round(b - a, 1) for a, b in zip(t, v)])"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.
L’époque de la plus petite validation
docker exec jupyter python3 -c "v = [9.5, 6.8, 5.2, 5.0, 5.6, 6.4]; print(v.index(min(v)) + 1)"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.
Une erreur fréquente
Attention
Beaucoup gardent le réseau de la dernière époque, parce que la perte d’entraînement y est la plus basse. C’est celui qui a vu les exemples le plus longtemps. Gardez celui de la meilleure perte de validation.
L’arrêt précoce coupe l’entraînement au bon moment
On ne sait pas à l’avance quelle époque sera la meilleure. L’arrêt précoce surveille la perte de validation à chaque époque.
On fixe une patience, par exemple 2. L’entraînement s’arrête après 2 époques de suite sans nouveau record. On garde alors les poids de la meilleure époque.
Exemple travaillé : une patience de 2
| Époque | Perte de validation | Meilleure jusque-là | Époques sans progrès |
|---|---|---|---|
| 1 | 2,0 | 2,0 | 0 |
| 2 | 1,5 | 1,5 | 0 |
| 3 | 1,25 | 1,25 | 0 |
| 4 | 1,0 | 1,0 | 0 |
| 5 | 1,25 | 1,0 | 1 |
| 6 | 1,5 | 1,0 | 2, on s’arrête |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Trouver la meilleure époque en Python
# La perte de validation de six époques.
validation = [9.5, 6.8, 5.2, 5.0, 5.6, 6.4]
meilleure = 1
for numero in range(1, len(validation) + 1):
if validation[numero - 1] < validation[meilleure - 1]:
meilleure = numero
print("meilleure époque :", meilleure)
print("perte de validation à ce moment :", validation[meilleure - 1])
# Remplacez le dernier nombre par 4.0, puis relancez.
# Quelle est maintenant la meilleure époque ?
D’autres moyens de réduire le surapprentissage
L’arrêt précoce n’est pas le seul moyen. Le tableau ci-dessous en donne quatre autres.
Aucun ne marche toujours. On les essaie un par un, et on juge chaque essai sur la perte de validation.
Quatre moyens de réduire le surapprentissage
| Moyen | Idée | Ce qu’il coûte |
|---|---|---|
| Plus de données | Le réseau voit plus de cas différents | Des données à trouver |
| Un réseau plus petit | Moins de poids, moins de place pour le bruit | Un risque de sous-apprentissage |
| Le dropout | On éteint des neurones au hasard à chaque pas | Un entraînement plus long |
| La régularisation | On pénalise les grands poids | Un réglage de plus à choisir |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Dans votre carnet : l’arrêt précoce
import pandas as pd
from sklearn.neural_network import MLPClassifier
jours = pd.read_csv("hires.csv")
entrees = jours[["temp_c", "rain_mm"]]
chargees = jours["hires"] >= 300
# 20 % des jours sont gardés pour la validation, et l’arrêt vient après 10 époques sans progrès.
reseau = MLPClassifier(hidden_layer_sizes=(16,), max_iter=500, early_stopping=True,
validation_fraction=0.2, n_iter_no_change=10, random_state=0)
reseau.fit(entrees, chargees)
print("époques faites :", reseau.n_iter_)
print("meilleure exactitude de validation :", round(reseau.best_validation_score_, 3))
# Comparez les époques faites avec max_iter, qui vaut 500.