Menu
CoddyTech

Courbes d’apprentissage

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

Plus de données rendraient-elles votre modèle meilleur ? Une courbe d’apprentissage le montre : la précision sur l’ensemble de test à mesure que l’ensemble d’entraînement s’agrandit. Ici, un arbre profond sur des données à deux lunes :

Précision en fonction du nombre de lignes d’entraînement, de 25 à 800. La courbe d’entraînement reste à 1.0 tout du long ; la courbe de test grimpe de 0.80 à 0.94

L’arbre mémorise chaque jeu d’entraînement, et pourtant chaque ligne supplémentaire lui apprend quelque chose de réel. Les modèles flexibles tirent le meilleur parti des données.

Entraîne le modèle sur les premières n lignes d’entraînement, puis évalue-le à chaque fois sur les mêmes lignes de test :

sizes = [25, 50, 100, 200, 400, 800]
test_scores = []
for n in sizes:
    tree = DecisionTreeClassifier(random_state=0)
    tree.fit(X_train[:n], y_train[:n])
    test_scores.append(tree.score(X_test, y_test))
ax.plot(sizes, test_scores, marker="o")

Vous grimpez encore au bord droit ? Plus de données aideront.

challenge icon

Défi

Moyen

Davantage d’enregistrements aideraient-ils à distinguer deux espèces de chouettes ? Le code de départ répartit 600 cris et prépare les deux modèles ainsi que le graphique.

  1. Pour chaque n dans sizes, entraîne les deux modèles sur les n premières lignes d’entraînement ; conserve leurs précisions sur l’ensemble de test.
  2. Affiche le gain de chaque modèle, c’est-à-dire le dernier score moins le premier, avec 3 décimales.
  3. Trace les deux courbes en fonction de sizes, avec marker="o", étiquetées logistic et tree, et ajoute une légende.

Des chouettes d’un autre bois affichent :

Logistic gains 0.053 from more data
Tree gains 0.160 from more data

et dessinent ce graphique. Coddy décrit ensuite le tien.

Cris de chouettes : courbes d’apprentissage. La courbe logistique monte de 0.64 à environ 0.69 puis reste stable ; la courbe de l’arbre monte régulièrement de 0.67 à 0.83

Essayez vous-même

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier

# Ne modifiez pas les lignes ci-dessous : 600 cris de chouettes, hauteur (Hz) et durée (s)
rng = np.random.default_rng(23)
pitch = np.round(rng.uniform(300, 900, 600))
length = np.round(rng.uniform(0.2, 2.0, 600), 2)
# L’espèce 1, la chouette hulotte, émet des cris plus longs compte tenu de leur hauteur ; quelques notes de terrain sont erronées
longer = length > 0.5 + 6.4 * ((pitch - 600) / 600) ** 2
wrong_note = rng.random(600) < 0.05
species = np.where(longer != wrong_note, 1, 0)
X = np.column_stack([pitch, length])
X_train, X_test, y_train, y_test = train_test_split(X, species, test_size=0.25, random_state=0)

sizes = [25, 50, 100, 200, 400]
logistic = LogisticRegression(max_iter=1000)
tree = DecisionTreeClassifier(random_state=0)

fig, ax = plt.subplots()
ax.set_title("Owl Calls: Learning Curves")
ax.set_xlabel("Training rows")
ax.set_ylabel("Test accuracy")

# É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