Вам нужно создать объект для хранения результатов, используя стрелку, чтобы не добавить объект в существующий вектор или список, поэтому что-то вроде этого будет работать (обратите внимание, вы тренируетесь на dfTrain и прогнозируете на dfTest:
results = vector("list",sizehiddenlayer)
for (j in 1:sizehiddenlayer) {
results[[j]]$accNN <- rep(NA, nFolds)
results[[j]]$rsltNN <- vector("list",nFolds)
results[[j]]$predNN <- vector("list",nFolds)
for (i in 1:nFolds) {
testObs <- which(myFolds == i, arr.ind = TRUE)
dfTest <- df[ testObs, ]
dfTrain <- df[-testObs, ]
results[[j]]$rsltNN[[i]] <- nnet(mdl, data = dfTrain, size = j)
results[[j]]$predNN[[i]] <- predict(results[[j]]$rsltNN[[i]],dfTest, type ="class")
results[[j]]$accNN[i] <- mean(dfTest$target == results[[j]]$predNN[[i]])
}
}
Результаты упорядочены в виде списка:
head(results[[1]],2)
$accNN
[1] 0.6 0.6 0.6 0.6 0.6
$rsltNN
$rsltNN[[1]]
a 3-1-1 network with 6 weights
inputs: X Y Z
output(s): target
options were - entropy fitting
$rsltNN[[2]]
a 3-1-1 network with 6 weights
inputs: X Y Z
output(s): target
options were - entropy fitting
Другой способ - использовать caret для обработки CV et c, или вы можете попробовать что-то вроде purrr:
library(purrr)
library(dplyr)
fit = function(dat,Folds,i,j){nnet(mdl, data = dat[Folds!=i,],size = j)}
pred = function(dat,Folds,mdl,i){predict(mdl,dat[Folds==i,],type="class")}
accr = function(dat,Folds,prediction,i){mean(dat$target[Folds==i] == prediction)}
results = expand.grid(hiddenlayer=1:sizehiddenlayer,fold=1:nFolds) %>%
tibble() %>%
mutate(
mdl=map2(.x=fold,.y= hiddenlayer,~fit(dat=df,F=myFolds,i =.x ,j=.y)),
pred = map2(.x=fold,.y= mdl,~pred(dat=df,F=myFolds,mdl = .y ,i=.x)),
accuracy = map2(.x=fold,.y= pred,~accr(dat=df,F=myFolds,prediction = .y ,i=.x))
)
results
# A tibble: 15 x 5
hiddenlayer fold mdl pred accuracy
<int> <int> <list> <list> <list>
1 1 1 <nnt.frml> <chr [20]> <dbl [1]>
2 2 1 <nnt.frml> <chr [20]> <dbl [1]>
3 3 1 <nnt.frml> <chr [20]> <dbl [1]>
4 1 2 <nnt.frml> <chr [20]> <dbl [1]>
5 2 2 <nnt.frml> <chr [20]> <dbl [1]>
6 3 2 <nnt.frml> <chr [20]> <dbl [1]>
7 1 3 <nnt.frml> <chr [20]> <dbl [1]>
И вы можете получить к ним доступ так:
results$mdl[[1]]
a 3-1-1 network with 6 weights
inputs: X Y Z
output(s): target
options were - entropy fitting
> results$pred[[1]]
[1] "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no"
[16] "no" "no" "no" "no" "no"
> results$accuracy[[1]]
[1] 0.6