ML Atlas

Le machine learning en partant de zéro · Leçon 3.3 · 16 sur 33 leçons prêtes · 12 min

Courbes d’apprentissage : données ou meilleur modèle ?

En bref

Les courbes d’apprentissage montrent le score en entraînement et en validation quand les données croissent. Leur forme dit : collecter ou changer de modèle.

Échauffement Deux questions de leçons précédentes. Une minute, sans jamais bloquer la leçon.
De la leçon 3.2 : Validation et validation croisée Pourquoi normaliser les variables sur toutes les lignes avant la validation croisée est-il une erreur ?

Voir la réponse

Bonne réponse : Des infos des plis de validation fuient dans l’entraînement : scores trop optimistes

Toute étape qui apprend à partir des données doit être ajustée sur les seuls plis d’entraînement, sinon les plis de validation ne sont plus inédits.

De la leçon 3.1 : Surapprentissage : quand un modèle apprend par cœur Quand le degré du polynôme augmente, qu’arrive-t-il à l’erreur d’entraînement ?

Voir la réponse

Bonne réponse : Elle baisse ou reste stable : une courbe plus souple peut copier une courbe plus simple

Un polynôme de degré supérieur contient tous ceux de degré inférieur comme cas particuliers, il ne peut donc jamais ajuster moins bien les points d’entraînement.

Dans la leçon 3.1, le modèle était trop simple ou trop complexe, avec la même quantité de données. Aujourd’hui, vous changez la quantité de données. C’est une question de tous les jours en pratique : le modèle est moyen, faut-il collecter plus d’exemples ou changer de modèle ? La réponse vient d’une courbe d’apprentissage : le score en entraînement et en validation, tracé pour un ensemble d’entraînement de plus en plus grand.

Prédisez, puis vérifiez Une régression logistique apprend à reconnaître des chiffres manuscrits à partir de 50 images. Sur ces 50 images, elle a 100 % de bonnes réponses. Quelle exactitude a-t-elle à peu près sur de nouveaux chiffres de validation ?
Quel est votre degré de certitude ?

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 : Environ 82 %, soit plus de dix points de moins qu’en entraînement

La validation donne 82,3 % (moyenne de 5 tirages de 50 images), donc l’écart est de 17,7 points. Sur tout l’entraînement, 1438 images, la validation monte à 95,8 % et l’écart tombe à 2,2 points. Avec peu de données, 100 % en entraînement, c’est surtout de la mémoire.

À vous de jouer

  • Avec le modèle détaillé, faites glisser le curseur de 50 à 1438 images. Quelle courbe change le plus : entraînement ou validation ?
  • Passez au modèle des chiffres floutés. Où ses courbes se rejoignent-elles, et à quelle hauteur ?
  • Comparez le modèle détaillé avec 100 images et le modèle flouté avec 1438. Lequel gagne ?

Une fois vérifié dans le lab, nommons ce que vous voyez.

L’idée en quelques mots

Une courbe d’apprentissage, ce sont deux lignes : l’exactitude sur les données d’entraînement et en validation, en fonction du nombre d’exemples d’entraînement. Avec quelques dizaines d’images, le modèle mémorise chacune : l’entraînement a 100 % et la validation 82,3 %. Plus il y a de données, plus il est difficile de tout mémoriser, donc l’entraînement baisse (à 98,0 %) et la validation monte (à 95,8 %). L’écart entre les deux passe de 17,7 à 2,2 points.

La forme de ces lignes vous donne la décision :

  • Grand écart, validation qui monte encore (variance élevée) : le modèle connaît ses données d’entraînement bien mieux que les nouvelles. Plus de données aideront, la régularisation aussi.
  • Petit écart, les deux lignes basses (biais élevé) : le modèle est trop simple. Les courbes se sont rejointes et plus de données n’aideront presque pas. Un modèle plus riche ou de meilleures variables aideront.

Le modèle des chiffres floutés voit chaque chiffre comme une image de 4 × 4, soit 16 pixels au lieu de 64. Avec 1438 images, il a 86,9 % en entraînement et 85,0 % en validation, un écart de seulement 1,9 point. La validation ne dépasse généralement pas l’entraînement, qui n’a que 86,9 %. Le modèle détaillé atteint déjà 87,6 % avec seulement 100 images.

Jak to policzono
  • Chiffres : Optical Recognition of Handwritten Digits, UCI, licence CC BY 4.0. 1797 images de 8 × 8 pixels, 10 chiffres.
  • Un découpage 80/20 stratifié, le même que dans le widget de l’Atlas : 1438 images pour apprendre, 359 pour valider. Pour chaque taille, la moyenne de 5 tirages des images utilisées pour apprendre.
  • Modèle : régression logistique (softmax) avec une pénalité de 0,001 sur les grands poids. Le modèle flouté voit les moyennes de blocs de 2 × 2 pixels.

Pourquoi ça marche

En entraînement, le modèle voit les réponses, donc avec peu de données il peut les mémoriser. Chaque nouvel exemple rend la mémorisation plus difficile et rend plus facile de trouver une règle qui marche aussi hors de l’entraînement. C’est pourquoi les lignes se rapprochent : l’entraînement descend, la validation monte. Elles se rejoignent au niveau que ce modèle peut atteindre tout court.

Ce niveau dépend du modèle, pas des données. Une image floutée perd les détails qui distinguent, par exemple, un 3 d’un 8, et aucun nombre d’exemples ne les rend. Dans le code ci-dessous, la même expérience tourne sur 50 découpages différents : avec toutes les données, le modèle flouté a 86,4 % en entraînement et 85,1 % en validation, et le modèle détaillé 96,6 % en validation. Le modèle détaillé à partir de 100 images bat le modèle flouté à partir de 1437 images dans 49 découpages sur 50.

Erreur fréquente

Vrai ou faux : « plus de données aident toujours ». Faux. Plus de données aident quand le modèle est trop puissant pour la quantité de données : l’écart est alors grand et la validation continue de monter. Quand le modèle est trop simple, les courbes se rejoignent tôt et restent plates. Dans le lab, le modèle flouté a 83,6 % en validation avec 400 images, et 85,0 % avec un ensemble presque quatre fois plus grand. Le modèle détaillé a 95,8 % avec les mêmes données. Avant de payer pour collecter des données, tracez une courbe d’apprentissage : si le score d’entraînement est déjà bas, les données n’aideront pas.

Remarque : tracez les courbes en validation ou en validation croisée, pas sur le jeu de test. Le test reste réservé à l’évaluation finale.

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.

1. L’entraînement a 100 %, la validation 82,3 %, et la courbe de validation monte encore. Qu’est-ce qui aidera le plus probablement ?
Voir la réponse

Bonne réponse : Plus de données d’entraînement, car un grand écart montre que le modèle mémorise

Grand écart et validation qui monte, c’est une variance élevée. Sur tout l’entraînement, le même modèle atteint 95,8 % en validation, et l’écart tombe à 2,2 points.

2. Avec 1438 images, le modèle flouté a 86,9 % en entraînement et 85,0 % en validation. Que faire ?
Voir la réponse

Bonne réponse : Passer à un modèle plus riche, car les deux courbes se sont rejointes en bas

C’est un biais élevé : la validation ne dépassera pas l’entraînement, qui n’a que 86,9 %. Le modèle sur les 64 pixels atteint 95,8 % avec les mêmes données.

3. Pourquoi l’exactitude en entraînement baisse-t-elle quand les données d’entraînement grandissent ?
Voir la réponse

Bonne réponse : Parce que mémoriser chaque exemple devient plus dur, donc le modèle généralise

Avec 50 images, le modèle les réussit toutes, avec 1438, il en réussit 98,0 %. La validation, elle, monte de 82,3 % à 95,8 %.

À retenir

  • Une courbe d’apprentissage est le score en entraînement et en validation pour un ensemble d’entraînement qui grandit.
  • Grand écart et validation qui monte : le modèle mémorise, plus de données aideront.
  • Petit écart avec un score bas : le modèle est trop simple ; un modèle plus riche ou de meilleures variables aideront, pas plus de données.
  • Tracez la courbe avant de payer pour des données ; tracez-la en validation et gardez le test pour la fin.

Pour aller plus loin : formule, code, pratique

Les maths

Soient A_tr(n) et A_val(n) l’exactitude sur n exemples d’entraînement et en validation. La courbe d’apprentissage, ce sont les deux fonctions de n. En général, A_tr(n) baisse, A_val(n) monte, et les deux s’approchent du même niveau A*, la meilleure exactitude que cette famille de modèles atteint.

L’écart A_tr(n) − A_val(n) mesure la variance : à quel point le score dépend des exemples utilisés pour apprendre. La distance 1 − A est le biais de cette famille de modèles, plus un bruit qu’aucun modèle ne supprime (des chiffres illisibles même pour un humain) : aucune donnée ne le supprime. Plus de données réduisent l’écart ; seul un changement de modèle relève A.

La régression logistique du lab minimise L = perte moyenne + (λ / 2) · ‖W‖² avec λ = 0,001. Dans scikit-learn, la même pénalité s’écrit C = 1 / (λ · n) = 1000 / n.

En code (Python)

La même expérience dans scikit-learn sur 50 découpages différents : un modèle sur 64 pixels et un sur le chiffre flouté en 16 pixels, avec un nombre croissant d’images d’entraînement.

import numpy as np
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

X, y = load_digits(return_X_y=True)
X = X / 16  # 8 × 8 = 64 pixels de 0 à 1, comme dans le lab
X16 = X.reshape(-1, 4, 2, 4, 2).mean(axis=(2, 4)).reshape(len(X), -1)  # le même chiffre flouté en 4 × 4 = 16 pixels
def run(Z, n, seed):
    Xtr, Xva, ytr, yva = train_test_split(Z, y, test_size=0.2, stratify=y, random_state=seed)
    i = np.random.default_rng(seed).permutation(len(ytr))[:n]  # les n premières images d'entraînement après mélange
    m = LogisticRegression(C=1000 / n, max_iter=5000).fit(Xtr[i], ytr[i])  # C = 1000 / n est la pénalité 0,001 du lab
    return m.score(Xtr[i], ytr[i]), m.score(Xva, yva)
for name, Z in (("64 pixels", X), ("16 pixels", X16)):
    for n in (50, 100, 400, 800, 1437):
        tr, va = np.mean([run(Z, n, s) for s in range(50)], axis=0)  # moyenne de 50 découpages différents
        print(f"{name}, {n} images: training {tr:.1%}, validation {va:.1%}, gap {(tr - va) * 100:.1f} points")
wins = sum(run(X, 100, s)[1] > run(X16, 1437, s)[1] for s in range(50))
print(f"64 pixels from 100 images beat 16 pixels from 1437 images in {wins} of 50 splits")

Sortie

64 pixels, 50 images: training 100.0%, validation 81.2%, gap 18.8 points
64 pixels, 100 images: training 100.0%, validation 89.5%, gap 10.5 points
64 pixels, 400 images: training 99.7%, validation 94.9%, gap 4.8 points
64 pixels, 800 images: training 99.0%, validation 96.0%, gap 2.9 points
64 pixels, 1437 images: training 98.2%, validation 96.6%, gap 1.6 points
16 pixels, 50 images: training 98.5%, validation 72.6%, gap 25.9 points
16 pixels, 100 images: training 94.1%, validation 79.8%, gap 14.4 points
16 pixels, 400 images: training 87.7%, validation 83.8%, gap 3.8 points
16 pixels, 800 images: training 86.9%, validation 84.6%, gap 2.3 points
16 pixels, 1437 images: training 86.4%, validation 85.1%, gap 1.3 points
64 pixels from 100 images beat 16 pixels from 1437 images in 49 of 50 splits

Le lab montre un découpage et 5 tirages, le code 50 découpages, donc les nombres diffèrent un peu : avec 50 images, la validation vaut 82,3 % dans le lab et 81,2 % en moyenne. La forme des courbes et la conclusion sont les mêmes.

Pour les praticiens
  • Dans scikit-learn, les courbes viennent de learning_curve (avec validation croisée) et de LearningCurveDisplay. En classification, utilisez StratifiedKFold, pour que chaque taille contienne toutes les classes.
  • Tracez le nombre d’exemples en échelle logarithmique : on voit mieux ce qu’apporte chaque doublement des données.
  • Une courbe de validation (validation_curve), c’est autre chose : le score selon un réglage du modèle, comme la force de la régularisation, à données fixes.
  • Avant de collecter des données, estimez ce qu’apportera un doublement : si le dernier a donné une fraction de point, le suivant donnera encore moins.

Aller plus loin dans l’Atlas

Articles de l’encyclopédie sur les notions de cette leçon :