[英]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.