TATECHATLAS
◎ Deutsch
Mathematik und Modelle / Tipp

Validierung von Prognosen mit TimeSeriesSplit und Fehleranalyse pro Horizont

Nutzen Sie TimeSeriesSplit für zeitlich geordnete Prognosen ohne Datenleckage, berechnen Sie Fehler pro Horizont und wählen Sie eine strikt konsistente Metrik, die den Entscheidungskosten entspricht.

Auf dieser Seite

Verwenden Sie TimeSeriesSplit, um zeitlich geordnete Trainings- und Test-Folds zu generieren, sodass jede Auswertung nur vergangene Daten nutzt. Berechnen Sie anschließend eine Regressionsmetrik separat für jeden Prognosehorizont und vergleichen Sie diese horizon-spezifischen Fehler. Die finale Metrik ist kein einzelner globaler Durchschnitt, sondern eine entscheidungsrelevante Zusammenfassung darüber, wie sich der Fehler mit zunehmendem Horizont verändert. Wählen Sie eine strikt konsistente Scoring-Funktion, wie mean_absolute_error für ein Median-Ziel oder mean_squared_error für ein Mean-Ziel, und verwenden Sie diese sowohl für den Trainingsverlust als auch für die Evaluierung. Diese Abstimmung stellt sicher, dass die Metrik die Kosten der gewählten Punktprognose wahrheitsgetreu widerspiegelt. Wenn beispielsweise bei 12 monatlichen Stichproben TimeSeriesSplit(n_splits=3, test_size=2) drei Folds erstellt, bei denen jedes Testset zwei Monate abdeckt und das Trainingsset nur frühere Monate enthält, und der MAE pro Horizont von 1,2 bei Horizont 1 auf 2,8 bei Horizont 3 steigt, sind die geschäftlichen Kosten einer Entscheidung mit drei Monaten Vorlauf wesentlich höher als bei einer Entscheidung mit einem Monat Vorlauf. Sie können dann entscheiden, ob Sie diese Verschlechterung akzeptieren, weitere Merkmale hinzufügen oder den Prognosehorizont einschränken. Der Ansatz setzt gleichmäßig beabstandete Stichproben und eine Punktprognose voraus, keine vollständige probabilistische Verteilung.

Validierung von Prognosen mit TimeSeriesSplit

TimeSeriesSplit ist ein Cross-Validator, der speziell für zeitlich geordnete Daten entwickelt wurde. Er verhindert Datenleckage (Data Leakage), indem er sicherstellt, dass das Modell nur auf vergangenen Beobachtungen trainiert und auf nachfolgenden, zeitlich geordneten Folds evaluiert wird. Standardmäßige Cross-Validation-Methoden sind für Zeitreihen ungeeignet, da sie potenziell auf zukünftigen Daten trainieren und auf vergangenen Daten evaluieren könnten. TimeSeriesSplit gibt Trainings- und Testindizes so zurück, dass jedes Testset ein späteres Zeitfenster abdeckt als sein entsprechendes Trainingsset. Das Trainingsset akkumuliert Daten aus vorherigen Splits, sodass aufeinanderfolgende Trainingssets Obermengen früherer Sets sind. Diese Struktur entspricht der temporalen Logik der Prognose, bei der zukünftige Werte niemals zur Vorhersage der Vergangenheit verwendet werden dürfen.

Um vergleichbare Metriken über die Folds hinweg zu gewährleisten, müssen die Stichproben gleichmäßig beabstandet sein. Sobald diese Bedingung erfüllt ist, deckt jedes Testset die gleiche Zeitdauer ab, während das Trainingsset wächst. Die Klasse akzeptiert Parameter wie n_splits, max_train_size, test_size und gap. Die Standard-Testgröße ist n_samples // (n_splits + 1), und der gap-Parameter schließt Stichproben am Ende jedes Trainingssets vor dem Testset aus. Die split-Methode liefert Arrays von Trainings- und Testindizes, die zum Slicen der Daten verwendet werden können. Dies ermöglicht es, einfach über die Folds zu iterieren, ein Modell zu fitten und es auf jedem Testfenster zu evaluieren.

Bei einer festen test_size erzeugen die Folds Testsets gleicher Länge. Jeder Fold evaluiert das Modell auf einem anderen Horizont, und der Fehler pro Fold kann separat aufgezeichnet werden. Dies ist die Grundlage für die Analyse des Fehlers über verschiedene Prognosehorizonte hinweg. Der gleiche Evaluierungsschleifen-Ansatz kann erweitert werden, um Vorhersagen für jeden Horizont zu speichern, sodass Metriken pro Horizont und nicht nur pro Fold berechnet werden. Die Kernanforderung bleibt, dass die Daten zeitlich geordnet bleiben und keine zukünftigen Informationen in den Trainingsschritt einfließen.

import numpy as np
from sklearn.model_selection import TimeSeriesSplit
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error

X = np.arange(12).reshape(-1, 1)
y = np.array([1.0, 1.8, 3.2, 4.1, 5.0, 5.9, 6.8, 7.7, 8.6, 9.5, 10.4, 11.3])

tscv = TimeSeriesSplit(n_splits=3, test_size=2)
for fold, (train_idx, test_idx) in enumerate(tscv.split(X), start=1):
    X_train, X_test = X[train_idx], X[test_idx]
    y_train, y_test = y[train_idx], y[test_idx]
    model = LinearRegression()
    model.fit(X_train, y_train)
    pred = model.predict(X_test)
    print(f"Fold {fold}: test indices {test_idx}, MAE {mean_absolute_error(y_test, pred):.3f}")

Analyse des Fehlers über Prognosehorizonte hinweg

Nachdem die Vorhersagen aus jedem Fold gewonnen wurden, besteht der nächste Schritt darin, die Metriken für jeden Prognosehorizont zu vergleichen. Eine einzige globale Metrik verbirgt, wie die Vorhersagequalität abnimmt, wenn der Zeitabstand zum Trainingsset größer wird. Durch die Gruppierung der Fehler nach Horizont lässt sich erkennen, ob Kurzfristprognosen genau sind und Langfristprognosen deteriorieren oder ob das Fehlermuster irregulär ist. Dieser Vergleich ist essenziell, um zu entscheiden, wie weit im Voraus eine Prognose für eine spezifische geschäftliche Aktion vertraut werden kann.

Der Fehler pro Horizont wird berechnet, indem alle Vorhersagen ausgewählt werden, deren Horizont einem bestimmten Wert entspricht, und die gewählte Regressionsmetrik auf die entsprechenden Ist-Werte angewendet wird. Dies erfordert die Speicherung des Horizont-Index für jede Vorhersage, was natürlich geschieht, wenn mehrere Schritte im Voraus von einem einzigen Modell prognostiziert werden oder wenn jeder Fold an einem spezifischen Horizont evaluiert wird. Die resultierende Tabelle oder Grafik zeigt die Fehlertrajektorie über die Horizonte. Sie beantwortet direkt die Frage, wie viel schlechter die Prognose wird, wenn sich das Vorhersagefenster verlängert.

Diese Analyse hilft zudem, strukturelle Fehler von Rauschen zu trennen. Wenn der Fehler stetig mit dem Horizont steigt, fehlen dem Modell möglicherweise die Informationen, die für längerfristige Vorhersagen benötigt werden. Wenn der Fehler an einem bestimmten Horizont sprunghaft ansteigt, kann dies auf einen strukturellen Bruch, Saisonalität oder unzureichende Trainingsdaten für diesen Bereich hindeuten. Die Sichtweise pro Horizont ist informativer als ein einzelner aggregierter Score, da sie aufzeigt, wo die Prognose an Wert verliert. Sie unterstützt zudem den nächsten Schritt, die Metrik mit den Entscheidungskosten zu verknüpfen, da jeder Horizont einer spezifischen Aktion oder einem Risiko zugeordnet werden kann.

from sklearn.metrics import mean_absolute_error

# y_true and y_pred are aligned per horizon
horizon_errors = {}
for horizon in range(1, max_horizon + 1):
    mask = (horizon_index == horizon)
    horizon_errors[horizon] = mean_absolute_error(y_true[mask], y_pred[mask])

Verknüpfung von Metriken mit Entscheidungskosten

Die Wahl der Scoring-Funktion sollte vom ultimativen Ziel und der Anwendung der Vorhersage ausgehen, nicht von der Bequemlichkeit. Es ist nützlich, zwei Schritte zu unterscheiden: die Vorhersage und die Entscheidungsfindung. Die Vorhersage beinhaltet die Wahl einer Eigenschaft oder eines Funktionals der Antwortverteilung, wie etwa den Mittelwert (Mean), den Median oder ein Quantil. Die Entscheidungsfindung beinhaltet das Handeln auf Basis dieser Vorhersage. Die für die Evaluierung verwendete Metrik sollte strikt konsistent mit dem während der Vorhersage gewählten Zielfunktional sein. Eine strikt konsistente Scoring-Funktion garantiert, dass die Wahrheitssage (truth telling) im Erwartungswert eine optimale Strategie ist, was bedeutet, dass die Metrik den Abstand zwischen Vorhersagen und tatsächlichen Zielen korrekt widerspiegelt.

Für Regressoren sind die typischen Zielfunktionale der Mittelwert und der Median. Der mittlere quadratische Fehler (Mean Squared Error) ist auf den Mittelwert ausgerichtet, während der mittlere absolute Fehler (Mean Absolute Error) auf den Median ausgerichtet ist. Die Verwendung einer Metrik, die nicht konsistent mit dem Zielfunktional ist, kann zu irreführenden Vergleichen führen. Wenn beispielsweise ein Modell darauf trainiert wird, den Median vorherzusagen, aber mit dem quadratischen Fehler evaluiert wird, spiegelt die Evaluierung möglicherweise nicht die tatsächlichen Kosten der gewählten Punktprognose wider. Die scikit-learn Dokumentation empfiehlt, eine strikt konsistente Scoring-Funktion für das gewählte Funktional zu verwenden und diese sowohl als Verlustfunktion für das Training als auch als Metrik für die Evaluierung und den Modellvergleich einzusetzen.

Sobald die Metrik gewählt ist, sollte sie mit den geschäftlichen Kosten der Entscheidung verknüpft werden. Die finale Metrik ist nicht nur eine Zahl, sondern ein Proxy für die Kosten von Prognosefehlern. Wenn der MAE pro Horizont bei Horizont 1 etwa 1,2 und bei Horizont 3 etwa 2,8 beträgt, sind die Kosten einer Entscheidung mit drei Monaten Vorlauf mehr als doppelt so hoch wie die einer Entscheidung mit einem Monat Vorlauf. Dieser Vergleich kann die Einschränkung des Prognosehorizonts, das Hinzufügen von Merkmalen oder das Akzeptieren der Verschlechterung rechtfertigen. Die Metrik muss im Kontext der Anwendung interpretiert werden, da derselbe Fehlerwert in verschiedenen Domänen unterschiedliche Konsequenzen haben kann.

from sklearn.metrics import mean_absolute_error, mean_squared_error

# Strictly consistent scoring functions for point forecasts
mae = mean_absolute_error(y_true, y_pred)  # aligns with median target
mse = mean_squared_error(y_true, y_pred)   # aligns with mean target

Auswahl konsistenter Scoring-Funktionen

Eine strikt konsistente Scoring-Funktion sollte so ausgewählt werden, dass sie mit dem Zielfunktional der Punktprognose übereinstimmt. Für ein Mean-Ziel ist der Mean Squared Error die Standardwahl. Für ein Median-Ziel ist der Mean Absolute Error die Standardwahl. Diese Funktionen garantieren, dass der erwartete Score minimiert wird, wenn die Vorhersage dem Zielfunktional entspricht, was die Metrik zu einem wahrheitsgetreuen Maß für die Prognosequalität macht. Die scikit-learn Dokumentation betont, dass es am besten ist, eine einmal gewählte strikt konsistente Scoring-Funktion sowohl als Verlustfunktion für das Modelltraining als auch als Metrik für die Modellevaluierung und den Vergleich zu verwenden.

Die Tabelle der verfügbaren Scorer in der scikit-learn Dokumentation zur Modellevaluierung enthält Regressionsmetriken wie mean_absolute_error, mean_squared_error, root_mean_squared_error und median_absolute_error. Jede hat eine spezifische Ausrichtung auf ein Zielfunktional. Die Wahl sollte durch das geschäftliche Ziel und die statistische Eigenschaft der Prognose getrieben werden, die relevant ist. Wenn das Ziel darin besteht, die durchschnittliche absolute Abweichung zu minimieren, ist der Mean Absolute Error angemessen. Wenn das Ziel darin besteht, die durchschnittliche quadratische Abweichung zu minimieren, ist der Mean Squared Error angemessen. Die Metrik muss konsistent mit dem Vorhersageziel sein, um eine verzerrte Evaluierung zu vermeiden.

Die Verwendung derselben Metrik für Training und Evaluierung stellt sicher, dass das Modell die Größe optimiert, die letztendlich gemessen wird. Diese Abstimmung verhindert Situationen, in denen ein Modell bei einer inkonsistenten Metrik gut abschneidet, aber bei der tatsächlich entscheidungsrelevanten Größe schlecht performt. Die Analyse pro Horizont wird dadurch aussagekräftig, da die Metrik die wahren Kosten der Prognose an jedem Horizont widerspiegelt. Die endgültige Entscheidung kann dann auf der Fehlertrajektorie und den geschäftlichen Auswirkungen von Fehlern bei verschiedenen Horizonten basieren, anstatt auf einem einzigen aggregierten Score, der wichtige Muster verschleiern könnte.

from sklearn.metrics import mean_absolute_error

# Example: 12 monthly samples, 3 folds, test_size=2
# Fold 1 test indices: 6,7; Fold 2 test indices: 8,9; Fold 3 test indices: 10,11
# Per-horizon MAE: horizon 1 = 1.2, horizon 2 = 1.9, horizon 3 = 2.8
# Decision: restrict forecast to horizon 2 or improve long-horizon features

Anwendungsbedingungen

  • Sind die Stichproben gleichmäßig beabstandet, sodass jedes Testset die gleiche Zeitdauer abdeckt?
  • Liegt jedes Testset strikt nach seinem Trainingsset, ohne dass zukünftige Daten für das Training verwendet wurden?
  • Ist die gewählte Metrik strikt konsistent mit dem Zielfunktional, wie z. B. Mittelwert oder Median?
  • Werden Fehler pro Horizont separat berechnet, anstatt alles in einer einzigen globalen Zahl zusammenzufassen?
  • Ist die finale Metrik mit den tatsächlichen geschäftlichen Kosten der Entscheidung verknüpft?
  • Handelt es sich bei der Prognose um eine Punktprognose und nicht um eine vollständige probabilistische Verteilung?
  • Sind die Trainings- und Testsets für jeden Fold zeitlich disjunkt?
  • Wird die Metrik konsistent sowohl für das Modelltraining als auch für die Evaluierung verwendet?

TimeSeriesSplit erfordert gleichmäßig beabstandete Stichproben, um vergleichbare Metriken über die Folds hinweg zu gewährleisten. Der Ansatz setzt eine Punktprognose voraus und keine vollständige probabilistische Verteilung. Er berücksichtigt nicht automatisch asymmetrische geschäftliche Kosten oder Nichtstationarität in der Fehlerstruktur. Vergleiche von Fehlern pro Horizont können bei einer geringen Anzahl von Folds verrauscht sein, und die finale Zusammenfassungsmetrik muss gegen den spezifischen Entscheidungskontext interpretiert werden.

Quellen

  1. scikit-learn: TimeSeriesSplit ↗
  2. scikit-learn: Model evaluation ↗
Nach oben ↑