2016-11-26 3 views
1

Ich baue ein neuronales Netz für die Kaggle, "Ghost, Ghul, Goblin" Herausforderung.R tryCatch neuralnet, unerwartete Ausgabe

Ich nehme meine (Trainings-) Daten X mal (zur Veranschaulichung X = 6) auf und teile sie in ein Trainings- und Testset auf. Ich lasse dann mein neuronales Netz auf jedem der X (6) Datensätze laufen und zeichne die Genauigkeit auf. Ich mache das, damit ich dann die Genauigkeit zwischen verschiedenen Netzen vergleichen kann (eine Schicht 3,4,5 versteckt, zwei Schichten 3 + 3, 4 + 3 usw.)

Mein neuronales Netz Teil des Codes ist

set.seed(26) 
mysamples <- sapply(1:iterations, function(j) { 
    temp <- sample(1:371, size = insamplesize, replace = F) 
}) 

nn3results <- data.frame(matrix(0, ncol = iterations, nrow = 1)) 

myseed <- 0 
for (nnloop in 1:iterations){ 
    myseed = myseed + 1 
    set.seed(myseed) 
    nn_idx <- mysamples[,nnloop] 
    nn_rep_train <- mydata[nn_idx,] 
    nn_rep_test <- mydata[-nn_idx,] 
    nn_rep <- neuralnet(Ghost+Ghoul+Goblin ~ bone_N + rot_N + hair_N + soul_N, 
         data=nn_rep_train, hidden=c(4)) 
    mypredict <- compute(nn_rep, nn_rep_test[,2:5])$net.result 
    idx <- apply(mypredict, c(1), maxidx) 
    nn_rep_test$Pred <- as.factor(c('Ghost', 'Ghoul', 'Goblin')[idx]) 
    print(paste("sim",nnloop,"=",round(sum(diag(table(nn_rep_test$type, nn_rep_test$Pred))) 
      /outsamplesize,5),"%","myseed = ",myseed)) 
    nn3results[1,nnloop] <- sum(diag(table(nn_rep_test$type, nn_rep_test$Pred))) 
} 

, die genau wie ich erwarten würde, durchführt, bis Iteration 5, wobei das neuronale Netz konvergiert nicht als

[1] "sim 1 = 0.74194 % myseed = 1" 
[1] "sim 2 = 0.73118 % myseed = 2" 
[1] "sim 3 = 0.75269 % myseed = 3" 
[1] "sim 4 = 0.74194 % myseed = 4" 
Error in nrow[w] * ncol[w] : non-numeric argument to binary operator 
In addition: Warning messages: 
1: algorithm did not converge in 1 of 1 repetition(s) within the stepmax 
2: In is.na(weights) : 
    is.na() applied to non-(list or vector) of type 'NULL' 

folgt also keine Sorgen machen. Ich habe meinen Code geändert und steckte ihn wie folgt in tryCatch.

myseed <- 0 
for (nnloop in 1:iterations){ 
    myseed = myseed + 1 
    set.seed(myseed) 
    nn_idx <- mysamples[,nnloop] 
    nn_rep_train <- mydata[nn_idx,] 
    nn_rep_test <- mydata[-nn_idx,] 
    tryCatch({ 
     nn_rep <- neuralnet(Ghost+Ghoul+Goblin ~ bone_N + rot_N + hair_N + soul_N, 
      data=nn_rep_train, hidden=c(4)) 
     }, 
     error = function(e){nn3results[1,nnloop] <- -1}, 
     warning = function(w){nn3results[1,nnloop] <- -1}, 
     finally={ 
      mypredict <- compute(nn_rep, nn_rep_test[,2:5])$net.result 
      idx <- apply(mypredict, c(1), maxidx) 
      nn_rep_test$Pred <- as.factor(c('Ghost', 'Ghoul', 'Goblin')[idx]) 
      print(paste("sim",nnloop,"=",round(sum(diag(
       table(nn_rep_test$type, nn_rep_test$Pred))) 
       /outsamplesize,5),"%","myseed = ",myseed)) 
      nn3results[1,nnloop] <- sum(diag(table(nn_rep_test$type, nn_rep_test$Pred))) 
    }) 
} 
nn3results 

Jetzt das unerwartete Ergebnis. Da die Simulation 5 einen Fehler zurückgibt, würde ich erwarten, dass der entsprechende einen Wert von -1 aufgrund von error = function(e){nn3results[1,nnloop] <- -1} hat, aber jetzt scheint der ganze Code zu funktionieren, sogar für Simulation 5, als vorher nicht.

[1] "sim 1 = 0.74194 % myseed = 1" 
[1] "sim 2 = 0.73118 % myseed = 2" 
[1] "sim 3 = 0.75269 % myseed = 3" 
[1] "sim 4 = 0.74194 % myseed = 4" 
[1] "sim 5 = 0.70968 % myseed = 5" 
[1] "sim 6 = 0.75269 % myseed = 6" 
> nn3results 
    X1 X2 X3 X4 X5 X6 
1 69 68 70 69 66 70 

Samen sind gleich. Ergebnisse 1-4 sind gleich. Warum funktioniert Simulation 5 jetzt und gibt -1 nicht zurück?

Als eine Seite wird jeder (konstruktive) Code Rat immer geschätzt.

Antwort

1

Der Code in der finally-Anweisung wird immer ausgeführt, wenn ein Fehler auftritt und kein Fehler vorliegt. Daher berechnen Sie in diesem Fall Vorhersagen mithilfe des Modells aus dem vorherigen Schritt (Modell 4). Sie sollten den Code, der Ihr Modell auswertet, in den tryCatch-Block einfügen.

Die finally-Anweisung wird oft verwendet, um sicherzustellen, dass die Dinge bereinigt werden. Schließen Sie beispielsweise eine Datei. Dies sollte mit oder ohne Fehler passieren.

+0

Danke Jan. Du hast recht, wenn ich den Code vom 'finally'-Abschnitt in den Hauptabschnitt' tryCatch expression' verschiebe, hat Simulation 5 kein Ergebnis mehr. Trotzdem ist 'nn3results [5]' überraschend '' 0' und nicht '-1', wie ich es erwarten würde. –

+0

@SC. Ich habe keinen Zugriff auf einen Computer zum Testen, aber ich vermute, dass Sie anstelle des Operators '<-' den Operator' << - 'verwenden müssen, da Sie eine Variable in einem höheren Bereich den Fehlerbehandlungsfunktionen zuweisen . Eine andere häufige Lösung besteht darin, die Ergebnisse als erste Anweisung im tryCatch-Block auf -1 zu initialisieren. Im Fehlerfall wird dieser später überschrieben. Sie benötigen dann keine Fehlerbehandlungsroutinen (außer Sie möchten die Warnungen kennzeichnen) –