具有R中单个隐藏层大小变化的交叉验证多个神经网络

问题描述 投票:1回答:1

我必须使用交叉验证来找出模型的单个隐藏层应包含的神经元数量(使用nnet包)。我必须在R中编写一个函数,该函数将数据,模型和参数n作为输入,并使用具有n层的神经网络在随机拆分的训练和测试集上根据准确性计算模型性能。循环使用此函数,使用神经网络计算隐藏层大小为n = 1、2、3、20的性能。我的主要目标是了解隐藏层的大小,因为最后我必须绘制一个图形以显示准确性与模型复杂性之间的关系。因此,理想情况下,我希望对测试集和火车集进行所有精度测量]

我得到错误:找不到对象'accNN',这是用于存储结果的空向量。我想比较20个模型,因此在循环中我还必须创建20个空向量来存储20个不同的结果(accNN1,accNN2,accNN3等),对正确编码循环会有所帮助。

非常感谢!

set.seed(1)
df <- data.frame(
    X = sample(1:100),
    Y = sample(1:100),
    Z = sample(1:100),
    target = sample(c("yes", "no"), 10, replace = TRUE))

# Create K folds with equal size for cross validation.
nFolds  <- 5
myFolds <- cut(seq(1, nrow(df)), 
                breaks = nFolds, 
                labels=FALSE)
table(myFolds)

# Create object for number of neurons
sizehiddenlayer <- 3

# Define the model
mdl <- target ~ X + Y + Z


for (j in 1:sizehiddenlayer) {
   # Initialize empty vectors to collect results
   accNN[j]    <- rep(NA, nFolds)

   for (i in 1:nFolds) {
   cat("Analysis of fold", i, "\n")

   # 1: Define training and test sets
   testObs  <- which(myFolds == i, arr.ind = TRUE)
   dfTest   <- df[ testObs, ]
   dfTrain  <- df[-testObs, ]

   # 2: Train the models on the training sets
   rsltNN[j] <- nnet(mdlB, data = df, size = j)

   # 3: Predict values for the test sets
   predNN[j] <- predict(rsltNN[j], type ="class")

   # 4: Measure accuracy and store the results
   accNN[j] <- mean(df$target == predNN[j])
}
}

我必须使用交叉验证来找出模型的单个隐藏层应包含的神经元数量(使用nnet包)。我必须在R中编写一个函数,该函数接受数据,模型和...

r loops neural-network cross-validation nnet
1个回答
0
投票

[您需要创建一个对象来存储结果,使用箭头不会将对象附加到现有的矢量或列表上,因此类似的事情会起作用(请注意,您在dfTrain上进行训练,并在dfTest上进行预测:

© www.soinside.com 2019 - 2024. All rights reserved.