Rのニューラルネットワークを使用した時系列予測の例


8

誰もnnetが予測のためにニューラルネットワーク(Rなど)を使用する簡単な短い教育例を持っていますか?

これは時系列のRの例です

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

これはほんの一例ですが、私が持っているのは、季節変動の激しいデータです。

回答:


15

Rob Hyndmanは、ニューラルネットを使用した予測に関する活発な研究を行っています。彼は最近、時系列データに適合するように参照するパッケージを利用するnnetar()関数をforecastパッケージに追加しましたnnet

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

ヘルプドキュメントの例:

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

ロブは彼のオンラインテキストのこの特定のセクションでより多くのコンテキストを提供します:予測:原則と実践

(そして明らかにロブに感謝します。)


いいですが、フィードフォワードネットがあります
Tommaso Guerrini

2

同じことを探していて、この質問に出くわしました。例が見つからないので、自分で作成することにしました。注意してください、私はニューラルネットや予測の専門家ではありません:)

ニューラルネット(nnets)で時系列を効果的にモデル化するには、nnetが持つべき重要なプロパティは、ある種のメモリ(過去に何が起こったかを追跡する)であると思います。したがって、単純なフィードフォワードネットはおそらく悪い考えです。メモリを効果的にシミュレートできるnnetsのファミリの1つは、再帰型ニューラルネットワークのファミリであり、最もよく知られている種類の再帰型ニューラルネットワークの1つは、おそらくエルマンネットワークです(私が言う長期短期記憶(LSTM)ネットと共に)。エルマンネットワークの詳細については、コンセプトを紹介する元の論文またはWikipedia参照しください。つまり、メモリのタイプとして使用されるコンテキストと呼ばれる追加のレイヤーがあります。次の図(ソース)はアイデアを示しています

エルマン型の単純なリカレントネットワーク

幸運なことに、ElmanネットをフィッティングできるRのRSNNSパッケージがあります。パッケージについて詳しくは、こちらをご覧ください

これで基本を学習したので、RSNNSパッケージを使用してRに例を実装する方法を見てみましょう。

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

このコードは、次の図のようになります。 ここに画像の説明を入力してください

コードで行ったのは次のとおりです。最初に、時系列の例を(ARIMAモデルから)作成しました。その後、最後のペア(時系列の例の最後のポイントとして次のポイントを含む)を除くすべてのペアについて、時系列の例をフォームの入力(sw前のポイント、次のポイント)に分離/スライスしました。パラメータswは、「スライディングウィンドウ」を定義するために使用されます。ここではスライディングウィンドウの適切なサイズについては議論しませんが、Elmanネットワークにはメモリがあるため、サイズ1のスライディングウィンドウは適切なアプローチよりも優れていることに注意してください(また、この投稿をご覧ください)。

準備が整ったら、elman関数を使用してElmanネットワークを構築できます。注意が必要なパラメータが2つあります。サイズとlearnFuncParams。サイズパラメーターは、ネットワーク(非表示レイヤー)のサイズを定義する方法を提供し、このパラメーターの選択方法は科学というより芸術です。learnFuncParamsの経験則は、可能であればそれを小さく保つことです(処理能力により、小さく保つことができます/待機するのに十分な時間があります:D)。

ほら、あなたのニューラルネットワークは、将来のポイント/値を予測することができます。この例のこのアプローチの予測力は、前の図に示されています。赤い曲線はシミュレーションされた時系列(最後のポイントなし)を示し、緑の曲線はフィットしたエルマンネットワークで得られたものを示しています。赤い点は最後の点(フィッティングプロセス中に使用されなかった点)を示し、緑の点はフィッティングされたネットワークによって予測されたものを示します。悪くない、全く :)

これは、RNN(Elmanネットワーク)をRで使用して予測/予測を行う方法の例です。一部の人は、RNNは問題に最適ではなく、予測のためのより良いnnetモデルがあると主張するかもしれません。私は申請の専門家ではないので、これらの問題について議論することは避けます。

RNNの詳細を知りたい場合は、シーケンスラーニングペーパーでRNNの批評を読んでください。


探検する興味深い道、ありがとう。これがさらに数期間先の予測を実行する方法に興味があります。
モーガンボール

1
@MorganBall:ありがとう。入力/出力をより長い/さらなる予測に適切にトレーニングに適応させることを忘れないでください。
iugrina 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.