2016-11-26 190 views
1

我正在为Kaggle,“Ghost,Ghoul,Goblin”挑战建立一个神经网络。R tryCatch neuralnet,意想不到的输出

我正在将我的(训练)数据抽样X次(为了说明目的X = 6),将它分解为训练和测试集。然后我在每个X(6)数据集上运行我的神经网络并记录准确性。我这样做,这样我就可以比较不同网络(一层3,4,5隐藏,两层3 + 3,4 + 3等)之间的准确性

我的神经网络代码部分是

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))) 
} 

执行正是我所期望的,直到迭代5在神经网络不收敛如下

[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' 

所以不用担心。我修改了我的代码并将其放入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 

现在意想不到的结果。由于仿真5返回一个错误,我期望相应的nn3results的值为-1归因于error = function(e){nn3results[1,nnloop] <- -1},但是现在整个代码似乎都可以工作,即使对于仿真5,以前它不会。

[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 

种子是一样的。结果1-4是一样的。为什么模拟5现在可以工作而不返回-1?

顺便提一下,任何(建设性的)代码建议总是赞赏。

回答

1

当出现错误并且没有错误时,finally语句中的代码总是执行。因此,在这种情况下,您正在使用上一步(模型4)中的模型计算预测。您应该将评估模型的代码放入tryCatch块中。

finally语句经常被用来确保事物被清理。例如关闭一个文件。这应该发生有或没有错误。

+0

谢谢1月您将代码从'finally'部分移至主'tryCatch表达式'部分时是正确的,模拟5不再有结果。但令人惊讶的是,'nn3results [5]'是'0'而不是'-1',正如我所期望的那样。 –

+0

@SC。我无法访问计算机进行测试,但是我怀疑您必须使用'<< - '运算符而不是'<-'运算符,因为您正在将错误处理函数分配给更高范围内的变量。另一个常见的解决方案是将结果初始化为-1,作为tryCatch块中的第一条语句。如果没有错误,则稍后将被覆盖。然后您不需要错误处理程序(除非要标记警告) –