Rでニューラルネットワークモデルをトレーニングおよび検証する方法


33

ニューラルネットワークを使用したモデリングは初めてですが、観測されたデータによく適合するすべての利用可能なデータポイントでニューラルネットワークを確立することができました。ニューラルネットワークは、nnetパッケージを使用してRで実行されました。

require(nnet)      
##33.8 is the highest value
mynnet.fit <- nnet(DOC/33.80 ~ ., data = MyData, size = 6, decay = 0.1, maxit = 1000)      
mynnet.predict <- predict(mynnet.fit)*33.80  
mean((mynnet.predict - MyData$DOC)^2) ## mean squared error was 16.5      

分析中のデータは次のようになります。DOCはモデル化する必要のある変数です(約17,000の観測値があります)。

      Q  GW_level Temp   t_sum   DOC
1 0.045    0.070 12.50     0.2 11.17
2 0.046    0.070 12.61     0.4 11.09
3 0.046    0.068 12.66     2.8 11.16
4 0.047    0.050 12.66     0.4 11.28
5 0.049    0.050 12.55     0.6 11.45
6 0.050    0.048 12.45     0.4 11.48

さて、モデルは70%のデータポイントでトレーニングされ、残りの30%のデータポイントで検証される必要があることを読みました。どうすればいいですか?どの関数を使用する必要がありますか?

キャレットパッケージのtrain関数を使用して、サイズと減衰のパラメーターを計算しました。

require(caret)
my.grid <- expand.grid(.decay = c(0.5, 0.1), .size = c(5, 6, 7))
mynnetfit <- train(DOC/33.80 ~ ., data = MyData, method = "nnet", maxit = 100, tuneGrid = my.grid, trace = f)

他のウェブサイト/投稿への直接のヘルプまたはリンクは大歓迎です。


6
実際、訓練/テストの分割方法論は、アルゴリズムのパフォーマンスが分割点の選択に基づいてかなり変化する可能性があるため、準劣です(5%の違いを見ました...)。より良い方法は、相互検証です。
ジョンDoucette

回答:


36

Max Kuhnのキャレットマニュアル-モデル作成は、素晴らしい出発点です。

検証ステージは、キャレットtrain()呼び出し内で発生すると考えます。これは、ブートストラップまたはtrControlパラメーターで指定できる他のアプローチを使用して、減衰とサイズのハイパーパラメーターを選択するためです。最終的に選択したモデルのエラーを特徴付けるために使用するデータセットをテストセットと呼びます。キャレットがハイパーパラメータの選択を処理するため、トレーニングセットとテストセットだけが必要です。

キャレットでcreateDataPartition()関数を使用して、データセットをトレーニングセットとテストセットに分割できます。車のパッケージのPrestigeデータセットを使用してこれをテストしました。このデータセットには、教育レベルと職業上の名声に関連する収入に関する情報が含まれています。

library(car)
library(caret)
trainIndex <- createDataPartition(Prestige$income, p=.7, list=F)
prestige.train <- Prestige[trainIndex, ]
prestige.test <- Prestige[-trainIndex, ]

createDataPartition()関数は、パーティションを作成せず、トレーニングセットとテストセットを構築するために使用できるインデックスのベクトルを提供するため、少し間違った名前のようです。これを自分で行うのはとても簡単ですsample()を使用してRででですが、createDataPartition()が行うことの1つは、因子レベル内からのサンプルです。さらに、結果がカテゴリカルである場合、分布はデータパーティション全体で維持されます。ただし、結果は継続的であるため、この場合は関係ありません。

これで、トレーニングセットでモデルをトレーニングできます。

my.grid <- expand.grid(.decay = c(0.5, 0.1), .size = c(5, 6, 7))
prestige.fit <- train(income ~ prestige + education, data = prestige.train,
    method = "nnet", maxit = 1000, tuneGrid = my.grid, trace = F, linout = 1)    

余談:回帰(分類)問題でnnetを動作させるには、linoutパラメーターを追加する必要がありました。それ以外の場合、モデルから予測値としてすべて1を取得しました。

その後、テストデータセットを使用してfitオブジェクトでpredictを呼び出し、結果からRMSEを計算できます。

prestige.predict <- predict(prestige.fit, newdata = prestige.test)
prestige.rmse <- sqrt(mean((prestige.predict - prestige.test$income)^2)) 

Max Kuhnリンクが終了したようです。
EngrStudent-モニカの

Max Kuhnの本を見つけました。ここに隠されています:feat.engineering
アジャイルBean
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.