2016-07-25 9 views
7

に失敗しているなぜ単純なルールベースの分類データセットが形成される以下のコードを有する:ニューラルネットワークは、単純なclassifcationケース

# # Data preparation 
data = data.frame(A = round(runif(100)), B = round(runif(100)), C = round(runif(100))) 
# Y - is the classification output column 
data$Y = ifelse((data$A == 1 & data$B == 1 & data$C == 0), 1, ifelse((data$A == 0 & data$B == 1 & data$C == 1), 1, ifelse((data$A == 0 & data$B ==0 & data$C == 0), 1, 0))) 
# Shuffling the data set 
data = data[sample(rownames(data)), ] 

を私ができるように、訓練および試験中にデータセットを分割しました

here述べたように)ループによって選ばれ、私は隠れ層のニューロンの数と簡単なニューラルネットを構築しようとしている

# # Divide into train and test 
library(caret) 
trainIndex = createDataPartition(data[, "Y"], p = .7, list = FALSE, times = 1) # for balanced sampling 
train = data[trainIndex, ] 
test = data[-trainIndex, ] 

:テストセットに私の結果を検証します

# # Build a neural net 
library(neuralnet) 
for(alpha in 2:10) 
{ 
    nHidden = round(nrow(train)/(alpha*(3+1))) 
    nn = neuralnet(Y ~ A + B + C, train, linear.output = F, likelihood = T, err.fct = "ce", hidden = nHidden) 

    # Calculate Mean Squared Error for Train and Test 
    trainMSE = mean((round(nn$net.result[[1]]) - train$Y)^2) 
    testPred = round(compute(nn,test[-length(ncol(test))])$net.result) 
    testMSE = mean((testPred - test$Y)^2) 

    print(paste("Train Error: " , round(trainMSE, 4), ", Test Error: ", round(testMSE, 4), ", #. Hidden = ", nHidden, sep = "")) 
} 

[1] "Train Error: 0, Test Error: 0.6, #. Hidden = 9"

[1] "Train Error: 0, Test Error: 0.6, #. Hidden = 6"

[1] "Train Error: 0, Test Error: 0.6, #. Hidden = 4"

[1] "Train Error: 0, Test Error: 0.6, #. Hidden = 4"

[1] "Train Error: 0.1429, Test Error: 0.8333, #. Hidden = 3"

[1] "Train Error: 0.1429, Test Error: 0.8333, #. Hidden = 2"

[1] "Train Error: 0.0857, Test Error: 0.6, #. Hidden = 2"

[1] "Train Error: 0.1429, Test Error: 0.8333, #. Hidden = 2"

[1] "Train Error: 0.0857, Test Error: 0.6, #. Hidden = 2"

これはあまり適合しない結果を与えていました。しかし、同じデータセットで単純なランダムフォレストを構築したとき。ニューラルネットはランダムフォレストは、100%の精度で作業している簡単な場合には失敗している理由を理解する上で私を助けてください0

# # Build a Random Forest 
trainRF = train 
trainRF$Y = as.factor(trainRF$Y) 
testRF = test 

library(randomForest) 
rf = randomForest(Y ~ ., data = trainRF, mtry = 2) 

# Calculate Mean Squared Error for Train and Test 
trainMSE = mean((round(rf$votes[,2]) - as.numeric(as.character(trainRF$Y)))^2) 
testMSE = mean((round(predict(rf, testRF, type = "prob")[,2]) - as.numeric(as.character(testRF$Y)))^2) 

print(paste("Train Error: " , round(trainMSE, 4), ", Test Error: ", round(testMSE, 4), sep = "")) 

[1] "Train Error: 0, Test Error: 0"

- 私はとして電車やテストのエラーを取得しています。

注:私は1つの隠れ層(1つの隠れ層でこのような単純な分類に十分であると仮定)を使用し、隠れ層のニューロンの数を反復した。

また、ニューラルネットワークパラメータについての私の理解が間違っている場合は助けてください。

完全なコードは、同様の質問がいくつかの時間のために私を狩りされていますhere

答えて

1

たので、私はあなたのデータや問題を理解しようとしたと私にそれらを比較することができます。最後に、しかし、それはこのラインでちょうど小さなバグです:length(ncol(something))は常に返されますので、あなたがBCおよび予測のためY、代わりのABCを選択

testPred = round(compute(nn,test[-length(ncol(test))])$net.result) 

は、1.あなたがしたいだけtest[-ncol(test)]

> summary(test[-length(ncol(test))]) 

      B    C    Y    
Min. :0.00 Min. :0.0 Min. :0.0000000 
1st Qu.:0.00 1st Qu.:0.0 1st Qu.:0.0000000 
Median :0.00 Median :0.5 Median :0.0000000 
Mean :0.48 Mean :0.5 Mean :0.3766667 
3rd Qu.:1.00 3rd Qu.:1.0 3rd Qu.:1.0000000 
Max. :1.00 Max. :1.0 Max. :1.0000000 
+0

私はこの小さなバグを見逃してしまったのでしょうか?おかげさしで、今度は 'Train'と' Test'の '0MSE'が生まれました。 –

+0

あなたは** 'これと同じ質問が私をしばらく捜していました**'と言いました**。あなたがニューラルネットワークで私の理解を向上させるのに役立つことを前提として、あなたの質問を知ることができますか? –

+1

私はちょうどそれのために別の投稿を書くつもりだと思う。知らせます。本質的に、私は、ランダムに、ほぼ完璧にモデル化され、他の時期にはあまりうまくモデル化されない単純な回帰問題を持っています。明らかに、重みのランダムな初期化に関連していますが、それは私が知っているすべてについてです。 – sebastianmm

関連する問題