在r中使用for循环运行多个模型

时间:2017-01-22 14:20:09

标签: r for-loop

我试图运行一个循环,生成5个随机样本,然后是5个不同的RandomForest模型。

我在第二部分遇到麻烦(运行模型);我无法在以下代码中处理因变量(nam$eR):

numS <- 5 # number of samples
dataS <- ERC3
rfModels <- list()

for(j in 1:numS) {

print(j)
set.seed(j+1)
nam <- paste("RFs", j, sep = "")
assign(nam, dataS[sample(nrow(dataS),100000),]) # Random sample of 100,000 rows.

namM <- paste("RFfit", j, sep = "")
assign(namM, randomForest(as.factor(nam$eR)~., data=nam[,-231], importance = TRUE))

rfModels[[j]] <- namM

}

提前谢谢!

2 个答案:

答案 0 :(得分:3)

我不确定这是否适用于您的情况,因为我没有样本数据,但如果您要使用user_id数据集执行我正在考虑的事情,那么会是这样的......首先,最好有一个数据框列表来容纳你运行模型的数据。这可以按如下方式完成:

$post = new Post([

     'body' => $request->input('body'), 
     'user_id' => $your_use_id
]);

(根据评论,这样做的一个更明智的方法是使用

mtcars

library(dplyr) library(randomForest) dfs <- list() #home for the list of dataframes on which to run a randomforest set.seed(1) for(i in 1:5){ dfs[[i]] <- sample_n(mtcars, size = 10, replace = FALSE) } 列表现在包含 dfs_slicker_approach <- lapply(seq(5), function(i) sample_n(mtcars, size = 10, replace = FALSE)) 列表,其中包含来自dfs数据集的10个随机选择的行。 (显然,你需要更新它以满足你的需求。)

然后我们使用data.frames函数在此列表上运行mtcars函数,如下所示:

randomForest

再次,更改语法以选择您有兴趣预测的列。 lapply列表现在包含所有rfs <- lapply(dfs, function(m) randomForest(mpg ~ ., data = m, importance = TRUE )) 个对象。您可以使用rfs再次访问这些内容。对于instnace,如果我们想要预测值,我们可以这样做:(我们只将第一组预测子集化,以避免打印大量信息)

randomForest

答案 1 :(得分:2)

虽然没有偏离Nick的解决方案,但这是一种使用tidyverse workflow的方法。重点是:通过管道读取代码,使用dplyr动词和purrr功能,并将数据,模型和预测保持在一个漂亮整洁的元素中。

library(randomForest)
library(tidyverse)

set.seed(42)

analysis <- rerun(5, sample_n(mtcars, size = 10, replace = FALSE)) %>% 
  tibble(data = .) %>% 
  rownames_to_column("model_number") %>% 
  mutate(models = map(data, ~randomForest(mpg ~ ., data = .x, importance = TRUE))) %>% 
  mutate(predict = map(models, ~predict(.x)))

然后,您可以在需要时获得所需内容....

comparison <-  analysis %>% 
mutate(actual = map(data, "mpg")) %>% 
unnest(predict, actual)

comparison

# A tibble: 50 × 3
   model_number  predict actual
          <chr>    <dbl>  <dbl>
1             1 14.10348   14.7
2             1 16.78987   15.0
3             1 15.14636   17.3
4             1 15.81265   15.5
5             1 24.11492   21.5
6             1 24.24701   22.8
7             1 15.84953   10.4
8             1 21.72781   32.4
9             1 21.78105   21.0
10            1 15.58614   16.4
# ... with 40 more rows

...轻松查看结果。

ggplot(comparison, aes(actual, predict)) +
  geom_point() +
  facet_wrap(~model_number, nrow = 1)

enter image description here