2016-07-16 18 views
2

ボストンのデータセットでRでニューラルネットを試しました。式をfと呼ばれるRオブジェクトに格納され、この場合ニューラルネット機能を使用中にエラーを取得する

keeps <- c("crim", "indus", "nox", "rm" , "age", "dis", "tax" ,"ptratio", "lstat" ,"medv") 
data <- data[keeps] 

:我々が使用したいだけの変数を保持

data("Boston",package="MASS") 
data <- Boston 

。 応答変数medvは、残りの9つの属性に対して「回帰」されます。

f <- medv ~ crim + indus + nox + rm + age + dis + tax + ptratio + lstat 

交換せずにデータの506行の列のサンプル400を設定するサンプルの方法を使用して収集される:私は以下のようにそれを行っているRの

set.seed(2016) 
n = nrow(data) 
train <- sample(1:n, 400, FALSE) 

neuralnet機能が装着されています。

fit<- neuralnet(f, data = data[train ,], hidden=c(10 ,12 ,20), 
      algorithm = "rprop+", err.fct = "sse", act.fct = "logistic", 
      threshold =0.1, linear.output=TRUE) 

しかし、アルゴリズムは収束していないと警告メッセージが表示されます。

警告メッセージ: アルゴリズムはstepmax内の1回の反復(S)の1に収束しなかった

試み予測使用して計算、

pred <- compute(fit,data[-train, 1:9]) 

後エラーMSGが表示され

Error in nrow[w] * ncol[w] : non-numeric argument to binary operator 
In addition: Warning message: 
In is.na(weights) : is.na() applied to non-(list or vector) of type 'NULL' 

なぜエラーが発生しているのか、予測から回復する方法私は、そのデータセットにneuralnet関数を使用したいと思います。

+2

トレーニングの前にデータセットの拡大縮小を検討しましたか? – sebastianmm

+0

私はそれを拡大縮小していません。より速いコンバージェンスにつながりますか?今のところ、問題は、収束していないようです。 – shan

+0

はい。下の私の編集を参照してください。 – sebastianmm

答えて

2

neuralnetが収束しない場合、結果として得られるニューラルネットワークは完全ではありません。 attributes(fit)$namesに電話すると分かります。収束を訓練するとき、それは次のようになります。

[1] "call"    "response"   "covariate"   "model.list"   "err.fct" 
[6] "act.fct"    "linear.output"  "data"    "net.result"   "weights" 
[11] "startweights"  "generalized.weights" "result.matrix" 

それは、いくつかの属性が定義されることはありませんしない場合:

computeが動作しない理由を説明
[1] "call"   "response"  "covariate"  "model.list" "err.fct"  "act.fct"  "linear.output" 
[8] "data" 

トレーニングが収束しない場合、最初に考えられる解決策はstepmax(デフォルトは100000)を増やすことです。 lifesign = "full"を追加して、トレーニングプロセスの詳細を把握することもできます。

また、あなたのコードを見ると、10,12,20個のニューロンを持つ3つのレイヤーがあまりにも多いと言えます。あなたのケースでは、入力数と同じ数のニューロンで1つのレイヤーから始めます。

EDIT:

(トレーニングとテストデータの両方を拡張することを忘れないでください、と「デ・スケール」compute結果に)、それははるかに高速に収束するスケーリング。また、レイヤとニューロンの数を減らし、エラーしきい値を引き下げたことにも注意してください。

data("Boston",package="MASS") 
data <- Boston 

keeps <- c("crim", "indus", "nox", "rm" , "age", "dis", "tax" ,"ptratio", "lstat" ,"medv") 
data <- data[keeps] 

f <- medv ~ crim + indus + nox + rm + age + dis + tax + ptratio + lstat 

set.seed(2016) 
n = nrow(data) 
train <- sample(1:n, 400, FALSE) 

# Scale data. Scaling parameters are stored in this matrix for later. 
scaledData <- scale(data) 

fit<- neuralnet::neuralnet(f, data = scaledData[train ,], hidden=9, 
       algorithm = "rprop+", err.fct = "sse", act.fct = "logistic", 
       threshold = 0.01, linear.output=TRUE, lifesign = "full") 

pred <- neuralnet::compute(fit,scaledData[-train, 1:9]) 

scaledResults <- pred$net.result * attr(scaledData, "scaled:scale")["medv"] 
           + attr(scaledData, "scaled:center")["medv"] 

cleanOutput <- data.frame(Actual = data$medv[-train], 
          Prediction = scaledResults, 
          diff = abs(scaledResults - data$medv[-train])) 

# Show some results 
summary(cleanOutput) 
0

問題はあなたの議論の中にあるようです。linear.output = TRUEあなたのデータと

が、(式を定義し、いくつかの説明のコメントを追加しない)コードを少し変更:

library(neuralnet)    
fit <- neuralnet(formula = medv ~ crim + indus + nox + rm + age + dis + tax + ptratio + lstat, 
       data = data[train,], 
       hidden=c(10, 12, 20), # number of vertices (neurons) in each hidden layer 
       algorithm = "rprop+", # resilient backprop with weight backtracking, 
       err.fct = "sse",  # calculates error based on the sum of squared errors 
       act.fct = "logistic", # smoothing the cross product of neurons and weights with logistic function 
       threshold = 0.1,  # of the partial derivatives for error function, stopping 
       linear.output=FALSE)  # act.fct applied to output neurons 

print(net) 

Call: neuralnet(formula = medv ~ crim + indus + nox + rm + age + dis +  tax + ptratio + lstat, data = data[train, ], hidden = c(10,  12, 20), threshold = 0.1, rep = 10, algorithm = "rprop+",  err.fct = "sse", act.fct = "logistic", linear.output = FALSE) 

10 repetitions were calculated. 

     Error Reached Threshold Steps 
1 108955.0318  0.03436116236  4 
5 108955.0339  0.01391790099  8 
3 108955.0341  0.02193379592  3 
9 108955.0371  0.01705056758  6 
8 108955.0398  0.01983134293  8 
4 108955.0450  0.02500006437  5 
6 108955.0569  0.03689097762  5 
7 108955.0677  0.04765829189  5 
2 108955.0705  0.05052776877  5 
10 108955.1103  0.09031966778  7 
10 108955.1103  0.09031966778  7 

# now compute will work 
pred <- compute(fit, data[-train, 1:9]) 
+0

'linear.output = TRUE'は回帰のためのもので、この場合には必要です。目的の出力を変更していますが、これは解決策ではありません。 – sebastianmm

+0

はい。ここで@sebastianmmのlinear.outputパラメータを変更することは望ましくありません。 #二乗相関係数を計算すると、FALSEパラメータ値を持つ平均二乗誤差(mse)と#root平均二乗誤差(rmse)が計算されます。 round(cor(pred $ net.result、data [-train、10])^ 2 、6) 値がはるかに小さいです。これは、0.809458の近くにあるはずです mse(data [-train、10]、pred $ net.result)はかなり高くなります。 #は0.2607601849に近いはずです。 rmse(data [-train、10]、pred $ net。結果)は非常に高いです。 #は0.5106468299に近いはずです – shan

関連する問題