Zum Hauptinhalt springen

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 kk 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.

TeilAnteilVerwendung
Training und Validierungca. 80 %Modell trainieren, Modelle und Hyperparameter auswählen
Testset (test set)ca. 20 %nur zur abschließenden Schätzung der Leistung
Die Sprechblase auf der Folie

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 nn 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 n−1n-1 und sagt das weggelassene vorher. Das wiederholt man für alle nn Beispiele und mittelt:

CV(n)=1n∑i=1nL(yi, f^(−i)(xi)),\text{CV}_{(n)} = \frac1n\sum_{i=1}^n L\bigl(y_i,\ \hat f^{(-i)}(x_i)\bigr),

wobei f^(−i)\hat f^{(-i)} das Modell ist, das ohne Beispiel ii trainiert wurde, und LL 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 kk etwa gleich große Teile (folds) zerlegt. Für j=1,…,kj=1,\dots,k:

  1. Fold jj ist das Validierungsset, die anderen k−1k-1 Folds sind das Trainingsset.
  2. Modell auf den k−1k-1 Folds trainieren.
  3. Gütemaß EjE_j auf Fold jj berechnen.

Danach mitteln. Haben die Folds nicht dieselbe Größe njn_j, nimmt man ein gewichtetes Mittel:

CV(k)=∑j=1knjn Ej.\text{CV}_{(k)} = \sum_{j=1}^k \frac{n_j}{n}\,E_j.

Jedes Beispiel wird genau einmal zur Validierung benutzt und k−1k-1 mal zum Training.

Frage der Folie: Was passiert bei k=nk=n, was bei k=2k=2?​

  • k=nk=n: Jeder Fold enthält genau ein Beispiel. Das ist LOOCV.
  • k=2k=2: 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

LOOCVk-fach (z. B. k=10k=10)
Zufallnicht zufällig: Es gibt nur eine Art, je eins wegzulassenErgebnis hängt von der zufälligen Aufteilung ab
Aufwandnn Trainingsläufe, oft langsam (für manche Verfahren gibt es eingebaute Abkürzungen)nur kk Trainingsläufe, meist schneller
Verzerrung (bias) der Schätzungam kleinsten: Jedes Modell sieht fast alle Datenetwas größer, meist unproblematisch
Varianz der Schätzunghöher (zwischen komplett neuen Datensätzen)niedriger

Intuition zur Verzerrung: Am Ende will man wissen, wie gut ein Modell ist, das auf allen nn Datenpunkten trainiert wurde. LOOCV-Modelle sehen n−1n-1 Punkte, das ist fast dasselbe. Bei 10-fach sehen sie 0,9 n0{,}9\,n, also ein wenig weniger, und sind deshalb im Mittel ein wenig schlechter.

Intuition zur Varianz (Ergänzung): Die nn 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 (−5, −2, −1-5,\,-2,\,-1) bedeuten vermutlich „leave-kk-out“, −1-1 also LOOCV (Darstellung wie in Kohavi 1995, „A Study of Cross-Validation and Bootstrap“). Beim Datensatz „Rand“ (zufällige Labels) liegt alles bei 50 %.

Standard heute

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 ±\pm Unsicherheit da, z. B. 0,23±0,010{,}23\pm0{,}01. Ohne Fehlerbalken weiß man nicht, ob ein Unterschied zwischen zwei Methoden echt oder Zufall ist.

Ergänzung: Mit den kk Fold-Ergebnissen E1,…,EkE_1,\dots,E_k ist eine gängige (etwas optimistische, weil die Folds nicht unabhängig sind) Angabe der Standardfehler

SE=sk,s2=1k−1∑j=1k(Ej−Eˉ)2.\text{SE} = \frac{s}{\sqrt k},\qquad s^2 = \frac{1}{k-1}\sum_{j=1}^k\bigl(E_j-\bar E\bigr)^2.

Beispiel: Fold-Accuracies 0,80; 0,84; 0,78; 0,82; 0,860{,}80;\ 0{,}84;\ 0{,}78;\ 0{,}82;\ 0{,}86. Mittel Eˉ=0,82\bar E = 0{,}82, Abweichungen −0,02; 0,02; −0,04; 0; 0,04-0{,}02;\ 0{,}02;\ -0{,}04;\ 0;\ 0{,}04, s2=0,004/4=0,001s^2 = 0{,}004/4 = 0{,}001, s≈0,032s\approx 0{,}032, SE≈0,032/5≈0,014\text{SE}\approx 0{,}032/\sqrt5\approx 0{,}014. Ergebnis: 0,82±0,0140{,}82\pm0{,}014.

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 p^(Regen)=5/365\hat p(\text{Regen}) = 5/365 (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-yy“ (Regression, MSE = Varianz von yy). In scikit-learn: DummyClassifier, DummyRegressor.

Typische Fallstricke (Ergänzung, nicht auf den Folien)​

Data Leakage

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).
Testset mehrfach benutzen

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.