ML Atlas

Machine Learning von Grund auf · Lektion 3.5 · 18 von 33 fertigen Lektionen · 14 Min.

Hyperparameter abstimmen, ohne zu schummeln

Kurz gesagt

Die beste von 9 Baumeinstellungen hat in der Kreuzvalidierung 93,7 % und auf neuen Biopsien 88,3 %. Die Wahl des Siegers bläht sein Ergebnis auf.

Aufwärmen Zwei Fragen aus früheren Lektionen. Eine Minute, und sie blockiert die Lektion nicht.
Aus Lektion 3.4: Regularisierung: Ridge und Lasso Im Lab behält Lasso 3 Merkmale, und das Test-R² fällt von 0,470 auf 0,386. Was bedeutet das?

Antwort anzeigen

Richtige Antwort: Dass ein einfacheres Modell etwas Genauigkeit kostet: Beide Ziele sind abzuwägen

Weniger Merkmale machen ein Modell leichter nutzbar und erklärbar, aber hier erklärt es einen kleineren Teil der Streuung im Ergebnis. Die Stärke der Strafe wird auf der Validierung gewählt, mit Blick auf Einfachheit und Genauigkeit.

Aus Lektion 3.3: Lernkurven: mehr Daten oder ein besseres Modell? 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 %.

In Lektion 3.2 hat die Kreuzvalidierung eine einzige Einstellung des Modells bewertet. In der Praxis probierst du viele und nimmst die beste. Das heißt Abstimmen (Tuning). Die Einstellungen, die du vor dem Training wählst (die Tiefe eines Baums, die Stärke der Strafe α aus Lektion 3.4), sind Hyperparameter: Das Modell lernt sie nicht aus den Daten, du wählst sie. Heute siehst du, dass das Ergebnis des Siegers beim Abstimmen zu optimistisch ist, und warum.

Erst vorhersagen, dann prüfen Ein Entscheidungsbaum erkennt bösartige Tumoren an 398 Biopsien. Du probierst 9 Einstellungen: 3 Tiefen mal 3 Mindestzahlen von Biopsien in einem Blatt. Jede bewertest du in 5-facher Kreuzvalidierung. Der Sieger erreicht 93,7 %. Was erreicht er auf 171 neuen Biopsien, die er nie gesehen hat?
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: Weniger, zum Beispiel 88,3 %, weil wir auch günstiges Rauschen gewählt haben

Auf den 171 Testbiopsien erreicht der Sieger 88,3 %, 5,4 Prozentpunkte weniger als in der Kreuzvalidierung. Ein Teil davon ist Auswahl, ein Teil der kleine Test: Eine Biopsie macht 0,6 Prozentpunkte aus. Den besten von 20 Seeds der Aufteilung zu wählen, bläht das Ergebnis um 2,7 Prozentpunkte auf. Diese Aufteilung liegt auf der pessimistischen Seite: Auf 50 anderen Aufteilungen (Code unten) verliert der Sieger im Mittel 1,4 Prozentpunkte.

Probier es aus

  • Stell beim Raster das Budget von 4 auf 9. Was erreicht der Sieger in der Kreuzvalidierung und was im Test?
  • Wechsle zur Zufallssuche und klicke ein paarmal auf „neu ziehen“. Ist der Sieger im Test je besser als in der Validierung?
  • Bewege im zweiten Teil den Seed-Regler von 1 bis 20. Wie wächst das beste Ergebnis, und wie weit entfernt es sich vom Mittel aus 200 Aufteilungen?

Wenn du es im Lab geprüft hast, geben wir dem, was du siehst, einen Namen.

Die Idee in einfachen Worten

Abstimmen heißt, viele Einstellungen auf Validierungsdaten zu vergleichen und die beste zu wählen. Die Rastersuche probiert alle Kombinationen weniger Werte. Die Zufallssuche zieht Kombinationen aus dem ganzen Bereich. Beim gleichen Budget probiert ein 3×3-Raster nur 3 Tiefen: 1, 6 und 12. Neun zufällige Versuche sehen meist mehr verschiedene Werte jedes Hyperparameters.

Jedes Validierungsergebnis ist die wahre Qualität der Einstellung plus etwas Glück: welche Biopsien in welchem Teil gelandet sind. Wählst du das beste Ergebnis, wählst du auch die Einstellung, der das Glück am meisten geholfen hat. Auf neuen Daten ist dieses Glück weg. Das ist der Fluch des Siegers. Er wächst mit der Zahl der verglichenen Einstellungen und schrumpft mit der Größe der Daten.

Dasselbe passiert, wenn du die beste Aufteilung der Daten suchst. Dieselbe logistische Regression erreicht auf 200 zufälligen Aufteilungen im Mittel 93,8 % im Test. Probierst du die Seeds 1–20 und meldest den besten, kommen 96,5 % heraus, 2,7 Prozentpunkte mehr. Der Code ist derselbe; du hast nur das Glück ausgewählt.

Jak to policzono
  • Biopsien: Breast Cancer Wisconsin (Diagnostic), UCI, Lizenz CC BY 4.0. 569 Biopsien, je 10 „mean“-Messwerte.
  • Abstimmen: geschichtete Aufteilung, 398 Biopsien zum Abstimmen und 171 für den Test. Ein CART-Baum (Gini), 10 Tiefen mal 11 Mindestzahlen von Biopsien im Blatt, also 110 Einstellungen, jede in 5-facher Kreuzvalidierung auf den 398 Biopsien.
  • Sieger: der beste Mittelwert über die 5 Teile; bei Gleichstand der einfachere Baum. Im Test wird der Baum bewertet, der auf allen 398 Biopsien trainiert wurde.
  • Seeds: logistische Regression (C = 1) auf standardisierten Messwerten, 200 zufällige 70/30-Aufteilungen, in jeder 171 Testbiopsien.

Warum es funktioniert

Nimm 9 Einstellungen von fast gleicher wahrer Qualität. Ihre Validierungsergebnisse unterscheiden sich vor allem durch Rauschen. Das höchste von 9 Ergebnissen ist fast immer eines, bei dem das Rauschen positiv war. Im Lab trifft die beste CV 373 von 398 Biopsien, und mehrere Einstellungen liegen nur eine oder zwei Biopsien dahinter. So kleine Unterschiede sind zu einem guten Teil Zufall.

Die Auswahl zeigt sich im Zufallsmodus: Bei 200 Ziehungen von 9 Einstellungen hat der Sieger in der Validierung in jeder einzelnen mehr als im Test, im Mittel 3,6 Prozentpunkte. Der Test war an der Wahl nicht beteiligt, also steckt in ihm keine Auswahl, nur das gewöhnliche Rauschen einer endlichen Menge. Alle 200 Ziehungen sind aber verschiedene Einstellungen auf ein und derselben Aufteilung der Daten, und diese fiel pessimistisch aus: Selbst ganz ohne Auswahl haben die 110 Einstellungen in der Validierung im Mittel 0,6 Prozentpunkte mehr als im Test. Im Code unten, auf 50 verschiedenen Aufteilungen, verliert der Sieger im Mittel 1,4 Prozentpunkte, und in 17 von 50 Aufteilungen liegt die Validierung nicht über dem Test.

Darum darf der Test nicht zum Wählen dienen. Wählte man eine Einstellung nach ihrem Testergebnis, hätte die beste Zelle im Test 92,4 %. Auch diese Zahl wäre aufgebläht, nur schwerer zu bemerken, weil keine Daten mehr übrig wären, um sie zu prüfen.

Häufiger Fehler

Richtig oder falsch: „Das Ergebnis des Siegers beim Abstimmen ist eine Prognose für neue Daten.“ Falsch. Das Validierungsergebnis des Siegers ist aufgebläht, weil es das Maximum vieler verrauschter Zahlen ist. Im Lab hat der Sieger von 9 Einstellungen 93,7 % in der Validierung und 88,3 % im Test. Im Code unten, über 50 Aufteilungen und 110 Einstellungen, erreicht der Sieger im Mittel 93,3 % in der Validierung und 91,9 % auf dem zurückgehaltenen Test.

Eine faire Prognose liefert einer von zwei Wegen. Erstens: ein zurückgehaltener Test, den du für keine Wahl nutzt und einmal ansiehst, am Ende. Zweitens: verschachtelte Kreuzvalidierung, also das ganze Abstimmen wiederholt in jedem Teil einer äußeren Kreuzvalidierung. Auf allen 569 Biopsien erreicht der Sieger in der gewöhnlichen Kreuzvalidierung 94,0 %, die verschachtelte ergibt 91,9 %. Die zweite Zahl liegt näher an dem, was das Modell morgen leistet.

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. Was ist ein Hyperparameter?
Antwort anzeigen

Richtige Antwort: Eine Einstellung, die vor dem Training gewählt wird und die das Modell nicht selbst lernt

Hyperparameter wie die Tiefe eines Baums oder die Stärke der Strafe α wählst du, meist auf der Validierung. Gewichte und die Schwellen in einem Baum lernt das Modell selbst.

2. Der Sieger des Abstimmens erreicht 93,7 % in der Kreuzvalidierung. Was ist auf neuen Daten zu erwarten?
Antwort anzeigen

Richtige Antwort: Eher weniger, weil die Wahl des besten von vielen Ergebnissen auch das Glück wählt

Das ist der Fluch des Siegers. Im Lab erreicht der Sieger von 9 Einstellungen im Test 88,3 %; bei 200 Ziehungen ist sein Validierungsergebnis jedes Mal höher als sein Testergebnis.

3. Wie bewertest du fair ein Modell, dessen Hyperparameter du per Kreuzvalidierung gewählt hast?
Antwort anzeigen

Richtige Antwort: Es auf einem zurückgehaltenen Test oder mit verschachtelter Kreuzvalidierung prüfen

Zurückgehaltener Test und verschachtelte Kreuzvalidierung waren an der Wahl nicht beteiligt. Im Code ergibt die gewöhnliche Kreuzvalidierung 94,0 %, die verschachtelte 91,9 %.

Das Wichtigste

  • Hyperparameter wählst du selbst, vor dem Training; abgestimmt wird auf der Validierung, nie auf dem Test.
  • Das Ergebnis des Siegers ist aufgebläht: Wer das beste Ergebnis wählt, wählt auch das Glück (der Fluch des Siegers).
  • Den besten Seed der Aufteilung zu wählen, ist ebenfalls Abstimmen auf dem Testset.
  • Eine faire Prognose liefert ein zurückgehaltener Test, den man einmal ansieht, oder verschachtelte Kreuzvalidierung.

Tiefer: Formel, Code, Praxis

Die Mathematik

Sei μₖ die wahre Qualität der Einstellung k und Ŝₖ = μₖ + εₖ ihr Validierungsergebnis, wobei das Rauschen εₖ den Mittelwert 0 hat. Für eine Einstellung gilt E[Ŝₖ] = μₖ. Für den Sieger k = argmaxₖ Ŝₖ gilt im Mittel E[Ŝ_k] ≥ μ_k*: Das Maximum mehrerer verrauschter Zahlen liegt im Mittel über der wahren Qualität des Gewählten. Bei m Einstellungen gleicher Qualität wächst E[max εₖ] mit m ungefähr wie σ · √(2 · ln m).

Eine Testbiopsie bei n = 171 ist 1/171, also 0,6 Prozentpunkte. Der Standardfehler einer Genauigkeit p auf n Beispielen: √(p(1 − p)/n).

Verschachtelte Kreuzvalidierung: Eine äußere Schleife teilt die Daten in K Teile; für jeden Teil läuft das ganze Abstimmen (eine innere Kreuzvalidierung) nur auf den übrigen, und das gewählte Modell wird auf dem zurückgehaltenen Teil bewertet.

Im Code (Python)

Dasselbe Experiment in scikit-learn: der Fluch des Siegers auf 50 Aufteilungen mit den 110 Baumeinstellungen, gewöhnliche und verschachtelte Kreuzvalidierung auf allen Biopsien und der beste von 20 Seeds der Aufteilung.

import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split, GridSearchCV, StratifiedKFold, cross_val_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

X, y = load_breast_cancer(return_X_y=True)
X = X[:, :10]  # die 10 „mean“-Messwerte, wie im Lab
grid = {"max_depth": [1, 2, 3, 4, 5, 6, 7, 8, 10, 12], "min_samples_leaf": [1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48]}  # die 110 Einstellungen des Labs
tree = DecisionTreeClassifier(random_state=0)
r = []
for s in range(50):
    tr, te = train_test_split(np.arange(len(y)), test_size=0.3, stratify=y, random_state=s)
    search = GridSearchCV(tree, grid, cv=StratifiedKFold(5, shuffle=True, random_state=s)).fit(X[tr], y[tr])
    r.append((search.best_score_, search.score(X[te], y[te])))  # die CV des Siegers, dann der Sieger auf dem zurückgehaltenen Test
r = np.array(r)
print(f"winner of 110 settings, 50 splits: CV {r[:, 0].mean():.1%}, held-out test {r[:, 1].mean():.1%}; CV higher in {(r[:, 0] > r[:, 1]).sum()} of 50")
outer = StratifiedKFold(5, shuffle=True, random_state=0)
flat = GridSearchCV(tree, grid, cv=outer).fit(X, y).best_score_  # das Siegerergebnis auf denselben Teilen, die ihn gewählt haben
nested = cross_val_score(GridSearchCV(tree, grid, cv=StratifiedKFold(5, shuffle=True, random_state=1)), X, y, cv=outer).mean()  # die Suche läuft in jedem äußeren Teil
print(f"all 569 biopsies: winner's CV {flat:.1%}, nested CV {nested:.1%}")
model = make_pipeline(StandardScaler(), LogisticRegression())
acc = []
for s in range(200):  # 200 zufällige Aufteilungen, 30 % Test, wie im Lab
    tr, te = train_test_split(np.arange(len(y)), test_size=0.3, random_state=s)
    acc.append(model.fit(X[tr], y[tr]).score(X[te], y[te]))
acc = np.array(acc)
best = acc.reshape(10, 20).max(axis=1)  # zehn Personen, jede probiert 20 Seeds und meldet den besten
print(f"logistic regression, 200 seeds: mean {acc.mean():.1%}; best of 20 seeds {best.mean():.1%} on average (+{(best.mean() - acc.mean()) * 100:.1f} points), higher in {(best > acc.mean()).sum()} of 10")

Ausgabe

winner of 110 settings, 50 splits: CV 93.3%, held-out test 91.9%; CV higher in 33 of 50
all 569 biopsies: winner's CV 94.0%, nested CV 91.9%
logistic regression, 200 seeds: mean 93.7%; best of 20 seeds 96.4% on average (+2.6 points), higher in 10 of 10

Die Aufteilungen sind andere als im Lab, also auch die Zahlen. Das Bild ist dasselbe: Der Sieger des Abstimmens erreicht in der Validierung im Mittel 93,3 % und auf dem zurückgehaltenen Test 91,9 %; die Validierung liegt in 33 von 50 Aufteilungen höher. Die verschachtelte Kreuzvalidierung ergibt 91,9 % statt 94,0 %, und der beste von 20 Seeds bläht das Ergebnis um 2,6 Prozentpunkte auf, bei jeder der 10 Personen.

Für die Praxis
  • In scikit-learn: GridSearchCV und RandomizedSearchCV. Der best_score_ ist aus demselben Grund aufgebläht wie im Lab; bewerte den Sieger mit score auf einem zurückgehaltenen Test.
  • Verschachtelte Kreuzvalidierung: cross_val_score(GridSearchCV(...), X, y, cv=...). Das Abstimmen läuft dann in jedem äußeren Teil.
  • Bei vielen Hyperparametern, von denen nur wenige zählen, findet die Zufallssuche meist schneller eine gute Einstellung als ein Raster (Bergstra und Bengio, 2012).
  • Lege den Zufalls-Seed einmal fest, vor dem Experiment, und schreib ihn auf. Melde Mittelwert und Streuung über mehrere Aufteilungen oder aus der Kreuzvalidierung, nicht das Ergebnis des besten Seeds.

Mehr im Atlas

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