Análisis de series temporales de validación cruzada


37

He estado usando el paquete caret en R para construir modelos predictivos para clasificación y regresión. Caret proporciona una interfaz unificada para ajustar los hiperparámetros del modelo mediante validación cruzada o arranque de bandas. Por ejemplo, si está construyendo un modelo simple de 'vecinos más cercanos' para la clasificación, ¿cuántos vecinos debe usar? 2? 10? 100? Caret le ayuda a responder esta pregunta volviendo a muestrear sus datos, probando diferentes parámetros y luego agregando los resultados para decidir cuál produce la mejor precisión predictiva.

Me gusta este enfoque porque proporciona una metodología robusta para elegir hiperparámetros del modelo, y una vez que ha elegido los hiperparámetros finales, proporciona una estimación validada cruzada de cuán "bueno" es el modelo, utilizando la precisión para los modelos de clasificación y RMSE para modelos de regresión.

Ahora tengo algunos datos de series temporales para los que quiero construir un modelo de regresión, probablemente usando un bosque aleatorio. ¿Cuál es una buena técnica para evaluar la precisión predictiva de mi modelo, dada la naturaleza de los datos? Si los bosques aleatorios no se aplican realmente a los datos de series de tiempo, ¿cuál es la mejor manera de construir un modelo de conjunto preciso para el análisis de series de tiempo?


Encontré realmente interesante la pregunta. ¿Hay alguna manera de marcar una pregunta para seguirla?
mariana más suave

1
@mariana soffer Haga clic en el icono 'Estrella' debajo de las flechas arriba / abajo.
Zach

44
Caret ahora admite validación cruzada de series temporales
r-bloggers.com/time-series-cross-validation-5

1
@Zach 'Esta es una publicación antigua, pero me pregunto si tienes alguna idea nueva. ¿Conoce algún trabajo reciente sobre validación de modelo secuencial?
horaceT

Respuestas:


10

La técnica de "validación cruzada k-times" clásica "se basa en el hecho de que cada muestra en el conjunto de datos disponible se usa (k-1) veces para entrenar un modelo y 1 vez para probarlo. Dado que es muy importante validar los modelos de series temporales en datos "futuros", este enfoque no contribuirá a la estabilidad del modelo.

Una propiedad importante de muchas series de tiempo (¿la mayoría?) Es la correlación entre los valores adyacentes. Como señaló IrishStat, si utiliza lecturas anteriores como variables independientes de su candidato modelo, esta correlación (o falta de independencia) juega un papel importante y es otra razón por la cual la validación cruzada k-times no es una buena idea.

Una forma de superar este problema es "sobremuestrear" los datos y descorrelacionarlos. Si el proceso de descorrelación es exitoso, usar la validación cruzada en series de tiempo se vuelve menos problemático. Sin embargo, no resolverá el problema de validar el modelo utilizando datos futuros

Aclaraciones

validar el modelo en datos futuros me refiero a construir el modelo, esperar nuevos datos que no estuvieron disponibles durante la construcción del modelo, probar, ajustar, etc., y validarlos en esos nuevos datos.

Al sobremuestrear los datos me refiero a recopilar datos de series de tiempo a una frecuencia mucho más alta de lo que prácticamente se necesita. Por ejemplo: muestrear los precios de las acciones cada 5 segundos, cuando realmente le interesan las modificaciones por hora. Aquí, cuando digo "muestreo" no me refiero a "interpolar", "estimar", etc. Si los datos no pueden medirse con mayor frecuencia, esta técnica no tiene sentido


What is the 'classical' way to validate a model on future data? What do you mean by 'oversampling?' Thank you!
Zach

It should be noted that the statistical properties of real-world time series data (especially financial data) can vary depending on the sampling frequency. For many financial time series there is no straightforward T relationship between the standard deviations sampled with period p and with period pT. In fact the standard deviation tends to increase as the sampling frequency increases. Similarly correlation decreases as the sampling frequency increases (this is commonly know as the Epps effect)
Chris Taylor

@bgbg I'm facing very similar problem and just found your post. Can you cite some references on oversampling and decorrelating time series data? I'd think if the memory in the time series is short enough (could show that fitting an arima), one could just take "non-overlapping" samples and do the usual cross-validation. Any thought appreciated.
horaceT

9

http://robjhyndman.com/researchtips/crossvalidation/ contains a quick tip for cross validation of time series. Regarding using random forest for time series data....not sure although it seems like an odd choice given that the model is fitted using bootstrap samples. There are classic time series methods of course (e.g. ARIMA) that can be used, as can ML techniques like Neural Nets (example example pdf). Perhaps some of the time series experts can comment on how well ML techniques work compared to time series specific algorithms.


2
This pretty much hits the nail on the head. I'm trying to figure out to apply Machine Learning techniques to time series analysis.
Zach

I have had success using random forests for forecasting before. Check out: biomedcentral.com/1471-2105/15/276
captain_ahab

6

Here is some example code for cross-validating time series models. I expanded on this code in my blog, incorporating the foreach package to speed things up and allowing for a possible xreg term in the cross-validation.

Here's a copy of the code from Rob Hyndman's blog:

library(fpp) # To load the data set a10
plot(a10, ylab="$ million", xlab="Year", main="Antidiabetic drug sales")
plot(log(a10), ylab="", xlab="Year", main="Log Antidiabetic drug sales")

k <- 60 # minimum data length for fitting a model
n <- length(a10)
mae1 <- mae2 <- mae3 <- matrix(NA,n-k,12)
st <- tsp(a10)[1]+(k-2)/12

for(i in 1:(n-k))
{
  xshort <- window(a10, end=st + i/12)
  xnext <- window(a10, start=st + (i+1)/12, end=st + (i+12)/12)
  fit1 <- tslm(xshort ~ trend + season, lambda=0)
  fcast1 <- forecast(fit1, h=12)
  fit2 <- Arima(xshort, order=c(3,0,1), seasonal=list(order=c(0,1,1), period=12), 
      include.drift=TRUE, lambda=0, method="ML")
  fcast2 <- forecast(fit2, h=12)
  fit3 <- ets(xshort,model="MMM",damped=TRUE)
  fcast3 <- forecast(fit3, h=12)
  mae1[i,1:length(xnext)] <- abs(fcast1[['mean']]-xnext)
  mae2[i,1:length(xnext)] <- abs(fcast2[['mean']]-xnext)
  mae3[i,1:length(xnext)] <- abs(fcast3[['mean']]-xnext)
}

plot(1:12, colMeans(mae1,na.rm=TRUE), type="l", col=2, xlab="horizon", ylab="MAE",
     ylim=c(0.65,1.05))
lines(1:12, colMeans(mae2,na.rm=TRUE), type="l",col=3)
lines(1:12, colMeans(mae3,na.rm=TRUE), type="l",col=4)
legend("topleft",legend=c("LM","ARIMA","ETS"),col=2:4,lty=1)

Results


Hi Zach. I implemented a slightly different version of Hyndman's code in order to detect the appropriate number of terms for a regression model with time series. Unfortunately, the CV error plot showed several local minima which made me question about how to select the number of terms correctly. The full problem is described here. Have you faced something similar before?
jroberayalas

5

If you have time series data then you might have a "degrees of freedom problem" . For example if you have 4 observations taken at hourly intervals and then decide to use 241 observations at 1minute intervals, you have 241 observations but they are not necessarily independent. When you submit these 241 values/measurements to an analytical package, the package might expect that these are 241 independent values as it proceeds to perform it's particular magic. If you have time series data you might have to upgrade your analytics. I don't know the program you refer to but it is a reasonable guess on my part ( I could be wrong ! ) that it's tests ( F tests / T tests ...etc ) probably don't apply to your problem set.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.