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.
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. –
@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) –