2016-07-25 4 views
7

ich den Code haben unten, wo eine einfache Regel basierte Klassifizierungs Datensatz gebildet wird:Warum neuronale Netze sind in einem einfachen Klassifzierung Fall versagt

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

ich die Daten in Trainings- und Test gesetzt geteilt haben, so dass ich kann meine Ergebnisse auf dem Testsatz validieren:

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

ich versucht habe, mit der Anzahl der Neuronen in verborgener Schicht wird durch Schleife ausgewählt, um ein einfaches neuronalen Netz bauen (wie here erwähnt)

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

Es gab schlechte über angepasste Ergebnisse. Aber wenn ich eine einfache zufällige Gesamtstruktur auf demselben Datensatz erstellt habe. Ich erhalte die Bahn und Testfehler wie - 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"

Bitte helfen Sie mir zu verstehen, warum neuronale Netze in einem einfachen Fall versagen, wo zufälliger Wald arbeitet mit 100-prozentiger Genauigkeit.

Hinweis: Ich habe nur eine versteckte Ebene verwendet (vorausgesetzt, eine versteckte Ebene reicht für eine solche einfache Klassifizierung) und iterierte die Anzahl der Neuronen in der versteckten Ebene.

Hilf mir auch, wenn mein Verständnis der neuronalen Netzwerkparameter falsch ist.

kompletter Code kann here

Antwort

1

Eine ähnliche Frage wurde mir die Jagd nach einiger Zeit gefunden werden, so dass ich versuchte, Ihre Daten und Problem zu verstehen und sie zu Mine verglichen. Am Ende, aber es ist nur ein kleiner Fehler in dieser Zeile:

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

Sie B wählen, C und Y für die Vorhersage, statt A, B und C, weil length(ncol(something)) immer zurück 1. Sie mögen nur 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

Großartig, ich habe mich gefragt, wie ich diesen kleinen Fehler verpasst habe. Danke, jetzt kommt es zu '0 MSE' auf' Train' und 'Test' Sets. –

+0

Sie haben erwähnt ** 'Eine ähnliche Frage jagt mich seit einiger Zeit' **. Kann ich Ihre Frage kennenlernen, wenn ich davon ausgehe, dass sie mir hilft, mein Verständnis mit Neuronalen Netzen zu verbessern? –

+1

Sicher. Ich denke, ich werde nur einen eigenen Beitrag dafür schreiben. Ich lasse es dich wissen. Im Grunde genommen habe ich ein einfaches Regressionsproblem, das nach dem Zufallsprinzip nahezu perfekt modelliert ist und zu anderen Zeiten ziemlich schlecht. Es hängt offensichtlich mit der zufälligen Initialisierung der Gewichte zusammen, aber das ist alles, was ich weiß. – sebastianmm

Verwandte Themen