2017-01-22 81 views
0

我想運行一個循環,產生5個隨機樣本,然後5個不同的RandomForest模型。運行多個模型使用for循環在r

我在第二部分遇到麻煩(運行模型);我不能接近因變量(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

我不確定這是否可以正好適用於您的案例,因爲我沒有示例數據,但是如果您要按照我認爲的要求來搜索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個隨機選擇的行。 (當然,你要更新這個以滿足您的需求。)

然後我們使用lapply功能這個名單上運行randomForest功能如下:

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

再次,改變語法選擇您有興趣預測的列。 rfs列表現在包含我們所有的randomForest對象。您可以再次使用lapply訪問這些文件。對於instnace,如果我們要預測值,我們可以做到這一點如下:(我們將子集只有第一組預測,以避免打印AA很多信息)

> 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 
+0

我可能錯過了一些東西;你如何運行5個數據集?並且..你能告訴我什麼功能(m)的部分.. tks! – staove7

+0

'lapply'讓我們在列表中的每個元素上應用一個函數。我們製作了一個數據幀列表,我們稱之爲'dfs',然後在該列表上使用'lapply',用'randomForest(mpg〜。,data = m,importance = TRUE)'函數來命中每個數據幀。在這種情況下,'m'只是一個佔位符/簿記工具,所以我們知道我們將每個完整的數據框元素從'dfs'列表傳遞到'randomForest'的'data ='參數。 –

+0

偉大的答案-Tks ..我寫了下面一行:'lapply(dataL,function(m)randomForest(as.factor(eR)〜。, data = m [, - 231],importance = TRUE))'但它告訴我_ .factor(x):object'eR'not found_。你可以幫我解決這個問題.. – staove7

2

雖然不是從尼克的解決方案偏離,這裏是使用tidyverse workflow的方法。亮點包括:通過管道讀取代碼,使用dplyr動詞和purrr函數,並將數據,模型和預測保存在一個很好的整齊的tibble中。

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

+0

非常(非常!)好方法..我會嘗試。只有一件事 - 你認爲這對於大型數據集(比如100,000個觀察值和更多)也會有好處;我正在談論可視化部分。 – staove7

+0

它會有點混亂,但你可以看看其他方法,以減少數據的合理數量,以直觀比較。 –