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.
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.
Wähle eine Antwort und wie sicher du bist.
Antworte, um das Labor freizuschalten.
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.
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.
Notebook herunterladen (.ipynb). Öffne es in Jupyter oder lade es in Google Colab hoch; fehlende Daten lädt es selbst.
Für die Praxis
- In scikit-learn:
GridSearchCVundRandomizedSearchCV. Derbest_score_ist aus demselben Grund aufgebläht wie im Lab; bewerte den Sieger mitscoreauf 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.
War das hilfreich?
Danke! Das hilft uns, besser zu werden.
Mehr im Atlas
Einträge der Enzyklopädie zu den Ideen dieser Lektion: