Cherchait la même chose et sont tombés sur cette question. Comme je n'ai pas trouvé d'exemple, j'ai décidé d'en créer un. Attention, je ne suis pas un expert des réseaux neuronaux ou des prévisions :)
Pour modéliser efficacement les séries temporelles avec des réseaux de neurones (réseaux), je crois qu'une propriété importante que les réseaux devraient avoir est une sorte de mémoire (garder une trace de ce qui s'est passé dans le passé). Par conséquent, les filets simples à action directe sont probablement une mauvaise idée. L'une des familles de réseaux qui peuvent simuler efficacement la mémoire est la famille des réseaux de neurones récurrents et l'un des types les plus connus de réseaux de neurones récurrents sont probablement les réseaux Elman (avec les réseaux de mémoire à long terme à court terme (LSTM), je dirais). Pour en savoir plus sur les réseaux Elman, vous pouvez consulter l' article original présentant le concept ou via Wikipedia . En bref, ils ont une couche supplémentaire appelée contexte utilisée comme type de mémoire. La figure suivante ( source ) illustre l'idée
Heureusement pour nous, il existe le package RSNNS en R capable de s'adapter aux filets Elman. Le package est décrit en détail ici .
Maintenant que nous avons parcouru les bases, voyons comment nous pouvons implémenter un exemple en R avec le package 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")
Ce code devrait donner la figure suivante
Donc, ce que nous avons fait avec le code est le suivant. Tout d'abord, nous avons créé un exemple de série chronologique (à partir du modèle ARIMA). Après cela, nous avons découplé / découpé l'exemple de série chronologique en entrées du formulaire (sw points précédents, point suivant) pour toutes les paires sauf la dernière (avec le point suivant comme dernier point de l'exemple de série chronologique). Le paramètre sw est utilisé pour définir la "fenêtre coulissante". Je ne discuterai pas ici de la taille appropriée de la fenêtre coulissante, mais notez simplement qu'en raison de la mémoire des réseaux Elman, la fenêtre coulissante de taille 1 est plus qu'une approche raisonnable (consultez également cet article ).
Une fois les préparatifs terminés, nous pouvons simplement construire un réseau Elman avec la fonction elman. Il y a deux paramètres auxquels vous devez faire attention; la taille et le learnFuncParams. Le paramètre de taille vous donne un moyen de définir la taille du réseau (couche cachée) et la façon dont vous choisissez ce paramètre est plus un art qu'une science. Une règle d'or pour learnFuncParams est de le garder petit si c'est faisable (votre puissance de traitement vous permet de le garder petit / vous avez assez de temps pour attendre: D).
Et voila, vous avez votre réseau neuronal capable de prédire un / le futur point / valeur. Le pouvoir prédictif de cette approche pour notre exemple est illustré dans la figure précédente. La courbe rouge présente nos séries temporelles simulées (sans le dernier point) et la courbe verte ce qui a été obtenu avec le réseau Elman ajusté. Le point rouge indique le dernier point (celui qui n'a pas été utilisé pendant le processus d'ajustement) et le point vert ce qui a été prédit par le réseau ajusté. Pas mal du tout :)
C'était un exemple sur la façon d'utiliser les RNN (réseaux Elman) avec R pour faire des prédictions / prévisions. Certains pourraient soutenir que les RNN ne sont pas les meilleurs pour le problème et qu'il existe de meilleurs modèles nnet pour les prévisions. Étant donné que je ne suis pas un expert du dossier, j'éviterai de discuter de ces questions.
Une lecture intéressante si vous souhaitez en savoir plus sur les RNN est un examen critique des RNN dans un document d' apprentissage séquentiel .