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_statefixieren) 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