【问题标题】:Store output of nested for loop of the following R codes存储以下 R 代码的嵌套 for 循环的输出
【发布时间】:2021-09-16 22:21:16
【问题描述】:

未提供数据,但代码可能易于理解。我正在使用嵌套 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
          
        }
      }
    }

【问题讨论】:

  • 您可以递归地保存列表中的所有内容

标签: r for-loop random-forest


【解决方案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 轻松添加进度条

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多