9 votos

Ejemplo de predicción de series temporales mediante redes neuronales en R

¿Alguien tiene un breve ejemplo educativo de cómo utilizar las redes neuronales ( nnet en R, por ejemplo) con fines de predicción?

He aquí 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 sólo un ejemplo, pero lo que tengo son datos estacionales.

15voto

Shea Parkes Puntos 2014

Rob Hyndman investiga activamente la previsión con redes nuerales. Recientemente ha añadido el nnetar() a la función forecast que utiliza el paquete nnet paquete de referencia para ajustar los datos de series temporales.

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

El ejemplo de la documentación de ayuda:

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

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

(Y un gran agradecimiento a Rob, obviamente).

2voto

sihong xie Puntos 9

Estaba buscando lo mismo y me he topado con esta pregunta. Como no he encontrado un ejemplo he decidido hacer el mío propio. No soy un experto en redes neuronales ni en previsión :)

Para modelar series temporales de forma eficaz con redes neuronales (nnets), creo que una propiedad importante que deben tener las nnets es algún tipo de memoria (mantener un registro de lo ocurrido en el pasado). Por lo tanto, las redes feed-forward simples son probablemente una mala idea. Una de las familias de redes que pueden simular la memoria de forma eficaz es la de las redes neuronales recurrentes, y uno de los tipos más conocidos de redes neuronales recurrentes son probablemente las redes de Elman (junto con las redes de memoria a corto plazo (LSTM), diría yo). Para saber más sobre las redes de Elman puede consultar la página documento original introducir el concepto o mediante Wikipedia . En resumen, tienen una capa adicional llamada contexto que se utiliza como un tipo de memoria. La siguiente figura ( fuente ) ilustra la idea

A Simple Recurrent Network of the Elman type

Por suerte para nosotros, existe el paquete RSNNS en R capaz de ajustar redes de Elman. El paquete se describe en detalle aquí .

Ahora que hemos repasado 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 enter image description here

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

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

Y voilá, ya tienes tu red neuronal capaz de predecir un 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 lo obtenido con la red de Elman ajustada. El punto rojo indica el último punto (el que no se utilizó durante el proceso de ajuste) y el punto verde lo que predijo la red ajustada. No está nada mal :)

Este fue un ejemplo de cómo utilizar RNNs (redes de Elman) con R para hacer predicciones/pronósticos. Algunos podrían argumentar que RNNs no son los mejores para el problema y que hay mejores modelos de red para la previsión. Como no soy un experto en el tema, evitaré discutir estas cuestiones.

Una lectura interesante si desea saber más sobre las RNN es una revisión crítica de las RNN en el aprendizaje secuencial papel.

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