Ejemplo de predicción de series de tiempo usando redes neuronales en R


8

¿Alguien tiene un breve ejemplo educativo breve sobre cómo usar las redes neuronales ( nneten R por ejemplo) con el propósito de predicción?

Aquí hay un ejemplo, en R, de una serie temporal

T <- seq(0,20,length=200)
Y <- 1 + 3*cos(4*T+2) +.2*T^2 + rnorm(200)
plot(T,Y,type="l")

Esto es solo un ejemplo, pero lo que tengo son datos estacionales saltos.

Respuestas:


15

Rob Hyndman está haciendo una investigación activa sobre el pronóstico con redes nuerales. Recientemente agregó la nnetar()función al forecastpaquete que utiliza el nnetpaquete al que hace referencia para que se ajuste a los datos de series temporales.

http://cran.r-project.org/web/packages/forecast/index.html

El ejemplo de los documentos de ayuda:

fit <- nnetar(lynx)
fcast <- forecast(fit)
plot(fcast)

Rob da más contexto en esta sección específica de su texto en línea: Pronósticos: principios y práctica .

(Y muchas gracias a Rob, obviamente).


Es agradable, pero solo hay redes de retroalimentación
Tommaso Guerrini

2

Estaba buscando lo mismo y me he topado con esta pregunta. Como no he encontrado un ejemplo, he decidido hacer el mío. Tenga en cuenta que no soy un experto en redes neuronales o pronósticos :)

Para modelar series temporales de manera efectiva con redes neuronales (nnets), creo que una propiedad importante que las redes deberían tener es algún tipo de memoria (hacer un seguimiento de lo que sucedió en el pasado). Por lo tanto, las redes simples de alimentación son probablemente una mala idea. Una de las familias en redes que puede simular efectivamente la memoria es la familia de redes neuronales recurrentes y uno de los tipos más conocidos de redes neuronales recurrentes son probablemente las redes Elman (junto con redes de memoria a largo plazo (LSTM) diría). Para obtener más información sobre las redes de Elman, puede consultar el documento original que presenta el concepto o Wikipedia . En resumen, tienen una capa adicional llamada contexto que se usa como un tipo de memoria. La siguiente figura ( fuente ) ilustra la idea

Una red recurrente simple del tipo Elman

Afortunadamente para nosotros, existe el paquete RSNNS en R capaz de adaptarse a las redes de Elman. El paquete se describe en detalles aquí .

Ahora que hemos revisado los conceptos básicos, veamos cómo podemos implementar un ejemplo en R con el paquete RSNNS.

library(RSNNS)

#
# simulate an arima time series example of the length n
#
set.seed(10001)
n <- 100
ts.sim <- arima.sim(list(order = c(1,1,0), ar = 0.7), n = n-1)

#
# create an input data set for ts.sim
# sw = sliding-window size
#
# the last point of the time series will not be used
#   in the training phase, only in the prediction/validation phase
# 
sw <- 1
X <- lapply(sw:(n-2),
       function(ind){
           ts.sim[(ind-sw+1):ind]
       })
X <- do.call(rbind, X)
Y <- sapply(sw:(n-2),
       function(ind){
           ts.sim[ind+1]
       })

# used to validate prediction properties
# on the last point of the series
newX <- ts.sim[(n-sw):(n-1)]
newY <- ts.sim[n]

# build an elman network based on the input
model <- elman(X, Y,
               size = c(10, 10),
               learnFuncParams = c(0.001),
               maxit = 500,
               linOut = TRUE)

#
# plot the results
#
limits <- range(c(Y, model$fitted.values))

plot(Y, type = "l", col="red",
     ylim=limits, xlim=c(0, length(Y)),
     ylab="", xlab="")
lines(model$fitted.values, col = "green", type="l")

points(length(Y)+1, newY, col="red", pch=16)
points(length(Y)+1, predict(model, newdata=newX),
       pch="X", col="green")

Este código debería dar como resultado la siguiente figura ingrese la descripción de la imagen aquí

Entonces, lo que hicimos con el código es el siguiente. Primero, hemos creado un ejemplo de serie temporal (del modelo ARIMA). Después de eso, hemos desacoplado / cortado el ejemplo de la serie de tiempo en entradas de la forma (sw puntos anteriores, punto siguiente) para todos los pares excepto el último (con el siguiente punto como el último punto del ejemplo de serie de tiempo). El parámetro sw se utiliza para definir la "ventana deslizante". No discutiré aquí cuál es el tamaño adecuado para la ventana deslizante, pero solo tenga en cuenta que debido a que las redes de Elman tienen memoria, la ventana deslizante del tamaño uno es más que un enfoque razonable (también, eche un vistazo a esta publicación ).

Una vez realizados los preparativos, simplemente podemos construir una red Elman con la función elman. Hay dos parámetros que debe tener cuidado; el tamaño y los learnFuncParams. El parámetro de tamaño le brinda una forma de definir el tamaño de la red (capa oculta) y la forma en que elige este parámetro es más un arte que una ciencia. Una regla general para learnFuncParams es mantenerlo pequeño si es factible (su poder de procesamiento le permite mantenerlo pequeño / tiene tiempo suficiente para esperar: D).

Y listo, tiene su red neuronal capaz de predecir un / el punto / valor futuro. El poder predictivo de este enfoque para nuestro ejemplo se ilustra en la figura anterior. La curva roja presenta nuestra serie temporal simulada (sin el último punto) y la curva verde que se obtuvo con la red Elman ajustada. El punto rojo denota el último punto (el que no se usó durante el proceso de ajuste) y el punto verde lo que fue predicho por la red ajustada. No está mal :)

Este fue un ejemplo sobre cómo usar RNN (redes de Elman) con R para hacer predicciones / pronósticos. Algunos podrían argumentar que los RNN no son los mejores para el problema y que existen mejores modelos de red para pronosticar. Como no soy un experto en el campo, evitaré discutir estos temas.

Una lectura interesante si desea obtener más información sobre los RNN es una revisión crítica de los RNN en el documento de aprendizaje de secuencia .


Una avenida interesante para explorar, gracias. Me interesará ver cómo funciona esto prediciendo hacia adelante por unos pocos períodos más.
Morgan Ball

1
@ MorganBall: Gracias. No olvide adaptar sus entradas / salidas para entrenar adecuadamente para predicciones más largas / futuras.
iugrina
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.