2016-07-25 11 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) द्वारा छिपी परत में न्यूरॉन्स की संख्या के साथ एक सरल तंत्रिका शुद्ध के निर्माण की कोशिश की है चुना जाता है

0,123,516: परीक्षण सेट पर मेरे परिणाम मान्य
# # 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

ऐसा ही एक सवाल कुछ समय के लिए मुझे शिकार किया गया है, इसलिए मैं अपने डेटा और समस्या को समझने की कोशिश की और उन्हें मेरा की तुलना में। केवल

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

आप B, C और भविष्यवाणी के लिए Y, बजाय A, B और C का चयन करें, क्योंकि 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

ग्रेट, मैं सोच रहा था कि मैंने इस छोटी सी बग को कैसे याद किया है। धन्यवाद अब इसके परिणामस्वरूप '0 एमएसई 'ट्रेन' और 'टेस्ट' सेट हैं। –

+0

आपने उल्लेख किया है ** 'एक समान प्रश्न मुझे कुछ समय के लिए शिकार कर रहा है' **। क्या मुझे यह मानने में आपका प्रश्न पता चल सकता है कि यह मुझे तंत्रिका नेटवर्क के साथ मेरी समझ में सुधार करने में मदद करेगा। –

+1

निश्चित रूप से। मुझे लगता है कि मैं इसके लिए एक अलग पोस्ट लिखने वाला हूं। मैं आपको बता दूँगा। अनिवार्य रूप से, मेरे पास एक साधारण प्रतिगमन समस्या है जो, यादृच्छिक रूप से, लगभग पूरी तरह से मॉडलिंग की जाती है, और दूसरी बार बल्कि खराब होती है। यह स्पष्ट रूप से वजन के यादृच्छिक intialization से संबंधित है, लेकिन यह सब मुझे पता है। – sebastianmm

संबंधित मुद्दे