web-dev-qa-db-ja.com

予測にnnetを使用していますが、正しく実行していますか?

私はまだRとAIにかなり慣れていません/ [〜#〜] ml [〜#〜] テクニック。予測にニューラルネットを使用したいのですが、私は新しいので、これがどのように行われるべきかを確認したいと思います。

テストケースとして、以前の2つの値に基づいてsin()の値を予測しています。トレーニングのために、y = sin(x)x1 = sin(x-1)x2 = sin(x-2)を使用してデータフレームを作成し、式y ~ x1 + x2を使用します。

うまくいくようですが、これが正しい方法なのか、もっと慣用的な方法があるのか​​と思っています。

これはコードです:

require(quantmod) #for Lag()
requre(nnet)
x <- seq(0, 20, 0.1)
y <- sin(x)
te <- data.frame(y, Lag(y), Lag(y,2))
names(te) <- c("y", "x1", "x2")
p <- nnet(y ~ x1 + x2, data=te, linout=TRUE, size=10)
ps <- predict(p, x1=y)
plot(y, type="l")
lines(ps, col=2)

ありがとう

[編集]

これは予測呼び出しに適していますか?

t2 <- data.frame(sin(x), Lag(sin(x)))
names(t2) <- c("x1", "x2")
vv <- predict(p, t2)
plot(vv)

Nnetがその予測(正弦波に近似しているはずです)を見ることによって実際に機能していることを確認したいと思います。

17
dizzy

caretパッケージは、nnetなどのさまざまなモデルへの優れた統合インターフェースを提供するため、私は本当に気に入っています。さらに、クロス検証またはbootstrapリサンプリング)を使用して、ハイパーパラメータ(sizedecayなど)を自動的に調整します。欠点は、このすべてが再サンプリングされることです。サンプリングには時間がかかります。

#Load Packages
require(quantmod) #for Lag()
require(nnet)
require(caret)

#Make toy dataset
y <- sin(seq(0, 20, 0.1))
te <- data.frame(y, x1=Lag(y), x2=Lag(y,2))
names(te) <- c("y", "x1", "x2")

#Fit model
model <- train(y ~ x1 + x2, te, method='nnet', linout=TRUE, trace = FALSE,
                #Grid of tuning parameters to try:
                tuneGrid=expand.grid(.size=c(1,5,10),.decay=c(0,0.001,0.1))) 
ps <- predict(model, te)

#Examine results
model
plot(y)
lines(ps, col=2)

また、適切なスケールで予測するため、結果を直接比較できます。ニューラルネットワークに興味がある場合は、neuralnetおよびRSNNSパッケージも確認する必要があります。 caretは現在nnetおよびneuralnetモデルを調整できますが、RSNNSのインターフェイスはまだありません。

/ edit:caretRSNNSのインターフェイスが追加されました。パッケージメンテナに電子メールを送り、モデルをcaretに追加するように依頼すると、通常はそれを行います。

/ edit:caretbrnn パッケージからのフィードフォワードニューラルネットワークのベイズ正則化もサポートするようになりました。さらに、キャレットにより、独自の カスタムモデル を指定して、任意のニューラルネットワークパッケージとインターフェイスすることがはるかに簡単になりました!

46
Zach