133 votos

Uso de la validación cruzada k-fold para la selección de modelos de series temporales

Pregunta: Quiero estar seguro de algo, ¿el uso de la validación cruzada k-fold con series temporales es sencillo, o hay que prestar especial atención antes de usarlo?

Antecedentes: Estoy modelando una serie temporal de 6 años (con cadena de semi-markov), con una muestra de datos cada 5 min. Para comparar varios modelos, estoy utilizando una validación cruzada de 6 veces separando los datos en 6 años, por lo que mis conjuntos de entrenamiento (para calcular los parámetros) tienen una longitud de 5 años, y los conjuntos de prueba tienen una longitud de 1 año. No estoy teniendo en cuenta el orden temporal, por lo que mis conjuntos diferentes son :

  • pliegue 1 : formación [1 2 3 4 5], prueba [6]
  • pliegue 2 : formación [1 2 3 4 6], prueba [5]
  • pliegue 3 : formación [1 2 3 5 6], prueba [4]
  • pliegue 4 : formación [1 2 4 5 6], prueba [3]
  • pliegue 5 : formación [1 3 4 5 6], prueba [2]
  • pliegue 6 : entrenamiento [2 3 4 5 6], prueba [1].

Hago la hipótesis de que cada año es independiente del otro. ¿Cómo puedo verificarlo? ¿Hay alguna referencia que muestre la aplicabilidad de la validación cruzada k-fold con series temporales?

0 votos

Echa un vistazo a este artículo, que me pareció útil francescopochetti.com/

131voto

vitule Puntos 132

Las series temporales (u otros datos intrínsecamente ordenados) pueden ser problemáticas para la validación cruzada. Si surge algún patrón en el año 3 y se mantiene durante los años 4-6, el modelo puede captarlo, aunque no forme parte de los años 1 y 2.

Un enfoque que a veces es más básico para las series temporales es el encadenamiento hacia adelante, donde su procedimiento sería algo así:

  • pliegue 1 : entrenamiento [1], prueba [2]
  • pliegue 2 : entrenamiento [1 2], prueba [3]
  • pliegue 3 : entrenamiento [1 2 3], prueba [4]
  • pliegue 4 : formación [1 2 3 4], prueba [5]
  • pliegue 5 : entrenamiento [1 2 3 4 5], prueba [6]

Esto modela con mayor precisión la situación que se verá en el momento de la predicción, en el que se modelará sobre datos pasados y se predecirá sobre datos futuros. También le dará una idea de la dependencia de su modelización del tamaño de los datos.

5 votos

Gracias. Entiendo, como dijo Zach, que es la forma canónica de hacerlo. Y entiendo por qué. El problema que tengo con eso, es precisamente el hecho de que tendrá en cuenta la variación del tamaño de los datos, por lo que no obtendré el "verdadero" error de generalización de mi modelo. Pero un error mixto : generalización y tamaño de los datos. ¿Conoces otras referencias (aparte de M.Hyndman) que traten sobre la validación cruzada en series temporales? No me malinterpretes, no es que no me fíe de lo que dices y de lo que dice M. Hyndman, tiene mucho sentido. Simplemente me gusta tener varios puntos de vista sobre un problema

0 votos

Me temo que no conozco tal referencia, pero me interesaría ver una si alguien la conoce.

0 votos

@Mickael: Cuando dices "variación del tamaño de los datos" ¿a qué te refieres? ¿Te refieres a que esta solución utiliza cada vez más años de datos de entrenamiento en cada pliegue? ¿O te refieres a una tendencia (por ejemplo, el año 5 tiene valores significativamente mayores que el año 1)?

58voto

mcsheffrey Puntos 11

El método que utilizo para la validación cruzada de mi modelo de series temporales es la validación cruzada continua. Se empieza con un pequeño subconjunto de datos para el entrenamiento, se pronostica para los puntos de datos posteriores y luego se comprueba la precisión de los puntos de datos pronosticados. Los mismos puntos de datos pronosticados se incluyen entonces como parte del siguiente conjunto de datos de entrenamiento y se pronostican los puntos de datos posteriores.

Para que las cosas sean intuitivas, he aquí una imagen de las mismas:

enter image description here

Un código R equivalente sería:

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)

0 votos

¿Hay alguna forma de hacer esto para métodos como la regresión logística utilizando R?

1 votos

@hlyates, A mi entender es posible, solo tienes que modificar un poco el código anterior. Incluir el pred_lr (predicciones por regresión logística) y cambiar el nombre de las columnas en consecuencia.

38voto

Boris Tsirelson Puntos 191

La forma "canónica" de realizar la validación cruzada de series temporales (al menos como se describe por @Rob Hyndman) es "pasar" por el conjunto de datos.

es decir:

  • pliegue 1 : entrenamiento [1], prueba [2]
  • pliegue 2 : entrenamiento [1 2], prueba [3]
  • pliegue 3 : entrenamiento [1 2 3], prueba [4]
  • pliegue 4 : formación [1 2 3 4], prueba [5]
  • pliegue 5 : formación [1 2 3 4 5], prueba [6]

Básicamente, su conjunto de entrenamiento no debe contener información que ocurra después del conjunto de prueba.

23voto

Mike Krebs Puntos 61

No hay nada malo en utilizar bloques de datos "futuros" para la validación cruzada de series temporales en la mayoría de las situaciones. Por la mayoría de las situaciones me refiero a los modelos para datos estacionarios, que son los modelos que solemos utilizar. Por ejemplo, cuando se ajusta un $\mathit{ARIMA}(p,d,q)$ con $d>0$ a una serie, se toma $d$ diferencias de la serie y ajustar un modelo para datos estacionarios a los residuos.

Para que la validación cruzada funcione como herramienta de selección de modelos, se necesita una independencia aproximada entre los datos de entrenamiento y los de prueba. El problema con los datos de las series temporales es que los puntos de datos adyacentes suelen ser muy dependientes, por lo que la validación cruzada estándar fallará. El remedio para esto es dejar un hueco entre la muestra de prueba y las muestras de entrenamiento, en ambos lados de la muestra de ensayo . La razón por la que también hay que dejar un hueco antes de la muestra de prueba es que la dependencia es simétrica cuando se avanza o retrocede en el tiempo (piense en la correlación).

Este enfoque se denomina $hv$ validación cruzada (dejar $v$ fuera, borrar $h$ observaciones a ambos lados de la muestra de ensayo) y se describe en este papel. En su ejemplo, esto se vería así:

  • pliegue 1 : entrenamiento [1 2 3 4 5h], prueba [6]
  • pliegue 2 : formación [1 2 3 4h h6], prueba [5]
  • pliegue 3 : entrenamiento [1 2 3h h5 6], prueba [4]
  • pliegue 4 : formación [1 2h h4 5 6], prueba [3]
  • pliegue 5 : formación [1h h3 4 5 6], prueba [2]
  • fold 6 : formación [h2 3 4 5 6], prueba [ 1]

Donde la h indica que se eliminan h observaciones de la muestra de entrenamiento en ese lado.

0 votos

El objetivo de utilizar K-fold CV es obtener una estimación razonable del rendimiento del modelo cuando no tiene suficientes datos por lo que eliminar más observaciones no tiene sentido.

2 votos

En los datos de series temporales, lo único que se sabe es que existe correlación en serie; si se desea un rendimiento adecuado del modelo, habrá que tenerlo en cuenta.

22voto

MathematicalOrchid Puntos 2113

Como comenta @thebigdog, "On the use of cross-validation for time series predictor evaluation" de Bergmeir et al. discute la validación cruzada en el contexto de las series temporales estacionarias y determina que el encadenamiento hacia adelante (propuesto por otros respondedores) no es útil. Obsérvese que el encadenamiento hacia adelante se denomina evaluación del último bloque en este documento:

Utilizando la validación cruzada estándar de 5 veces, no se pudo encontrar ningún efecto práctico de las dependencias dentro de los datos, con respecto a si el error final está subestimado o sobreestimado. Por el contrario, la evaluación del último bloque tiende a producir medidas de error menos robustas que la validación cruzada y la validación cruzada bloqueada.

" Evaluación de los modelos de previsión de series temporales: Un estudio empírico sobre los métodos de estimación del rendimiento "de Cerqueira et al. está de acuerdo con esta valoración. Sin embargo, para las series temporales no estacionarias, recomiendan utilizar una variante de Hold-Out, denominada Rep-Holdout. En Rep-Holdout, un punto a se elige en la serie temporal Y para marcar el inicio de los datos de la prueba. El punto a se determina que está dentro de una ventana. Esto se ilustra en la siguiente figura:

rep-holdout illustration

Este documento mencionado es largo y prueba exhaustivamente casi todos los otros métodos mencionados en las respuestas a esta pregunta con código disponible públicamente . Esto incluye la afirmación de @Matthias Schmidtblaicher de incluir huecos antes y después de los datos de las pruebas. Además, sólo he resumido el documento. La conclusión real del documento implica un árbol de decisión para evaluar los modelos de series temporales.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X