2016-07-25 82 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)), ] 

我劃分了數據集分成訓練和測試,這樣我可以驗證在測試組我的結果:

# # 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, ] 

我試圖建立一個簡單的神經網絡與神經元的隱含層的數目通過循環(如所提到的here)被選擇

# # 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"

這是給窮人過擬合的結果。但是,當我在同一個數據集上構建了一個簡單的隨機森林。我得到的訓練和測試誤差爲 - 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"

請幫助我理解爲什麼神經網絡是失敗在一個簡單的情況下隨機森林正在與100%的準確率。我只使用了一個隱藏層(假設一個隱藏層對於這樣簡單的分類就足夠了),並對隱藏層中的神經元數進行迭代。

另外,如果我對神經網絡參數的理解是錯誤的,請幫助我。

完整代碼,可以發現here

回答

1

類似的問題已經被我獵取了一段時間,所以我試圖理解你的數據和問題,他們比我的。最後,雖然,這只是一個小bug在這一行:

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

您選擇BCY進行預測,而不是ABC,因爲length(ncol(something))總是返回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'設置中產生'0 MSE'。 –

+0

你剛纔提到**'一個類似的問題一直在狩獵我'**。如果能幫助我提高對神經網絡的理解,我能否瞭解您的問題? –

+1

當然。我想我會爲此寫一篇單獨的文章。我會告訴你。從本質上講,我有一個簡單的迴歸問題,隨機地,它幾乎完美地建模,而在其他時候則相當糟糕。這顯然與權重的隨機初始化有關,但這就是我所知道的。 – sebastianmm