Сохраните выходные данные вложенного цикла for следующих кодов R

#r #for-loop #random-forest

Вопрос:

Данные не предоставлены, но коды могут быть вам понятны. Я использую вложенный цикл for и хочу сохранить результаты. Как мы вообще можем это сделать?

 library(ranger)
    
    n_folds = 10
    
    hyper_grid <- expand.grid(
      mtry = seq(5, 30, 15),
      min.node.size = seq(1, 4, 4)
    )
    
    for (i in 1:n_folds) {
      select <- cv_ind!=i
      data.train <- train_data[select,]
      data.test <- train_data[!select,]
      for (j in unique(hyper_grid$mtry)) {
        for (k in unique(hyper_grid$min.node.size)) {
          
          rf_mod <- ranger(target~., num.trees = 500, mtry = j, min.node.size =k,
                           data = data.train, classification = TRUE, replace = FALSE,
                           importance = "permutation", oob.error = TRUE,
                           splitrule = "gini", keep.inbag = TRUE)
          
          pred <- predict(rf_mod, data = data.test[,-data.test$target], type = "response")
          
          accur <- sum(diag(table(pred$predictions, data.test$target)))/25
          
          x[i,] <- accur
          
        }
      }
    }
 

Комментарии:

1. вы можете рекурсивно сохранять все в списке

Ответ №1:

вы могли бы попробовать это решение с помощью mapply

 n_folds <- 10

hyper_grid <- expand.grid(
  mtry = seq(5, 30, 15),
  min.node.size = seq(1, 4, 4),
  # add folds to hypergrid
  fold_index = c(1:n_folds)
)

# putting a complete smallest iteration in one function for easier
# understanding
make_model_list <- function(mtry,
                            min.node.size,
                            i){

  select <- cv_ind!=i
  data.train <- train_data[select,]
  data.test <- train_data[!select,]
  
  rf_mod <- ranger(target~., num.trees = 500, mtry = j, min.node.size =k,
                   data = data.train, classification = TRUE, replace = FALSE,
                   importance = "permutation", oob.error = TRUE,
                   splitrule = "gini", keep.inbag = TRUE)
  
  pred <- predict(rf_mod, data = data.test[,-data.test$target], type = "response")
  
  accur <- sum(diag(table(pred$predictions, data.test$target)))/25
  
  # put the results you want to keep in the res list
  # i put all in there as an example
  res <- list(mtry = mtry,
              min.node.size=min.node.size,
              fold_index=i,
              model= rf_mod
              prediction = pred,
              accur = accur)
  return(res)
}

result <- mapply(make_model_list,
                 hyper_grid$mtry,
                 hyper_grid$min.node.size,
                 hyper_grid$fold_index,
                 SIMPLIFY = FALSE)

# result is then readable like this for example
result[[1]]$min.node.size
 

вы можете изменить выход make_model_list в зависимости от ваших потребностей. Самое замечательное в использовании этого решения то, что вы можете легко добавлять индикаторы прогресса с помощью Pbapply