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