神经网络函数,R,在进行超参数暴力搜索优化时出现错误

neuralnet function, R, bugging when doing hyperparameter brute search optimization

我目前正在尝试使用 R 中的 neuralnet 包拟合具有 3 个隐藏层的神经网络。这是一个分类问题。

我想测试一系列可能的隐藏层参数,并选择 returns 分类错误率最低的参数 - 使用 5-Fold-CV。请在下面找到代码和 dput 输出:

structure(list(Pregnancies = c(-0.733555340911315, -0.0470227782635459, 
0.639509784384224, -1.0768216222352, -0.733555340911315, -0.0470227782635459, 
2.69910747232753, 2.35584119100365, -0.733555340911315, -0.0470227782635459, 
-0.0470227782635459, 0.296243503060339, 0.296243503060339, -0.0470227782635459, 
-0.733555340911315, -0.733555340911315, 0.639509784384224, 1.66930862835588, 
1.32604234703199, 1.32604234703199, -1.0768216222352, -1.0768216222352, 
-0.390289059587431, -0.733555340911315, 0.296243503060339, -0.390289059587431, 
0.639509784384224, 0.296243503060339, 1.32604234703199, -0.390289059587431, 
-0.390289059587431, 0.296243503060339, 1.32604234703199, -0.390289059587431, 
0.982776065708108, -0.733555340911315, 0.982776065708108, -0.733555340911315, 
-0.733555340911315, -0.733555340911315, 0.296243503060339, -0.0470227782635459, 
-1.0768216222352, -0.0470227782635459, 1.66930862835588, -0.733555340911315, 
1.32604234703199, 0.296243503060339, -1.0768216222352, -0.390289059587431
), Glucose = c(-1.06577093437178, -1.4301021648105, 1.48454767869922, 
-0.105261326851534, -0.204624389698456, 0.159706840740259, 0.722764196872819, 
0.126585819791285, -0.80080276677999, 1.21957951110743, -1.09889195532076, 
-0.602076641086146, -0.337108473494353, 1.94824197198486, -0.602076641086146, 
-0.668318682984094, -1.09889195532076, 1.81575788818896, 0.954611343515638, 
2.18008911862768, -0.701439703933068, -0.535834599188197, 0.656522154974871, 
-0.867044808677939, 0.822127259719741, -0.701439703933068, 0.590280113076922, 
0.259069903587181, -1.26449706006563, -0.370229494443327, -0.701439703933068, 
0.0603437778933366, -1.33073910196358, 0.689643175923845, 0.755885217821793, 
-1.66194931145332, -0.933286850575887, 0.0272227569443625, -1.33073910196358, 
0.159706840740259, 0.755885217821793, -1.26449706006563, -0.867044808677939, 
1.65015278344409, 1.12021644826051, -1.06577093437178, 1.28582155300538, 
-0.734560724882042, 1.35206359490333, -0.469592557290249), BloodPressure = c(-0.404485476478996, 
-1.79728923982648, 0.117815934776311, 1.16241875728693, -0.0562845356421244, 
1.5106196981238, 2.03292110937911, -0.0562845356421244, -0.404485476478996, 
0.466016875613183, -1.10088735815274, -0.926786887734304, 0.117815934776311, 
-0.578585946897432, 0.814217816450055, -1.79728923982648, -0.404485476478996, 
1.68472016854223, -0.404485476478996, -0.23038500606056, 1.5106196981238, 
-0.578585946897432, -1.10088735815274, -0.404485476478996, 1.24946899249614, 
-0.404485476478996, -0.578585946897432, 1.33651922770536, 0.640117346031619, 
0.291916405194747, -0.23038500606056, 0.814217816450055, 0.640117346031619, 
0.988318286868491, 0.117815934776311, -1.97138971024492, -1.79728923982648, 
1.68472016854223, 0.117815934776311, -1.27498782857118, -1.10088735815274, 
-1.10088735815274, 1.24946899249614, 0.117815934776311, -0.752686417315868, 
0.466016875613183, -1.44908829898961, 0.466016875613183, 0.466016875613183, 
0.291916405194747), SkinThickness = c(-0.550335739052064, 0.317989382362936, 
-0.936258015236509, 1.7651979180546, 0.125028244270714, 1.18631450377794, 
0.414469951409047, -0.260894031913731, -1.32218029142095, 0.703911658547381, 
-1.7081025676054, 0.414469951409047, 1.7651979180546, -0.357374600959842, 
-1.7081025676054, -1.32218029142095, -0.743296877144286, 0.510950520455159, 
1.28279507282405, 0.993353365685714, 3.01944531565405, 1.18631450377794, 
0.510950520455159, -1.51514142951318, -0.16441346286762, -0.839777446190398, 
0.60743108950127, -0.839777446190398, -0.260894031913731, 0.0285476752246028, 
-0.357374600959842, -1.32218029142095, 1.08983393473183, -1.03273858428262, 
-0.16441346286762, -1.03273858428262, 0.125028244270714, 2.15112019423905, 
-1.03273858428262, 0.0285476752246028, -0.0679328938215084, 0.221508813316825, 
-0.357374600959842, 0.414469951409047, -0.260894031913731, 0.510950520455159, 
0.317989382362936, -1.32218029142095, 2.6335230394696, 0.125028244270714
), Insulin = c(-0.541966337004785, -0.604415367734054, 0.301095577840341, 
0.87354502619197, -0.521149993428362, 0.925585885133028, -0.000741404017790264, 
-0.323394729452345, -0.0631904347470589, 1.02966760301514, -0.958293208533242, 
0.478034498239936, 0.634157075063107, -0.791762459921859, -0.666864398463322, 
-1.14564030072105, -1.2809465339678, 1.60211705136677, 2.03926026647165, 
1.64374973851962, -0.375435588393402, -0.042374091170636, -0.188088496205596, 
-1.12482395714463, -0.479517306275516, -0.583599024157631, -0.0631904347470589, 
1.28987189772043, -0.781354288133648, -0.21931301157023, -0.781354288133648, 
0.311503749628553, -1.02074223926251, -0.854211490651128, 0.852728682615547, 
-0.729313429192591, -0.854211490651128, 0.769463308309856, -1.1040076135682, 
0.0617076267114783, -0.0631904347470589, -1.33298739290885, -1.14564030072105, 
-0.115231293688116, 3.631710550068, -1.13523212893284, 0.301095577840341, 
-0.989517723897877, -0.479517306275516, -0.479517306275516), 
    BMI = c(-0.709569819818014, -0.25689403975692, -1.06858854193543, 
    2.05331338952039, 0.305048307905129, 1.03869526179725, 0.617238501050711, 
    -0.24128453009964, -1.47443579302469, -0.163236981813245, 
    -1.22468363850822, -1.34955971576646, 0.695286049337106, 
    0.211391249961454, -2.0675971600013, -1.3183406964519, -1.28712167713734, 
    0.164562720989617, 0.320657817562408, 0.788943107280781, 
    2.20940848609318, 1.38210447425739, -1.13102658056455, -2.03637814068674, 
    -0.584693742559781, 0.0396866437313833, -0.631522271531618, 
    0.383095856191524, -0.522255703930664, -0.0383609045550123, 
    0.913819184539014, -0.100798943184129, 2.1937989764359, -1.2402931481655, 
    0.195781740304174, -1.91150206342851, -0.615912761874339, 
    2.66208426615427, -0.9437124646772, -0.615912761874339, -0.491036684616106, 
    0.258219778933291, 0.742114578308943, 0.102124682360499, 
    0.211391249961454, -0.225675020442362, -0.334941588043315, 
    -1.47443579302469, 3.20841710415904, 0.148953211332337), 
    DiabetesPedigreeFunction = c(-1.15930102674571, -0.876165113386904, 
    0.308811116596248, 0.182972932881223, 0.10607182061093, 0.717785213670079, 
    -0.855192082767733, -1.02647183282429, -0.0407393937232661, 
    1.23162446383976, -0.809750516426196, 1.6336075507072, 3.11570171446194, 
    -0.795768496013416, -0.0267573733104856, 0.0955853053013444, 
    -0.547587633686561, -0.110649495787169, 0.766722285114811, 
    -0.855192082767733, 1.61962553029442, -1.13832799612654, 
    0.700307688154103, -0.575551674512122, -1.08239991447542, 
    1.28755254549089, -0.306397781566097, -0.935588700141221, 
    0.938002035171372, 0.696812183050908, -0.610506725544073, 
    -0.194541618263852, -0.830723547045367, 0.917029004552202, 
    -0.851696577664538, -0.614002230647269, -0.498650562241829, 
    -0.607011220440878, -0.753822434775074, 1.05684920868001, 
    -0.739840414362294, -0.568560664305732, -0.879660618490099, 
    -1.04744486344347, 0.155008892055662, -1.07191339916583, 
    0.312306621699443, -0.963552740966782, 0.910037994345811, 
    -0.330866317288462), Age = c(-0.980707216961708, -0.453522925075076, 
    2.18239853435809, 0.073661366811557, 0.179098225188884, -0.348086066697749, 
    2.18239853435809, 1.12802995058482, -0.875270358584382, -0.242649208320423, 
    -0.875270358584382, 0.28453508356621, 2.70958282624472, -0.453522925075076, 
    -0.875270358584382, -0.453522925075076, -0.0317754915657695, 
    2.92045654299937, 1.23346680896215, 1.12802995058482, 0.073661366811557, 
    -0.875270358584382, -0.664396641829729, -0.558959783452402, 
    -0.348086066697749, -0.242649208320423, -0.453522925075076, 
    -0.769833500207055, 0.60084565869819, -0.348086066697749, 
    -0.453522925075076, 0.389971941943537, 1.23346680896215, 
    -0.980707216961708, 1.0225930922075, -0.875270358584382, 
    -0.769833500207055, 0.073661366811557, -0.664396641829729, 
    -0.980707216961708, 0.706282517075516, -0.558959783452402, 
    -0.664396641829729, -0.664396641829729, 1.65521424247145, 
    -0.769833500207055, 0.917156233830169, -0.980707216961708, 
    -0.558959783452402, -0.769833500207055), Y = structure(c(1L, 
    2L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 
    1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 
    2L, 1L, 2L, 1L), .Label = c("0", "1"), class = "factor")), row.names = c(NA, 
50L), class = "data.frame")
library(magrittr)
library(dplyr)
library(caret)
library(neuralnet)

set.seed(12345)
Foldos_5 <- createFolds(df_std$Y, k = 5)

tune_grid <- expand.grid(
     layer1 = 1:3,
     layer2 = 1:3,
     layer3 = 1:3)
  
#TRAIN::
erreur_5cv <- matrix(
  nrow = nrow(tune_grid),
  ncol = 5
)

for(params in 1:nrow(tune_grid)){
  for(j in 1:length(Foldos_5)){
    a <- c(1:5)
    idx_garde <- a[a!=j]
    donnee_train <- df_std[Foldos_5[idx_garde] %>% unlist,] 

    #neuralnet - cant use factors::
    donnee_train %<>%
      mutate(Y = ifelse(Y == 0, 0, 1))
    
    modele <- neuralnet(Y ~ ., 
                        data = donnee_train,
                        hidden = as.numeric(tune_grid[params,]),
                        linear.output = F, threshold = 0.01,
                        act.fct = 'tanh')
    
    idx_test <- a[a==j]
    
    donnee_test <- df_std[Foldos_5[[idx_test]],] %>%
      dplyr::select(-c("Y")) #il faut enlever "Y" pour la fonction predict
    donnee_check <- df_std[Foldos_5[[idx_test]],] %>%
      dplyr::select(c("Y")) 
    
    result <- predict(modele, newdata = donnee_test)
    
    pred <- ifelse(result[,1] > 0.5, 1, 0)
    mean( (donnee_check$Y != pred) ) -> erreur_5cv[params,j]
  }
}

问题是,最终当 运行 执行此循环时,我收到以下错误:“error in cbind(1, pred) %*% weights[[num_hidden_layers + 1]] : 需要 numeric/complex matrix/vector 个参数 另外: 警告信息: 算法没有收敛于 stepmax 内的 1 次重复中的 1 次。"

我在论坛上看到许多试图解决这个问题的帖子 - 其中两个已在此处实现,将预测变量“Y”、变量和另一个变化因子 (“Y”) 移除为虚拟变量。

但问题是,如果我尝试使用循环中的最后一个 j 和参数值重现错误,我就不会再得到它了。所以这个错误似乎只发生在循环中 运行ning 神经网络时。每次我 运行 这个循环,我还会在它停止的地方得到一组不同的 j 和 params 值。

我完全不知道是什么原因造成的,也不知道如何解决它,因为它在没有循环的情况下也能正常工作。任何指针将不胜感激。

好吧,您使用的是 neuralnet 包,在某些迭代中,在传递参数的情况下,neuralnet() 函数使用的算法没有收敛,因此函数没有 return净重。错误发生后,您可以立即检查模型并发现权重不存在。例如,我将使用的阈值更改为 .1,算法在所有迭代中收敛,如下面的代码所示。

set.seed(10)
for(params in 1:nrow(tune_grid)){
   for(j in 1:length(Foldos_5)){
      a <- c(1:5)
      idx_garde <- a[a!=j]
      donnee_train <- df_std[Foldos_5[idx_garde] %>% unlist,] 

      #neuralnet - cant use factors::
      donnee_train %<>%
      mutate(Y = ifelse(Y == 0, 0, 1))

      modele <- neuralnet(Y ~ ., 
                          data = donnee_train,
                          hidden = as.numeric(tune_grid[params,]),
                          linear.output = F, threshold = 0.1, 
                          act.fct = 'tanh')

      idx_test <- a[a==j]
      donnee_test <- df_std[Foldos_5[[idx_test]],] %>%
      dplyr::select(-c("Y")) #il faut enlever "Y" pour la fonction predict
      donnee_check <- df_std[Foldos_5[[idx_test]],] %>%
      dplyr::select(c("Y")) 
 
      result <- predict(modele, newdata = donnee_test)
 
      pred <- ifelse(result[,1] > 0.5, 1, 0)
      mean( (donnee_check$Y != pred) ) -> erreur_5cv[params,j]
  }
}