TATECHATLAS
◎ Français
Mathématiques et modèles / Conseil

Validation des prévisions avec TimeSeriesSplit et analyse des erreurs par horizon

Utilisez TimeSeriesSplit pour évaluer des prévisions chronologiques sans fuite de données, calculez les erreurs par horizon et choisissez une métrique strictement cohérente correspondant au coût de la décision.

Dans ce guide

Utilisez TimeSeriesSplit pour générer des plis d'entraînement et de test ordonnés dans le temps afin que chaque évaluation n'utilise que des données passées, puis calculez une métrique de régression séparément pour chaque horizon de prévision et comparez ces erreurs par horizon. La métrique finale n'est pas une simple moyenne globale ; c'est le résumé pertinent pour la décision sur la façon dont l'erreur évolue à mesure que l'horizon s'éloigne. Choisissez une fonction de score strictement cohérente, telle que mean_absolute_error pour une cible médiane ou mean_squared_error pour une cible moyenne, et utilisez-la à la fois pour la perte d'entraînement et pour l'évaluation. Cet alignement garantit que la métrique reflète fidèlement le coût de la prévision ponctuelle choisie. Par exemple, avec 12 échantillons mensuels, TimeSeriesSplit(n_splits=3, test_size=2) crée trois plis où chaque ensemble de test couvre deux mois et l'ensemble d'entraînement ne contient que les mois précédents. Si la MAE par horizon passe de 1,2 à l'horizon 1 à 2,8 à l'horizon 3, le coût commercial d'une décision à trois mois est matériellement plus élevé qu'une décision à un mois. Vous pouvez alors décider d'accepter la dégradation, d'ajouter des caractéristiques ou de restreindre l'horizon de prévision. L'approche suppose des échantillons équidistants et une prévision ponctuelle, et non une distribution probabiliste complète.

Validation des prévisions avec TimeSeriesSplit

TimeSeriesSplit est un validateur croisé conçu pour les données ordonnées dans le temps. Il empêche la fuite de données en garantissant que le modèle est entraîné uniquement sur des observations passées et évalué sur des plis temporels subséquents. Les méthodes de validation croisée standard sont inappropriées pour les séries temporelles car elles peuvent entraîner sur des données futures et évaluer sur des données passées. TimeSeriesSplit renvoie des indices d'entraînement et de test de sorte que chaque ensemble de test couvre une fenêtre temporelle postérieure à son ensemble d'entraînement. L'ensemble d'entraînement accumule les données des divisions précédentes, et les ensembles d'entraînement successifs sont des sur-ensembles des précédents. Cette structure correspond à l'ordre temporel de la prévision, où les valeurs futures ne doivent jamais être utilisées pour prédire le passé.

Pour garantir des métriques comparables entre les plis, les échantillons doivent être équidistants. Une fois cette condition remplie, chaque ensemble de test couvre la même durée temporelle tandis que l'ensemble d'entraînement s'agrandit. La classe accepte des paramètres tels que n_splits, max_train_size, test_size et gap. La taille de test par défaut est n_samples // (n_splits + 1), et le paramètre gap exclut des échantillons de la fin de chaque ensemble d'entraînement avant l'ensemble de test. La méthode split produit des tableaux d'indices d'entraînement et de test qui peuvent être utilisés pour découper les données. Cela permet de boucler facilement sur les plis, d'ajuster un modèle et de l'évaluer sur chaque fenêtre de test.

Pour une valeur de test_size fixe, les plis produisent des ensembles de test de longueur égale. Chaque pli évalue le modèle sur un horizon différent, et l'erreur par pli peut être enregistrée séparément. C'est la base de l'analyse de l'erreur à travers les horizons de prévision. La même boucle d'évaluation peut être étendue pour stocker les prédictions pour chaque horizon afin que les métriques soient calculées par horizon plutôt que seulement par pli. L'exigence clé est que les données restent ordonnées dans le temps et qu'aucune information future ne s'infiltre dans l'étape d'entraînement.

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 de l'erreur à travers les horizons de prévision

Après avoir obtenu les prédictions de chaque pli, l'étape suivante consiste à comparer les métriques sur chaque horizon de prévision. Une métrique globale unique masque la façon dont la qualité de la prédiction se dégrade à mesure que l'écart temporel avec l'ensemble d'entraînement augmente. En regroupant les erreurs par horizon, vous pouvez voir si les prévisions à court terme sont précises et si les prévisions à long terme se détériorent, ou si le schéma d'erreur est irrégulier. Cette comparaison est essentielle pour décider jusqu'à quel point une prévision peut être fiable pour une action commerciale spécifique.

L'erreur par horizon est calculée en sélectionnant toutes les prédictions dont l'horizon correspond à une valeur donnée et en appliquant la métrique de régression choisie aux valeurs réelles correspondantes. Cela nécessite de stocker l'indice d'horizon pour chaque prédiction, ce qui est naturel lors de la prévision de plusieurs étapes à l'avance à partir d'un seul modèle ou lors de l'évaluation de chaque pli à un horizon spécifique. Le tableau ou le graphique résultant montre la trajectoire de l'erreur à travers les horizons. Il répond directement à la question de savoir à quel point la prévision s'aggrave à mesure que la fenêtre de prédiction s'allonge.

Cette analyse aide également à séparer l'erreur structurelle du bruit. Si l'erreur augmente régulièrement avec l'horizon, le modèle peut manquer d'informations nécessaires pour des prédictions à plus long terme. Si l'erreur grimpe brusquement à un horizon particulier, cela peut indiquer une rupture structurelle, une saisonnalité ou des données d'entraînement insuffisantes pour cette plage. La vue par horizon est plus informative qu'un score agrégé unique car elle révèle où la prévision perd de sa valeur. Elle soutient également l'étape suivante consistant à lier la métrique aux coûts de décision, car chaque horizon peut être associé à une action ou un risque spécifique.

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

Lier les métriques aux coûts de décision

Le choix de la fonction de score doit partir de l'objectif final et de l'application de la prédiction, et non de la commodité. Il est utile de distinguer deux étapes : la prédiction et la prise de décision. La prédiction consiste à choisir une propriété ou une fonctionnelle de la distribution de réponse, telle que la moyenne, la médiane ou un quantile. La prise de décision consiste à agir sur la base de cette prédiction. La métrique utilisée pour l'évaluation doit être strictement cohérente avec la fonctionnelle cible choisie lors de la prédiction. Une fonction de score strictement cohérente garantit que la vérité est une stratégie optimale en espérance, ce qui signifie que la métrique reflète fidèlement la distance entre les prédictions et les cibles réelles.

Pour les régresseurs, les fonctionnelles cibles typiques sont la moyenne et la médiane. L'erreur quadratique moyenne (MSE) est alignée avec la moyenne, tandis que l'erreur absolue moyenne (MAE) est alignée avec la médiane. L'utilisation d'une métrique qui n'est pas cohérente avec la fonctionnelle cible peut produire des comparaisons trompeuses. Par exemple, si le modèle est entraîné pour prédire la médiane mais évalué avec l'erreur quadratique, l'évaluation peut ne pas refléter le coût réel de la prévision ponctuelle choisie. La documentation de scikit-learn recommande d'utiliser une fonction de score strictement cohérente pour la fonctionnelle choisie et de l'utiliser à la fois comme fonction de perte pour l'entraînement et comme métrique pour l'évaluation et la comparaison des modèles.

Une fois la métrique choisie, elle doit être connectée au coût commercial de la décision. La métrique finale n'est pas seulement un nombre ; c'est un proxy pour le coût des erreurs de prévision. Si la MAE par horizon est de 1,2 à l'horizon 1 et de 2,8 à l'horizon 3, le coût d'une décision à trois mois est plus du double de celui d'une décision à un mois. Cette comparaison peut justifier la restriction de l'horizon de prévision, l'ajout de caractéristiques ou l'acceptation de la dégradation. La métrique doit être interprétée dans le contexte de l'application, car une même valeur d'erreur peut avoir des conséquences différentes selon les domaines.

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

Sélection de fonctions de score cohérentes

Une fonction de score strictement cohérente doit être sélectionnée afin qu'elle s'aligne avec la fonctionnelle cible de la prévision ponctuelle. Pour une cible moyenne, l'erreur quadratique moyenne est le choix standard. Pour une cible médiane, l'erreur absolue moyenne est le choix standard. Ces fonctions garantissent que le score attendu est minimisé lorsque la prédiction est égale à la fonctionnelle cible, ce qui fait de la métrique une mesure véridique de la qualité de la prévision. La documentation de scikit-learn souligne qu'une fois qu'une fonction de score strictement cohérente est choisie, il est préférable de l'utiliser à la fois comme fonction de perte pour l'entraînement du modèle et comme métrique pour l'évaluation et la comparaison du modèle.

Le tableau des évaluateurs disponibles dans la documentation d'évaluation des modèles de scikit-learn comprend des métriques de régression telles que mean_absolute_error, mean_squared_error, root_mean_squared_error et median_absolute_error. Chacune a un alignement spécifique avec une fonctionnelle cible. Le choix doit être guidé par l'objectif commercial et la propriété statistique de la prévision qui importe. Si l'objectif est de minimiser l'écart absolu moyen, la MAE est appropriée. Si l'objectif est de minimiser l'écart quadratique moyen, la MSE est appropriée. La métrique doit être cohérente avec la cible de prédiction pour éviter une évaluation biaisée.

L'utilisation de la même métrique pour l'entraînement et l'évaluation garantit que le modèle optimise la quantité qui sera mesurée. Cet alignement évite les situations où un modèle performe bien sur une métrique incohérente mais mal sur la quantité réellement pertinente pour la décision. L'analyse par horizon devient alors significative car la métrique reflète le coût réel de la prévision à chaque horizon. La décision finale peut être basée sur la trajectoire de l'erreur et l'impact commercial des erreurs à différents horizons, plutôt que sur un score agrégé unique qui pourrait masquer des schémas importants.

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

Conditions d’application

  • Les échantillons sont-ils équidistants afin que chaque ensemble de test couvre la même durée temporelle ?
  • Chaque ensemble de test est-il strictement postérieur à son ensemble d'entraînement, sans utilisation de données futures pour l'entraînement ?
  • La métrique choisie est-elle strictement cohérente avec la fonctionnelle cible, telle que la moyenne ou la médiane ?
  • Les erreurs par horizon sont-elles calculées séparément au lieu de tout condenser en un seul chiffre global ?
  • La métrique finale est-elle liée au coût commercial réel de la décision ?
  • S'agit-il d'une prévision ponctuelle plutôt que d'une distribution probabiliste complète ?
  • Les ensembles d'entraînement et de test sont-ils disjoints dans le temps pour chaque pli ?
  • La métrique est-elle utilisée de manière cohérente pour l'entraînement et l'évaluation du modèle ?

TimeSeriesSplit nécessite que les échantillons soient équidistants pour garantir des métriques comparables entre les plis. L'approche suppose une prévision ponctuelle plutôt qu'une distribution probabiliste complète. Elle ne prend pas automatiquement en compte les coûts commerciaux asymétriques ou la non-stationnarité de la structure d'erreur. Les comparaisons d'erreurs par horizon peuvent être bruitées lorsque le nombre de plis est faible, et la métrique de synthèse finale doit être interprétée par rapport au contexte décisionnel spécifique.

Sources

  1. scikit-learn: TimeSeriesSplit ↗
  2. scikit-learn: Model evaluation ↗
Retour en haut ↑