ML Atlas

Machine Learning von Grund auf · Lektion 3.3 · 16 von 33 fertigen Lektionen · 12 Min.

Lernkurven: mehr Daten oder ein besseres Modell?

Kurz gesagt

Lernkurven zeigen den Wert auf Training und Validierung, während die Daten wachsen. Ihre Form sagt, ob du Daten sammeln oder das Modell wechseln solltest.

Aufwärmen Zwei Fragen aus früheren Lektionen. Eine Minute, und sie blockiert die Lektion nicht.
Aus Lektion 3.2: Validierung und Kreuzvalidierung Warum ist es ein Fehler, die Merkmale vor der Kreuzvalidierung auf allen Zeilen zu skalieren?

Antwort anzeigen

Richtige Antwort: Kennzahlen aus den Validierungs-Folds sickern ins Training, die Ergebnisse fallen zu optimistisch aus

Jeder Schritt, der aus Daten lernt, darf nur auf den Trainings-Folds angepasst werden, sonst sind die Validierungs-Folds nicht mehr ungesehen.

Aus Lektion 3.1: Überanpassung: Wenn ein Modell auswendig lernt Was passiert mit dem Trainingsfehler, wenn der Grad des Polynoms steigt?

Antwort anzeigen

Richtige Antwort: Er fällt weiter oder bleibt gleich, weil flexiblere Kurven einfachere nachbilden können

Ein Polynom höheren Grades enthält jedes Polynom niedrigeren Grades als Spezialfall, also kann es die Trainingspunkte nie schlechter treffen.

In Lektion 3.1 war das Modell zu einfach oder zu komplex, bei gleicher Datenmenge. Heute änderst du die Datenmenge. Das ist eine Alltagsfrage der Praxis: Das Modell ist mittelmäßig, also mehr Beispiele sammeln oder das Modell wechseln? Die Antwort gibt eine Lernkurve: der Wert auf Training und Validierung, gezeichnet für eine immer größere Trainingsmenge.

Erst vorhersagen, dann prüfen Eine logistische Regression lernt aus 50 Bildern, handgeschriebene Ziffern zu erkennen. Auf diesen 50 Bildern liegt sie zu 100 % richtig. Wie gut ist sie ungefähr auf neuen Ziffern aus der Validierung?
Wie sicher bist du?

Interaktives Labor

Dieses interaktive Labor läuft im Browser mit aktiviertem JavaScript. Der Text drumherum beschreibt, was es zeigt.

Antwort anzeigen

Richtige Antwort: Etwa 82 %, also über zehn Punkte weniger als auf dem Training

Die Validierung liegt bei 82,3 % (Mittel aus 5 Ziehungen von 50 Bildern), die Lücke beträgt also 17,7 Prozentpunkte. Auf dem ganzen Training, 1438 Bildern, steigt die Validierung auf 95,8 %, und die Lücke schrumpft auf 2,2 Prozentpunkte. Bei wenig Daten sind 100 % im Training großteils Gedächtnis.

Probier es aus

  • Schiebe beim detaillierten Modell den Regler von 50 auf 1438 Bilder. Welche Kurve ändert sich stärker: Training oder Validierung?
  • Wechsle zum Modell der unscharfen Ziffern. Wo treffen sich seine Kurven, und wie hoch?
  • Vergleiche das detaillierte Modell mit 100 Bildern und das unscharfe mit 1438. Welches gewinnt?

Wenn du es im Labor geprüft hast, benennen wir, was du siehst.

Die Idee in einfachen Worten

Eine Lernkurve sind zwei Linien: die Genauigkeit auf den Trainingsdaten und auf der Validierung, abhängig von der Zahl der Trainingsbeispiele. Bei ein paar Dutzend Bildern lernt das Modell jedes auswendig: Das Training hat 100 %, die Validierung 82,3 %. Je mehr Daten, desto schwerer ist es, alles auswendig zu lernen: Das Training fällt (auf 98,0 %), die Validierung steigt (auf 95,8 %). Die Lücke zwischen ihnen schrumpft von 17,7 auf 2,2 Prozentpunkte.

Aus der Form dieser Linien liest du die Entscheidung ab:

  • Große Lücke, die Validierung steigt noch (hohe Varianz): Das Modell kennt seine Trainingsdaten viel besser als neue Daten. Mehr Daten helfen, ebenso Regularisierung.
  • Kleine Lücke, beide Linien niedrig (hoher Bias): Das Modell ist zu einfach. Die Kurven haben sich getroffen, und mehr Daten helfen kaum. Ein reicheres Modell oder bessere Merkmale helfen.

Das Modell der unscharfen Ziffern sieht jede Ziffer als Bild von 4 × 4, also 16 Pixel statt 64. Mit 1438 Bildern hat es 86,9 % im Training und 85,0 % in der Validierung, eine Lücke von nur 1,9 Prozentpunkten. Die Validierung steigt meist nicht über das Training, und das hat nur 86,9 %. Das detaillierte Modell erreicht schon mit 100 Bildern 87,6 %.

Jak to policzono
  • Ziffern: Optical Recognition of Handwritten Digits, UCI, Lizenz CC BY 4.0. 1797 Bilder mit 8 × 8 Pixeln, 10 Ziffern.
  • Eine stratifizierte 80/20-Aufteilung, dieselbe wie im Atlas-Widget: 1438 Bilder zum Lernen, 359 zur Validierung. Für jede Größe das Mittel aus 5 Ziehungen, welche Bilder zum Lernen dienen.
  • Modell: logistische (Softmax-)Regression mit einer Strafe von 0,001 auf große Gewichte. Das unscharfe Modell sieht die Mittelwerte von Blöcken aus 2 × 2 Pixeln.

Warum es funktioniert

Im Training sieht das Modell die Antworten, also kann es sie bei wenig Daten auswendig lernen. Jedes neue Beispiel macht das Auswendiglernen schwerer und das Finden einer Regel leichter, die auch außerhalb des Trainings funktioniert. Darum bewegen sich die Linien aufeinander zu: das Training nach unten, die Validierung nach oben. Sie treffen sich auf dem Niveau, das dieses Modell überhaupt erreichen kann.

Dieses Niveau hängt vom Modell ab, nicht von den Daten. Ein unscharfes Bild verliert die Details, die zum Beispiel eine 3 von einer 8 unterscheiden, und keine Zahl von Beispielen bringt sie zurück. Im Code unten läuft dasselbe Experiment auf 50 verschiedenen Aufteilungen: Mit allen Daten hat das unscharfe Modell 86,4 % im Training und 85,1 % in der Validierung, das detaillierte 96,6 % in der Validierung. Das detaillierte Modell aus 100 Bildern schlägt das unscharfe aus 1437 Bildern in 49 von 50 Aufteilungen.

Häufiger Fehler

Richtig oder falsch: „Mehr Daten helfen immer.“ Falsch. Mehr Daten helfen, wenn das Modell für die Datenmenge zu stark ist: Dann ist die Lücke groß, und die Validierung steigt weiter. Ist das Modell zu einfach, treffen sich die Kurven früh und bleiben flach. Im Labor hat das unscharfe Modell mit 400 Bildern 83,6 % in der Validierung und mit einer fast viermal größeren Menge 85,0 %. Das detaillierte Modell hat mit denselben Daten 95,8 %. Bevor du für das Sammeln von Daten bezahlst, zeichne eine Lernkurve: Wenn schon der Trainingswert niedrig ist, helfen Daten nicht.

Hinweis: Zeichne die Kurven auf der Validierung oder in der Kreuzvalidierung, nicht auf dem Testdatensatz. Der Test bleibt für die Schlussbewertung.

Quiz

Drei Fragen zur Selbstkontrolle. Wähle eine Antwort oder klappe die Lösung unter der Frage auf. Mit der Tastatur: Pfeiltasten wählen, Enter oder Leertaste bestätigt.

1. Das Training hat 100 %, die Validierung 82,3 %, und die Validierungskurve steigt noch. Was hilft am ehesten?
Antwort anzeigen

Richtige Antwort: Mehr Trainingsdaten, weil eine große Lücke heißt, dass das Modell auswendig lernt

Große Lücke und steigende Validierung bedeuten hohe Varianz. Auf dem ganzen Training erreicht dasselbe Modell 95,8 % in der Validierung, und die Lücke fällt auf 2,2 Prozentpunkte.

2. Mit 1438 Bildern hat das unscharfe Modell 86,9 % im Training und 85,0 % in der Validierung. Was tun?
Antwort anzeigen

Richtige Antwort: Zu einem reicheren Modell wechseln, weil sich beide Kurven niedrig trafen

Das ist hoher Bias: Die Validierung springt nicht über das Training, und das hat nur 86,9 %. Das Modell auf allen 64 Pixeln erreicht mit denselben Daten 95,8 %.

3. Warum fällt die Genauigkeit im Training, wenn die Trainingsdaten wachsen?
Antwort anzeigen

Richtige Antwort: Weil Auswendiglernen jedes Beispiels schwerer wird, also verallgemeinert es

Bei 50 Bildern liegt das Modell bei allen richtig, bei 1438 bei 98,0 %. Die Validierung steigt dafür von 82,3 % auf 95,8 %.

Das Wichtigste

  • Eine Lernkurve ist der Wert auf Training und Validierung für eine wachsende Trainingsmenge.
  • Große Lücke und steigende Validierung: Das Modell lernt auswendig, mehr Daten helfen.
  • Kleine Lücke bei niedrigem Wert: Das Modell ist zu einfach; ein reicheres Modell oder bessere Merkmale helfen, nicht mehr Daten.
  • Zeichne die Kurve, bevor du für Daten bezahlst; zeichne sie auf der Validierung und heb den Test fürs Ende auf.

Tiefer: Formel, Code, Praxis

Die Mathematik

Seien A_tr(n) und A_val(n) die Genauigkeit auf n Trainingsbeispielen und auf der Validierung. Die Lernkurve sind beide Funktionen von n. Meist fällt A_tr(n), A_val(n) steigt, und beide nähern sich demselben Niveau A*, der besten Genauigkeit, die diese Modellfamilie erreicht.

Die Lücke A_tr(n) − A_val(n) misst die Varianz: wie stark der Wert davon abhängt, welche Beispiele zum Lernen dienten. Der Abstand 1 − A ist der Bias dieser Modellfamilie zusammen mit Rauschen, das kein Modell entfernt (Ziffern, die selbst ein Mensch nicht lesen kann): Keine Daten entfernen ihn. Mehr Daten verkleinern die Lücke; nur ein Modellwechsel hebt A.

Die logistische Regression im Labor minimiert L = mittlerer Verlust + (λ / 2) · ‖W‖² mit λ = 0,001. In scikit-learn ist dieselbe Strafe C = 1 / (λ · n) = 1000 / n.

Im Code (Python)

Dasselbe Experiment in scikit-learn auf 50 verschiedenen Aufteilungen: ein Modell auf 64 Pixeln und eines auf der auf 16 Pixel unscharf gemachten Ziffer, mit wachsender Zahl von Trainingsbildern.

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 Pixel von 0 bis 1, wie im Labor
X16 = X.reshape(-1, 4, 2, 4, 2).mean(axis=(2, 4)).reshape(len(X), -1)  # dieselbe Ziffer unscharf auf 4 × 4 = 16 Pixel
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]  # die ersten n Trainingsbilder nach dem Mischen
    m = LogisticRegression(C=1000 / n, max_iter=5000).fit(Xtr[i], ytr[i])  # C = 1000 / n ist die Strafe 0,001 aus dem Labor
    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)  # Mittel aus 50 verschiedenen Aufteilungen
        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")

Ausgabe

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

Das Labor zeigt eine Aufteilung und 5 Ziehungen, der Code 50 Aufteilungen, also weichen die Zahlen etwas ab: Bei 50 Bildern liegt die Validierung im Labor bei 82,3 %, im Mittel bei 81,2 %. Die Form der Kurven und die Schlussfolgerung sind dieselben.

Für die Praxis
  • In scikit-learn liefern learning_curve (mit Kreuzvalidierung) und LearningCurveDisplay die Kurven. Für Klassifikation nimm StratifiedKFold, damit jede Größe alle Klassen enthält.
  • Zeichne die Zahl der Beispiele auf einer logarithmischen Skala: So sieht man besser, was jede Verdopplung der Daten bringt.
  • Eine Validierungskurve (validation_curve) ist etwas anderes: der Wert abhängig von einer Modelleinstellung, etwa der Stärke der Regularisierung, bei festen Daten.
  • Schätze vor dem Sammeln, was eine Verdopplung bringt: Hat die letzte Verdopplung einen Bruchteil eines Punktes gebracht, bringt die nächste noch weniger.

Mehr im Atlas

Einträge der Enzyklopädie zu den Ideen dieser Lektion: