EMZETT.
Login

Kreuzvalidierung und Datenaufteilung: Modelle fair testen

Kurz: Trainings-, Validierungs- und Testdaten müssen getrennt bleiben; Kreuzvalidierung nutzt die Daten mehrfach in wechselnden Rollen, um die Leistung zuverlässiger zu schätzen.

Genauer: Ein Modell, das am Trainingsdatensatz gemessen wird, ist ein Schummler: Es hat die Antworten gesehen. Erst unbekannte Daten zeigen die echte Leistung (Generalisierung).

Im Detail

Drei Datensätze

  • Training (z. B. 70 %): Modell lernt Parameter.
  • Validierung (15 %): Hyperparameter wählen, Modelle vergleichen, Early Stopping.
  • Test (15 %): einmalig am Ende die finale Leistung messen, nie zum Tunen benutzen (sonst „Test-Daten-Leck“, optimistische Zahlen).
  • Zufälliges Mischen (train_test_split, random_state fixieren) und Stratifizierung (Klassenverhältnis erhalten).

k-fache Kreuzvalidierung

Daten in k Teile (Folds) teilen (z. B. 5): k-mal wird ein Teil zum Testen genutzt, die übrigen k−1 zum Trainieren; Mittelwert und Streuung der Ergebnisse zeigen Leistung und Stabilität.

from sklearn.model_selection import cross_val_score, StratifiedKFold
scores = cross_val_score(modell, X, y, cv=StratifiedKFold(5, shuffle=True, random_state=0), scoring='f1')
print(scores.mean(), scores.std())

Vorteile: alle Daten werden genutzt, weniger Zufallsabhängigkeit; Leave-One-Out (k = n) bei kleinen Daten (teuer). Nested CV: äußere Schleife für Bewertung, innere für Hyperparameter-Suche (vermeidet Optimismus).

Sonderfälle

  • Zeitreihen: nicht mischen! Zukunft darf nicht in Training. TimeSeriesSplit (Training = Vergangenheit, Test = Zukunft).
  • Gruppen (mehrere Zeilen je Person/Patient/Gerät): GroupKFold, damit dieselbe Person nicht in Training und Test steckt.
  • Klassen-Ungleichgewicht: stratifizieren, passende Metriken (F1, PR-AUC).
  • Duplikate/Near-Duplicates vor dem Split entfernen.
  • Wenig Daten: Kreuzvalidierung, Bootstrapping, einfachere Modelle.

Typische Fehler (Daten-Leck)

  • Skalieren/Imputieren/Feature-Auswahl auf dem gesamten Datensatz vor dem Split → Information fließt aus dem Test ins Training. Lösung: Pipeline (make_pipeline) mit Vorverarbeitung nur auf Trainingsfolds.
  • Ziel-Leck: Merkmal enthält die Antwort indirekt (z. B. „Behandlung erfolgt“ bei Krankheitsvorhersage).
  • Zu oft am Testset iterieren.
  • Verteilungsverschiebung (Produktion ≠ Trainingsdaten): Monitoring.
  • Berichten: Mittelwert ± Standardabweichung, Basislinie (z. B. Mehrheitsklasse), Konfidenz.
  • Gute Praxis: Baseline zuerst, ein sauberes Holdout-Test, Ergebnisse reproduzierbar (Seeds, Versionen).

Siehe auch: Overfitting und Underfitting, Metriken: Precision, Recall und F1, Hyperparameter-Suche, Zeitreihen und Prognosen