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
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
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.