Datenlecks im Training
Wenn Information aus der Zukunft oder aus dem Testsatz ins Training gelangt: die häufigsten Formen, ihre Anzeichen und wie man sie ausschließt.
Die Idee
Ein Leck ist jede Information, die dem Modell im Training zur Verfügung stand, im echten Einsatz aber nicht. Das Modell nutzt sie, sieht großartig aus und versagt später.
Die drei Formen
| Form | Beispiel |
|---|---|
| Zielleck | Ein Merkmal, das erst nach der Entscheidung entsteht, etwa das Stornodatum bei einer Stornoprognose |
| Zeitleck | Ein Wert aus der Zukunft, etwa der Monatsdurchschnitt bei einer Tagesprognose |
| Gruppenleck | Derselbe Kunde in Training und Test, mit fast identischen Fällen |
Die Prüfliste
- Für jedes Merkmal die Frage stellen: Stand dieser Wert zum Vorhersagezeitpunkt zur Verfügung?
- Kennungen, Zeitstempel und laufende Nummern aus den Merkmalen entfernen; sie kodieren oft die Reihenfolge und damit das Ziel.
- Skalierung, Imputation und Kodierung in die Pipeline, damit sie je Faltung nur aus dem Trainingsteil lernen.
- Bei mehreren Fällen je Person nach Gruppen aufteilen.
- Bei Zeitreihen ausschließlich vorwärts validieren, mit einer Lücke in Höhe der Vorlaufzeit.
- Vor der Aufteilung entdoppeln, nicht danach.
Ein Leck aufspüren
import numpy as np
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.model_selection import cross_val_score
def verdaechtige_merkmale(X, y, namen, cv=5):
"""Jedes Merkmal einzeln als alleinigen Praediktor testen.
Ein einzelnes Merkmal mit sehr hoher AUC ist fast immer ein Leck."""
for i, name in enumerate(namen):
s = cross_val_score(HistGradientBoostingClassifier(max_iter=60),
X[:, [i]], y, cv=cv, scoring="roc_auc").mean()
if s > 0.90:
print(f"VERDACHT {name}: AUC {s:.3f} allein")Ein einzelnes Merkmal, das für sich genommen eine AUC über 0,9 erreicht, ist bei einem realen betrieblichen Problem beinahe immer eine verkleidete Kopie des Ziels.
Das Zeitleck, präzise
Der Fehler liegt fast nie in der Formel, sondern in der Erhebung: Ein Feld in der Datenbank trägt oft nur den letzten Änderungszeitpunkt, nicht den Entstehungszeitpunkt. Ein Statusfeld, das heute „abgeschlossen" enthält, sagt nichts darüber, was vor sechs Monaten darin stand. Ohne Historisierung ist ein Zeitleck praktisch unvermeidbar.
Benchmark-Kontamination
Bei großen Sprachmodellen tritt eine besondere Form auf: Öffentliche Testdaten waren im Vortraining enthalten. Die üblichen Prüfungen:
- N-Gramm-Überlappung. Prüfen, ob längere Wortfolgen des Testsatzes im Trainingsmaterial vorkommen.
- Kanarienvogel-Zeichenketten. Eindeutige Markierungen in Testdaten, die im Modell nicht auftauchen dürfen.
- Zeitschnitt. Nur Aufgaben verwenden, die nach dem Trainingsstichtag entstanden sind.
- Umformulierte Fassungen. Dieselbe Aufgabe neu formuliert stellen. Ein deutlicher Einbruch deutet auf Auswendiglernen.
Der letzte Punkt ist der aussagekräftigste und der billigste. Ein Modell, das eine bekannte Aufgabe löst und dieselbe Aufgabe mit anderen Zahlen nicht, hat sie nicht verstanden, sondern gesehen. Siehe Benchmarks lesen.
Was zu tun ist, wenn ein Leck gefunden wird
- 01
Nicht heimlich beheben
Alle bisher berichteten Zahlen sind ungültig. Das gehört gesagt.
- 02
Ursache dokumentieren
Nicht nur das Merkmal entfernen, sondern festhalten, wie es hineingelangte.
- 03
Prüfung in die Pipeline aufnehmen
Damit dieselbe Form nicht wiederkehrt.
- 04
Neu bewerten
Mit dem ursprünglichen Testsatz, sofern der nicht ebenfalls betroffen ist.