Beispiel für die Vorhersage von Zeitreihen unter Verwendung neuronaler Netze in R.


8

Hat jemand ein kurzes Beispiel, wie man neuronale Netze ( nnetzum Beispiel in R) zum Zwecke der Vorhersage verwendet?

Hier ist ein Beispiel in R einer Zeitreihe

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

Dies ist nur ein Beispiel, aber ich habe nervös-saisonale Daten.

Antworten:


15

Rob Hyndman forscht aktiv an Prognosen mit Nueral-Netzen. Kürzlich hat nnetar()er dem forecastPaket die Funktion hinzugefügt, die das Paket verwendet, auf das nnetSie verweisen, um es an Zeitreihendaten anzupassen.

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

Das Beispiel aus den Hilfedokumenten:

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

Rob gibt in diesem speziellen Abschnitt seines Online-Textes mehr Kontext: Prognose: Prinzipien und Praxis .

(Und natürlich ein großes Dankeschön an Rob.)


Es ist schön, aber es gibt nur Feed-Forward-Netze
Tommaso Guerrini

2

War auf der Suche nach dem gleichen und bin auf diese Frage gestoßen. Da ich kein Beispiel gefunden habe, habe ich beschlossen, mein eigenes zu machen. Seien Sie sich bewusst, ich bin kein Experte für neuronale Netze oder Prognosen :)

Um Zeitreihen effektiv mit neuronalen Netzen (Netzen) zu modellieren, glaube ich, dass eine wichtige Eigenschaft, die Netze haben sollten, eine Art Speicher ist (um zu verfolgen, was in der Vergangenheit passiert ist). Daher sind einfache Feed-Forward-Netze wahrscheinlich eine schlechte Idee. Eine der Familien in Netzen, die das Gedächtnis effektiv simulieren können, ist die Familie der wiederkehrenden neuronalen Netze, und eine der bekanntesten Arten von wiederkehrenden neuronalen Netzen sind wahrscheinlich Elman-Netze (zusammen mit LSTM-Netzen (Long Short Term Memory), würde ich sagen). Um mehr über Elman-Netzwerke zu erfahren, können Sie das Originalpapier, in dem das Konzept vorgestellt wird, oder Wikipedia lesen . Kurz gesagt, sie haben eine zusätzliche Ebene namens Kontext, die als Speichertyp verwendet wird. Die folgende Abbildung ( Quelle ) veranschaulicht die Idee

Ein einfaches wiederkehrendes Netzwerk vom Typ Elman

Zum Glück gibt es das RSNNS-Paket in R, das Elman-Netze aufnehmen kann. Das Paket wird in Einzelheiten beschrieben hier .

Nachdem wir die Grundlagen durchgearbeitet haben, können wir sehen, wie wir ein Beispiel in R mit dem RSNNS-Paket implementieren können.

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")

Dieser Code sollte zu der folgenden Abbildung führen Geben Sie hier die Bildbeschreibung ein

Was wir also mit dem Code gemacht haben, ist wie folgt. Zunächst haben wir ein Zeitreihenbeispiel erstellt (aus dem ARIMA-Modell). Danach haben wir das Zeitreihenbeispiel für alle Paare außer dem letzten (mit dem nächsten Punkt als letztem Punkt des Zeitreihenbeispiels) in Eingaben der Form (sw vorherige Punkte, nächster Punkt) entkoppelt / geschnitten. Mit dem Parameter sw wird das "Schiebefenster" definiert. Ich werde hier nicht darüber diskutieren, welche Größe für das Schiebefenster geeignet ist, sondern nur darauf hinweisen, dass das Schiebefenster der Größe 1 aufgrund des Elman-Netzwerks mit Speicher mehr als ein vernünftiger Ansatz ist (siehe auch diesen Beitrag ).

Nachdem die Vorbereitungen abgeschlossen sind, können wir einfach ein Elman-Netzwerk mit der elman-Funktion aufbauen. Es gibt zwei Parameter, bei denen Sie vorsichtig sein sollten. die Größe und die learnFuncParams. Mit dem Größenparameter können Sie die Größe des Netzwerks (verborgene Ebene) definieren. Die Art und Weise, wie Sie diesen Parameter auswählen, ist eher eine Kunst als eine Wissenschaft. Als Faustregel für learnFuncParams gilt, dass es klein gehalten wird, wenn dies möglich ist (Ihre Verarbeitungsleistung ermöglicht es Ihnen, es klein zu halten / Sie haben genügend Zeit zum Warten: D).

Und voila, Sie haben Ihr neuronales Netzwerk in der Lage, einen / den zukünftigen Punkt / Wert vorherzusagen. Die Vorhersagekraft dieses Ansatzes für unser Beispiel ist in der vorherigen Abbildung dargestellt. Die rote Kurve zeigt unsere simulierten Zeitreihen (ohne den letzten Punkt) und die grüne Kurve, was mit dem angepassten Elman-Netzwerk erhalten wurde. Der rote Punkt kennzeichnet den letzten Punkt (den Punkt, der während des Anpassungsprozesses nicht verwendet wurde) und den grünen Punkt, der vom angepassten Netzwerk vorhergesagt wurde. Gar nicht so schlecht :)

Dies war ein Beispiel für die Verwendung von RNNs (Elman-Netzwerken) mit R, um Vorhersagen / Prognosen zu treffen. Einige könnten argumentieren, dass RNNs nicht die besten für das Problem sind und dass es bessere nnet-Modelle für Prognosen gibt. Da ich kein Experte in dem Bereich bin, werde ich es vermeiden, diese Themen zu diskutieren.

Eine interessante Lektüre, wenn Sie mehr über RNNs erfahren möchten, ist eine kritische Überprüfung der RNNs im Sequenzlernpapier .


Eine interessante Straße zum Erkunden, danke. Ich werde gespannt sein, wie sich dies auf die Vorhersage um einige Zeiträume auswirkt.
Morgan Ball

1
@ MorganBall: Danke. Vergessen Sie nicht, Ihre Inputs / Outputs für das Training entsprechend anzupassen, um längere / weitere Vorhersagen zu treffen.
Iugrina
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.