Utilisation de la validation croisée par pli en k pour la sélection de modèles en série chronologique

70

Question: Je veux être sûr de quelque chose, l’utilisation de la validation croisée à plis multiples avec des séries chronologiques est-elle simple, ou faut-il être particulièrement attentif avant de l’utiliser?

Contexte: Je modélise une série chronologique sur 6 ans (avec une chaîne semi-markovienne), avec un échantillon de données toutes les 5 min. Pour comparer plusieurs modèles, j'utilise une validation croisée de 6 fois en séparant les données en 6 ans. Mes ensembles de formation (pour calculer les paramètres) ont une durée de 5 ans et les ensembles de test ont une longueur de 1. année. Je ne prends pas en compte l'ordre des temps, mes différents sets sont:

  • fold 1: entraînement [1 2 3 4 5], test [6]
  • fold 2: entraînement [1 2 3 4 6], test [5]
  • fold 3: entraînement [1 2 3 5 6], test [4]
  • fold 4: entraînement [1 2 4 5 6], test [3]
  • fold 5: entraînement [1 3 4 5 6], test [2]
  • pli 6: entraînement [2 3 4 5 6], test [1].

Je fais l'hypothèse que chaque année sont indépendantes les unes des autres. Comment puis-je vérifier cela? Existe-t-il une référence montrant l'applicabilité de la validation croisée à plis multiples avec des séries chronologiques?

Mickaël S
la source
Jetez un coup d'œil à cet article que j'ai trouvé très utile francescopochetti.com/…
Henok S Mengistu

Réponses:

69

Les séries chronologiques (ou d'autres données intrinsèquement ordonnées) peuvent être problématiques pour la validation croisée. Si une certaine tendance apparaît la troisième année et persiste pendant les années 4 à 6, votre modèle le détectera, même s'il ne faisait pas partie des années 1 et 2.

Une approche qui est parfois plus fondée sur des principes pour les séries chronologiques est l’enchaînement, dans lequel votre procédure ressemblerait à ceci:

  • fold 1: entraînement [1], test [2]
  • fold 2: entraînement [1 2], test [3]
  • fold 3: entraînement [1 2 3], test [4]
  • fold 4: entraînement [1 2 3 4], test [5]
  • fold 5: entraînement [1 2 3 4 5], test [6]

Cela permet de modéliser avec plus de précision la situation que vous rencontrerez au moment de la prévision, vous permettant de modéliser des données antérieures et de prévoir des données prospectives. Cela vous donnera également une idée de la dépendance de votre modélisation à la taille des données.

Ken Williams
la source
1
Merci. Je comprends, comme l'a dit Zach, que c'est la manière canonique de le faire. Et je comprends pourquoi. Le problème que j’ai avec cela, c’est précisément le fait qu’il tiendra compte de la variation de la taille des données. Je n’obtiendrai donc pas la "vraie" erreur de généralisation de mon modèle. Mais une erreur mixte: généralisation et taille des données. Connaissez-vous d'autres références (autres que M.Hyndman) qui traitent de la validation croisée dans les séries chronologiques? Ne vous méprenez pas, ce n'est pas que je ne fais pas confiance à ce que vous dites et à ce que dit M. Hyndman, c'est parfaitement logique. J'aime simplement avoir plusieurs points de vue sur un problème
Mickaël S
Je crains de ne pas connaître une telle référence, mais je serais intéressé d'en voir une si quelqu'un d'autre en connaît une.
Ken Williams
1
@Wayne, je veux dire que cette solution utilise de plus en plus d'années de données d'entraînement à chaque fois. Dans mes données, il y a bien des différences entre les années, mais pas de tendance apparente ni de saisonnalité.
Mickaël S
3
@Mickael: Vous pouvez utiliser le test fold 1: train [1 2] [3]; fold 2: test de train [2 3] [4]; pli 3: test de train [3 4] [5], etc., si vous craignez d’utiliser de plus en plus de données à chaque pli. À mon avis, avec une technique de semi-MC, il est impossible de brouiller les années, même s'il n'y a pas de tendance.
Wayne
3
@ MickaëlS: J'ai trouvé cet article sciencedirect.com/science/article/pii/S0020025511006773 et j'ai pensé qu'il pourrait être intéressant. Ils comparent cette approche «canonique» à deux autres méthodes - une approche «par bloc» et une approche «sans dépendance».
thebigdog
26

La méthode que j'utilise pour la validation croisée de mon modèle de série chronologique est la validation croisée sur une base continue. Commencez avec un petit sous-ensemble de données à des fins de formation, prévoyez les points de données ultérieurs, puis vérifiez la précision des points de données prévus. Les mêmes points de données prévus sont ensuite inclus dans le prochain jeu de données d'apprentissage et les points de données suivants sont prévus.

Pour rendre les choses intuitives, voici une image pour la même chose:

entrez la description de l'image ici

Un code R équivalent serait:

i <- 36    #### Starting with 3 years of monthly training data 
pred_ets <- c()
pred_arima <- c()
while(i <= nrow(dt)){
  ts <- ts(dt[1:i, "Amount"], start=c(2001, 12), frequency=12)

  pred_ets <- rbind(pred_ets, data.frame(forecast(ets(ts), 3)$mean[1:3]))
	  pred_arima <- rbind(pred_arima, data.frame(forecast(auto.arima(ts), 3)$mean[1:3]))

  i = i + 3
}
names(pred_arima) <- "arima"
names(pred_ets) <- "ets"

pred_ets <- ts(pred_ets$ets, start=c(2005, 01), frequency = 12)
	pred_arima <- ts(pred_arima$arima, start=c(2005, 01), frequency =12)

accuracy(pred_ets, ts_dt)
accuracy(pred_arima, ts_dt)
Jatin Garg
la source
Existe-t-il un moyen de le faire pour des méthodes telles que la régression logistique à l'aide de R?
hlyates
1
@hlyates, Si j'ai bien compris, il vous suffit de modifier un peu le code ci-dessus. Incluez pred_lr (prévisions par régression logistique) et modifiez le nom des colonnes en conséquence.
Jatin Garg
22

La manière "canonique" de procéder à une validation croisée de séries temporelles (du moins telle que décrite par @Rob Hyndman) consiste à "parcourir" l'ensemble de données.

c'est à dire:

  • fold 1: entraînement [1], test [2]
  • fold 2: entraînement [1 2], test [3]
  • fold 3: entraînement [1 2 3], test [4]
  • fold 4: entraînement [1 2 3 4], test [5]
  • fold 5: entraînement [1 2 3 4 5], test [6]

Fondamentalement, votre jeu d’entraînement ne doit pas contenir d’informations postérieures au jeu de test.

Zach
la source
13

Il n’ya rien de mal à utiliser des blocs de données "futures" pour la validation croisée de séries chronologiques dans la plupart des situations. Dans la plupart des situations, je me réfère à des modèles pour des données stationnaires, qui sont les modèles que nous utilisons généralement. Par exemple, lorsque vous adaptez un , avec à une série, vous prenez différences de la série et adaptez un modèle de données stationnaires aux résidus.d > 0 dARIMA(p,d,q)d>0d

Pour que la validation croisée fonctionne comme un outil de sélection de modèle, vous devez avoir une indépendance approximative entre la formation et les données de test. Le problème avec les données chronologiques est que les points de données adjacents sont souvent très dépendants, de sorte que la validation croisée standard échoue. La solution consiste à laisser un espace entre l’échantillon à tester et les échantillons d’entraînement, des deux côtés de l’échantillon . La raison pour laquelle vous devez également laisser un vide avant l'échantillon de test est que la dépendance est symétrique lorsque vous avancez ou reculez dans le temps (pensez à la corrélation).

Cette approche est appelée validation croisée (quitter out, supprimer observations de chaque côté de l'échantillon d'essai) et est décrit dans le présent document. Dans votre exemple, cela ressemblerait à ceci:v hhvvh

  • fold 1: entraînement [1 2 3 4 5h], test [6]
  • fold 2: entraînement [1 2 3 4h h6], test [5]
  • fold 3: entraînement [1 2 3h h5 6], test [4]
  • fold 4: entraînement [1 2h h4 5 6], test [3]
  • fold 5: entraînement [1h h3 4 5 6], test [2]
  • fold 6: entraînement [h2 3 4 5 6], test [1]

Où h indique que h, les observations de l'échantillon d'apprentissage sont supprimées de ce côté.

Matthias Schmidtblaicher
la source
3

Comme l'a commenté @thebigdog, "Sur l'utilisation de la validation croisée pour l'évaluation des prédicteurs de séries temporelles" par Bergmeir et al. discute de la validation croisée dans le contexte de séries chronologiques stationnaires et détermine que le chaînage en aval (proposé par d'autres répondants) est inutile. Remarque, le chaînage en aval s'appelle Evaluation du dernier bloc dans cet article:

En utilisant la validation croisée quintuple standard, aucun effet pratique des dépendances dans les données n'a pu être trouvé, si l'erreur finale est sous-estimée ou surestimée. Au contraire, l'évaluation du dernier bloc a tendance à produire des mesures d'erreur moins robustes que la validation croisée et la validation croisée bloquée.

" Evaluation des modèles de prévision de série chronologique: une étude empirique sur les méthodes d'estimation de la performance " de Cerqueira et al. est d'accord avec cette évaluation. Cependant, pour les séries chronologiques non stationnaires, ils recommandent d'utiliser une variante de Hold-Out, appelée Rep-Holdout. Dans Rep-Holdout, un point aest choisi dans la série temporelle Ypour marquer le début des données de test. Le point aest déterminé à être dans une fenêtre. Ceci est illustré dans la figure ci-dessous:

illustration rep-holdout

Cet article est long et teste de manière exhaustive presque toutes les autres méthodes mentionnées dans les réponses à cette question avec du code accessible au public . Cela inclut la revendication de @Mathias Schmidtblaicher d'inclure des lacunes avant et après les données de test. En outre, j'ai seulement résumé le papier. La conclusion du document implique un arbre de décision pour évaluer les modèles de séries chronologiques!

Seanny123
la source