Kreuzvalidierung und Datensplits
Wie man Daten aufteilt, ohne sich selbst zu betrügen: k-fache Validierung, gruppierte und zeitliche Splits und der Testsatz, den man genau einmal anfasst.
Die Idee
Wer eine Prüfung mit genau den Aufgaben schreibt, die er geübt hat, erfährt nichts über sein Können. Deshalb hält man einen Teil der Daten zurück und rührt ihn während der ganzen Entwicklung nicht an.
Die drei Teile
| Teil | Wofür | Wie oft angefasst |
|---|---|---|
| Training | Das Modell anpassen | ständig |
| Validierung | Hyperparameter und Schwellwerte wählen | oft |
| Test | Die endgültige Zahl belegen | genau einmal |
Welcher Split zu welchen Daten
| Datenlage | Verfahren | Warum |
|---|---|---|
| Unabhängige Fälle | KFold, StratifiedKFold | Standard |
| Mehrere Fälle je Person oder Kunde | GroupKFold | Sonst steht dieselbe Person in beiden Teilen |
| Zeitreihe | TimeSeriesSplit | Zukunft darf die Vergangenheit nicht erklären |
| Sehr wenige Daten | RepeatedStratifiedKFold | Schätzung wird ruhiger |
| Sehr seltene Klasse | Stratifiziert, plus Bootstrap | Sonst enthalten Faltungen null Positive |
import numpy as np
from sklearn.model_selection import GroupKFold, cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=900, n_features=12, random_state=0)
kunde = np.repeat(np.arange(90), 10) # 10 Faelle je Kunde
zufaellig = cross_val_score(LogisticRegression(max_iter=2000), X, y, cv=5)
gruppiert = cross_val_score(LogisticRegression(max_iter=2000), X, y,
cv=GroupKFold(5), groups=kunde)
print("zufaellig ", zufaellig.mean().round(3))
print("gruppiert ", gruppiert.mean().round(3))
# Die zweite Zahl ist die ehrliche. Die Luecke ist das Ausmass des Leakage.- Skalierung, Imputation und Merkmalsauswahl gehören in die Pipeline, nicht vor den Split.
- Bei Zeitreihen immer vorwärts validieren, nie mischen.
- Die Streuung über die Faltungen mitberichten, nicht nur den Mittelwert.
- Den Testsatz vor der ersten Zeile Modellcode abtrennen und wegsperren.
Die Schätzung
Der Kompromiss: kleines k heißt kleinere Trainingsmengen und damit eine nach
oben verzerrte Fehlerschätzung; großes k heißt geringere Verzerrung, aber
stark korrelierte Modelle und dadurch eine unterschätzte Streuung. Fünf bis zehn
Faltungen sind die übliche Wahl, weil beide Effekte dort klein sind.
Verschachtelte Kreuzvalidierung
Wer Hyperparameter mit derselben Kreuzvalidierung wählt, mit der er auch die
Güte schätzt, erhält eine zu optimistische Zahl. Der saubere Aufbau hat zwei
Schleifen: die innere wählt die Hyperparameter, die äußere schätzt die Güte des
gesamten Auswahlverfahrens. Der Aufwand ist k_außen × k_innen Trainingsläufe,
bei 5 × 5 also 25 statt 5.
Für große Modelle ist das nicht bezahlbar. Dort ersetzt man es durch einen festen dreiteiligen Split mit einem zurückgehaltenen Testsatz und dokumentiert, wie viele Konfigurationen auf der Validierung geprüft wurden. Diese Zahl gehört zwingend in den Bericht, weil sie das Ausmaß der Mehrfachtestung angibt.
Zeitliche Splits und Vorlaufzeit
Bei Vorhersagen mit Vorlaufzeit gehört zwischen Trainings- und Validierungsteil eine Lücke von genau dieser Länge. Wer eine Nachfrage 14 Tage im Voraus vorhersagen will, aber bis einen Tag vor dem Zielzeitpunkt trainiert, misst eine Güte, die im Betrieb nie erreichbar ist.
Passende Kurse und Quellen
Modellbewertung in scikit-learn
Die vollständige Übersicht der Bewertungsmaße mit ihren Fallstricken. Die kürzeste Antwort auf die Frage, warum Genauigkeit meist die falsche Zahl ist.
Die kürzeste Antwort auf die Frage, warum Genauigkeit meist die falsche Zahl ist.
The Elements of Statistical Learning
Die statistische Sicht auf maschinelles Lernen, seit zwanzig Jahren die Referenz für Bias, Varianz und Modellwahl. Anspruchsvoll, frei als PDF.
Für alle mit statistischem Vorwissen; ohne dieses ist der Einstieg mühsam.