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

70

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

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

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

Estoy haciendo la hipótesis de que cada año son independientes entre sí. ¿Cómo puedo verificar eso? ¿Hay alguna referencia que muestre la aplicabilidad de la validación cruzada k-fold con series de tiempo?

Mickaël S
fuente
Echa un vistazo a este artículo, que encontré útil francescopochetti.com/…
Henok S Mengistu

Respuestas:

69

Las series de tiempo (u otros datos ordenados intrínsecamente) pueden ser problemáticos para la validación cruzada. Si surge algún patrón en el año 3 y permanece durante los años 4-6, entonces su modelo puede retomarlo, a pesar de que no fue parte de los años 1 y 2.

Un enfoque que a veces tiene más principios para las series de tiempo es el encadenamiento hacia adelante, donde su procedimiento sería algo como esto:

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

Eso modela con mayor precisión la situación que verá en el momento de la predicción, donde modelará sobre datos pasados ​​y pronosticará sobre datos prospectivos. También le dará una idea de la dependencia de su modelado en el tamaño de los datos.

Ken Williams
fuente
1
Gracias. Entiendo, como dijo Zach, es la forma canónica de hacerlo. Y entiendo por qué. El problema que tengo con eso, es exactamente el hecho de que tendrá en cuenta la variación del tamaño de los datos, por lo que no obtendré el error de generalización "verdadero" de mi modelo. Pero un error mixto: generalización y tamaño de datos. ¿Conoces otras referencias (aparte de M.Hyndman) que se ocupen de la validación cruzada en series de tiempo? No me malinterpretes, no es que no esté confiando en lo que estás diciendo y en lo que dice M. Hyndman, tiene mucho sentido. Simplemente me gusta tener varios puntos de vista sobre un problema
Mickaël S
Me temo que no conozco esa referencia, pero me interesaría ver una si alguien más la conoce.
Ken Williams
1
@Wayne, quiero decir que esta solución utiliza cada vez más años de datos de entrenamiento en cada pliegue. En mis datos definitivamente hay diferencias entre años, pero no hay tendencia aparente o estacionalidad.
Mickaël S
3
@Mickael: Puedes usar el pliegue 1: prueba de tren [1 2] [3]; pliegue 2: prueba de tren [2 3] [4]; pliegue 3: entrene [3 4] prueba [5], etc., si le preocupa usar más y más datos con cada pliegue. Mi conjetura es que con una técnica semi-MC no puedes revolver los años, incluso si no hay tendencia.
Wayne
3
@ MickaëlS: Encontré este artículo sciencedirect.com/science/article/pii/S0020025511006773 y pensé que podría ser de interés. Comparan este enfoque 'canónico' con otros dos métodos: un enfoque de 'bloqueo de bloques' y un enfoque de 'no dependiente'.
thebigdog
26

El método que uso para validar mi modelo de series temporales es la validación cruzada de forma continua. Comience con un pequeño subconjunto de datos para fines de capacitación, pronostique los puntos de datos posteriores y luego verifique la precisión de los puntos de datos pronosticados. Los mismos puntos de datos pronosticados se incluyen como parte del próximo conjunto de datos de entrenamiento y se pronostican los puntos de datos posteriores.

Para hacer las cosas intuitivas, aquí hay una imagen para lo mismo:

ingrese la descripción de la imagen aquí

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)
Jatin Garg
fuente
¿Hay alguna manera de hacer esto para métodos como la regresión logística usando R?
Hlyates
1
@hlyates, en mi opinión, es posible, solo necesita modificar un poco el código anterior. Incluya pred_lr (predicciones por regresión logística) y cambie el nombre de las columnas en consecuencia.
Jatin Garg
22

La forma "canónica" de hacer una validación cruzada de series temporales (al menos como lo describe @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: entrenamiento [1 2 3 4], prueba [5]
  • pliegue 5: entrenamiento [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.

Zach
fuente
13

No hay nada de malo en usar bloques de datos "futuros" para la validación cruzada de series temporales en la mayoría de las situaciones. En la mayoría de las situaciones, me refiero a los modelos de datos estacionarios, que son los modelos que usamos habitualmente. Por ejemplo, cuando ajusta un , con a una serie, toma diferencias de la serie y ajusta un modelo para datos estacionarios a los residuos.d > 0 dARIMA(p,d,q)d>0d

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

Este enfoque se denomina validación cruzada (dejar fuera, eliminar las observaciones a ambos lados de la muestra de prueba) y se describe en este documento. En su ejemplo, esto se vería así:v hhvvh

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

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

Matthias Schmidtblaicher
fuente
3

Como comentó @thebigdog, "Sobre el uso de la validación cruzada para la evaluación de predictores de series de tiempo" por Bergmeir et al. analiza la validación cruzada en el contexto de series temporales estacionarias y determina que el encadenamiento directo (propuesto por otros respondedores) no es útil. Tenga en cuenta que el encadenamiento directo se denomina Evaluación de ú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 modelos de predicción de series temporales: un estudio empírico sobre métodos de estimación del rendimiento " por Cerqueira et al. está de acuerdo con esta evaluación. Sin embargo, para series de tiempo no estacionarias, recomiendan usar una variación en Hold-Out, llamada Rep-Holdout. En Rep-Holdout, ase elige un punto en la serie temporal Ypara marcar el comienzo de los datos de prueba. Se adetermina que el punto está dentro de una ventana. Esto se ilustra en la siguiente figura:

Ilustración de retención de representantes

Este documento mencionado es extenso 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 vacíos antes y después de los datos de prueba. Además, solo he resumido el artículo. ¡La conclusión real del documento implica un árbol de decisión para evaluar modelos de series temporales!

Seanny123
fuente