簡體   English   中英

在R中使用for循環運行多個模型

[英]running multiple models using for-loop in r

我正在嘗試運行一個循環,該循環生成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

}

先感謝您!

我不確定這是否會完全適合您的情況,因為我沒有示例數據,但是如果您要執行我想使用的mtcars數據集正在尋找的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列表現在包含data.frames列表,其中包含mtcars數據集中隨機選擇的10行。 (顯然,您需要對此進行更新以適合您的需求。)

然后,我們使用randomForest函數在此列表上運行lapply函數,如下所示:

rfs <- lapply(dfs, function(m) randomForest(mpg ~ ., 
                                            data = m, importance = TRUE ))

再次,更改語法以選擇要對其進行預測的列。 現在, rfs列表包含我們所有的randomForest對象。 您可以再次使用lapply訪問它們。 對於Instnace,如果我們需要預測值,則可以執行以下操作:(我們將僅子集為第一組預測,以避免打印大量信息)

> lapply(rfs, as.data.frame(predict))[1]
[[1]]
                       value
Merc 230            22.85464
Merc 450SE          17.61810
Fiat 128            22.31571
Porsche 914-2       23.95909
Valiant             21.28786
Pontiac Firebird    15.93824
Ford Pantera L      21.20373
Chrysler Imperial   14.40740
Lincoln Continental 16.43074
Mazda RX4 Wag       21.18467

在不偏離Nick解決方案的情況下,這是使用tidyverse工作流程的一種方法。 重點是:使用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)

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM