回答:
Rob Hyndmanは、ニューラルネットを使用した予測に関する活発な研究を行っています。彼は最近、時系列データに適合するように参照するパッケージを利用するnnetar()
関数をforecast
パッケージに追加しましたnnet
。
http://cran.r-project.org/web/packages/forecast/index.html
ヘルプドキュメントの例:
fit <- nnetar(lynx)
fcast <- forecast(fit)
plot(fcast)
ロブは彼のオンラインテキストのこの特定のセクションでより多くのコンテキストを提供します:予測:原則と実践。
(そして明らかにロブに感謝します。)
同じことを探していて、この質問に出くわしました。例が見つからないので、自分で作成することにしました。注意してください、私はニューラルネットや予測の専門家ではありません:)
ニューラルネット(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の批評を読んでください。