5.2 Kreuzvalidierung
Ein Gütemaß aus 5.1 auf den Trainingsdaten zu berechnen, ist wertlos: Ein Modell, das die Trainingsdaten auswendig lernt, hat dort Fehler 0 und kann trotzdem auf neuen Daten versagen (siehe 5.3). Man muss also Daten zurückhalten. Die Kreuzvalidierung (cross-validation, kurz CV oder X-Validation) ist die Standardmethode, das möglichst datensparsam zu tun.
Wofür braucht man das?
Folie: 📄 07_roc_xval_bias_var_ws26.pdf, Folie 11
Die Folie nennt zwei Fragen:
1. Modellauswahl (model selection): Welches Modell nehme ich? Oft gibt es einen „Drehknopf“, der die Komplexität steuert:
- Anzahl Nachbarn bei k-Nearest-Neighbors (KNN)
- Anzahl verwendeter Merkmale (features)
- Merkmale quadrieren oder logarithmieren und hinzufügen?
- Logistische Regression oder Perzeptron?
Solche Einstellungen, die nicht beim Training gelernt werden, heißen Hyperparameter (hyperparameters).
2. Modellbewertung (model evaluation): Wie gut ist die Leistung auf neuen, ungesehenen Daten? Dabei kann „Leistung“ jedes Maß aus 5.1 sein: AUC statt Accuracy, oder die Likelihood der Beobachtungen statt AUC oder Accuracy.
Auf der sicheren Seite: das Testset wegschließen
Folie: 📄 07_roc_xval_bias_var_ws26.pdf, Folie 12
Typische Strategie: Die Daten werden einmal aufgeteilt.
| Teil | Anteil | Verwendung |
|---|---|---|
| Training und Validierung | ca. 80 % | Modell trainieren, Modelle und Hyperparameter auswählen |
| Testset (test set) | ca. 20 % | nur zur abschließenden Schätzung der Leistung |
Kein Trainingsverfahren darf jemals ein Label aus dem Testset sehen. Am besten werden alle Testdaten bis zum finalen Test weggeschlossen.
Warum so streng? Jede Entscheidung, die man anhand einer Datenmenge trifft, passt das Modell ein Stück an genau diese Daten an. Wählt man unter 50 Modellen das mit dem besten Testfehler aus, ist dieser beste Testfehler optimistisch verzerrt: Ein Teil des Vorsprungs ist Glück auf genau diesen Testpunkten. Das Testset ist dann effektiv zu einem Validierungsset geworden, und man hat keine ehrliche Schätzung mehr.
Ab hier geht es (wie auf der Folie) nur noch um den Trainings- und Validierungsteil. Die Kreuzvalidierung teilt diesen Teil weiter auf.
Der Validierungsset-Ansatz
Folie: 📄 07_roc_xval_bias_var_ws26.pdf, Folie 13
Die Beispiele (Zeilen der Datenmatrix) werden zufällig in zwei Hälften geteilt: links Trainingsset, rechts Validierungsset (validation set approach, auch hold-out). Man trainiert auf der einen Hälfte und berechnet das Gütemaß auf der anderen.
Ergänzung, Nachteile (aus ISLR, woher die Abbildung stammt):
- Hohe Varianz: Das Ergebnis hängt stark davon ab, welche Beispiele zufällig im Validierungsset landen. Ein anderer Zufallssplit gibt eine merklich andere Zahl.
- Pessimistische Verzerrung: Das Modell wird nur auf der Hälfte der Daten trainiert. Mit weniger Daten sind Modelle im Mittel schlechter, der Fehler wird also überschätzt.
Leave-One-Out-Kreuzvalidierung (LOOCV)
Folie: 📄 07_roc_xval_bias_var_ws26.pdf, Folie 14
Man lässt genau ein Beispiel weg, trainiert auf den übrigen und sagt das weggelassene vorher. Das wiederholt man für alle Beispiele und mittelt:
wobei das Modell ist, das ohne Beispiel trainiert wurde, und eine Verlustfunktion (z. B. quadratischer Fehler oder 0-1-Verlust).
k-fache Kreuzvalidierung
Folie: 📄 07_roc_xval_bias_var_ws26.pdf, Folie 15
Die Daten werden zufällig gemischt und in etwa gleich große Teile (folds) zerlegt. Für :
- Fold ist das Validierungsset, die anderen Folds sind das Trainingsset.
- Modell auf den Folds trainieren.
- Gütemaß auf Fold berechnen.
Danach mitteln. Haben die Folds nicht dieselbe Größe , nimmt man ein gewichtetes Mittel:
Jedes Beispiel wird genau einmal zur Validierung benutzt und mal zum Training.
Frage der Folie: Was passiert bei , was bei ?
- : Jeder Fold enthält genau ein Beispiel. Das ist LOOCV.
- : Zwei Hälften, jede wird einmal Validierungsset. Das ist der Validierungsset-Ansatz, bei dem aber beide Hälften genutzt und gemittelt werden. Jedes Modell sieht nur die Hälfte der Daten, die Schätzung ist daher pessimistisch (hohe Verzerrung).
Welches Schema ist das beste?
Folie: 📄 07_roc_xval_bias_var_ws26.pdf, Folie 16
| LOOCV | k-fach (z. B. ) | |
|---|---|---|
| Zufall | nicht zufällig: Es gibt nur eine Art, je eins wegzulassen | Ergebnis hängt von der zufälligen Aufteilung ab |
| Aufwand | Trainingsläufe, oft langsam (für manche Verfahren gibt es eingebaute Abkürzungen) | nur Trainingsläufe, meist schneller |
| Verzerrung (bias) der Schätzung | am kleinsten: Jedes Modell sieht fast alle Daten | etwas größer, meist unproblematisch |
| Varianz der Schätzung | höher (zwischen komplett neuen Datensätzen) | niedriger |
Intuition zur Verzerrung: Am Ende will man wissen, wie gut ein Modell ist, das auf allen Datenpunkten trainiert wurde. LOOCV-Modelle sehen Punkte, das ist fast dasselbe. Bei 10-fach sehen sie , also ein wenig weniger, und sind deshalb im Mittel ein wenig schlechter.
Intuition zur Varianz (Ergänzung): Die LOOCV-Modelle sind auf fast identischen Datensätzen trainiert und daher stark korreliert. Ein Mittelwert stark korrelierter Größen schwankt viel stärker als ein Mittelwert unabhängiger Größen. Zieht man einen ganz neuen Datensatz, verschiebt sich deshalb die LOOCV-Schätzung insgesamt stärker. Bei k-fach überlappen die Trainingssets weniger.
Ergänzung zur Grafik auf der Folie: Sie zeigt die geschätzte Accuracy (mit Fehlerbalken) gegen die Anzahl der Folds für drei Datensätze (Soybean, Vehicle, Rand), die grauen Balken markieren die wahre Accuracy. Bei 2 Folds wird die Accuracy deutlich unterschätzt (pessimistisch), ab etwa 10 Folds liegt die Schätzung nahe an der Wahrheit. Die negativen Werte auf der Achse () bedeuten vermutlich „leave--out“, also LOOCV (Darstellung wie in Kohavi 1995, „A Study of Cross-Validation and Bootstrap“). Beim Datensatz „Rand“ (zufällige Labels) liegt alles bei 50 %.
10-fache Kreuzvalidierung, manchmal mehrfach wiederholt mit neu gemischter Aufteilung (repeated k-fold). Das Wiederholen mittelt den Zufall der Aufteilung heraus.
Kurz in scikit-learn (Ergänzung)
from sklearn.model_selection import cross_val_score, KFold
from sklearn.linear_model import LogisticRegression
cv = KFold(n_splits=10, shuffle=True, random_state=42)
scores = cross_val_score(LogisticRegression(), X_trainval, y_trainval,
cv=cv, scoring="roc_auc")
print(f"AUC = {scores.mean():.3f} ± {scores.std(ddof=1) / len(scores)**0.5:.3f}")
scoring kann z. B. "accuracy", "roc_auc" oder "neg_log_loss" (die NLL mit Minus, weil scikit-learn immer maximiert) sein.
Praktische Tipps: Fehlerbalken und Null-Modell
Folie: 📄 07_roc_xval_bias_var_ws26.pdf, Folie 17
Die Folie zeigt eine typische „Tabelle 1“ aus einem Paper: mehrere Methoden (Spalten) auf mehreren Datensätzen (Zeilen), bewertet mit LPPD (log pointwise predictive density, höher ist besser, ↑, das ist eine Log-Likelihood auf Testdaten) und RMSE (niedriger ist besser, ↓). Zwei Dinge sind daran vorbildlich bzw. werden gefordert:
1. Fehlerbalken (error bars): Jede Zahl steht als Mittelwert Unsicherheit da, z. B. . Ohne Fehlerbalken weiß man nicht, ob ein Unterschied zwischen zwei Methoden echt oder Zufall ist.
Ergänzung: Mit den Fold-Ergebnissen ist eine gängige (etwas optimistische, weil die Folds nicht unabhängig sind) Angabe der Standardfehler
Beispiel: Fold-Accuracies . Mittel , Abweichungen , , , . Ergebnis: .
2. Null-Modell (null model): Immer eine Grundlinie (baseline) ohne Merkmale als Spalte mitführen. Für Los Angeles: „immer Sonne“ (Accuracy 98,6 %) bzw. konstant (NLL 0,072, siehe 5.1). Ein Modell ist nur dann etwas wert, wenn es das Null-Modell schlägt.
Ergänzung: Typische Null-Modelle sind „häufigste Klasse“ bzw. „Basisrate als Wahrscheinlichkeit“ (Klassifikation) und „Mittelwert der Trainings-“ (Regression, MSE = Varianz von ). In scikit-learn: DummyClassifier, DummyRegressor.
Typische Fallstricke (Ergänzung, nicht auf den Folien)
Datenleck (data leakage) heißt: Information aus den Validierungs- oder Testdaten gelangt ins Training. Klassische Fälle:
- Vorverarbeitung vor dem Split: Standardisieren (Mittelwert/Std), PCA oder Merkmalsauswahl auf allen Daten berechnen und erst danach kreuzvalidieren. Die Validierungsfolds haben dann schon die Transformation mitbestimmt. Richtig: Die Vorverarbeitung gehört in die CV-Schleife und wird in jedem Fold nur auf den Trainingsfolds gefittet (in scikit-learn mit einer
Pipeline). - Duplikate oder abhängige Beispiele: Mehrere Aufnahmen desselben Patienten, mehrere Fotos desselben Objekts. Landen sie in Training und Validierung, misst man Wiedererkennen statt Generalisieren. Richtig: gruppenweise aufteilen (
GroupKFold). - Zeitreihen: Zufälliges Mischen lässt das Modell mit Daten aus der Zukunft trainieren. Richtig: nur mit Vergangenheit trainieren, mit Zukunft validieren (
TimeSeriesSplit).
Wer nach jedem Blick auf das Testergebnis noch „schnell etwas verbessert“, betreibt Modellauswahl auf dem Testset. Das Testset ist danach verbraucht, die Zahl darauf optimistisch.
Weitere Punkte:
- CV-Fehler nach Hyperparametersuche ist optimistisch. Wählt man den besten von vielen Hyperparametern per CV, ist der beste CV-Fehler aus demselben Grund verzerrt wie oben beim Testset. Deshalb braucht man das zurückgehaltene Testset, oder, wenn die Daten knapp sind, eine verschachtelte Kreuzvalidierung (nested CV): außen CV zur Bewertung, innen in jedem äußeren Trainingsteil nochmal CV zur Hyperparameterwahl.
- Stratifizierung (stratified k-fold): Bei unbalancierten Klassen (LA: 5 von 365) kann ein Fold zufällig gar kein positives Beispiel enthalten, Recall und AUC sind dort dann undefiniert. Stratifizierte Folds erhalten das Klassenverhältnis in jedem Fold.
- Nach der Auswahl neu trainieren: CV dient zur Auswahl und Schätzung. Das finale Modell trainiert man mit den gewählten Hyperparametern auf allen Trainings- und Validierungsdaten.
Eine verwandte Resampling-Methode, das Bootstrap, behandelt 5.5.