![](/img/trans.png)
[英]How to input a caret trained random forest model into predict() and performance() functions?
[英]How to apply the trained & tested random forest model to a new dataset in tidymodels?
我已經使用 tidymodels 在 R 中訓練和測試了隨機森林 model。 現在我想使用相同的 model 來預測一個全新的數據集(不是訓練數據集)。
例如 Julia silge,在這篇博文中解釋了訓練、測試和評估 model 的步驟: Juliasilge 的 palmer penguins 。 我想將此 model 應用於具有相同列的全新數據集(預測列除外(此處為性別))
任何人都可以幫助我預測新數據集的代碼。
我可以用示例數據集解釋我嘗試過的內容
library(palmerpenguins)
penguins <- penguins %>%
filter(!is.na(sex)) %>%
select(-year, -island)
#選擇fitst 233行進行訓練和測試
penguins_train_test<-penguins[1:233,]
#從父數據中拆分出其他幾行,並假設這是需要預測(而不是測試)的新數據集。 因此,對於這個假設,我刪除了名為“Sex”的列,需要通過擬合 model 來預測(未測試)
penguins_newdata<-penguins[233:333,-6]
set.seed(123)
penguin_split <- initial_split(penguins_train_test, strata = sex)
penguin_train <- training(penguin_split)
penguin_test <- testing(penguin_split)
創建 model 規范。
rf_spec <- rand_forest() %>%
set_mode("classification") %>%
set_engine("ranger")
penguin_wf <- workflow() %>%
add_formula(sex ~ .)
應用於測試數據
penguin_final <- penguin_wf %>%
add_model(rf_spec) %>%
last_fit(penguin_split)
collect_metrics(penguin_final)
同樣適用於新數據集“penguins_newdata”
penguins_newdata
penguin_wf %>%
add_model(rf_spec) %>%
fit(penguins_newdata)
我得到的結果是以下錯誤
Error: The following outcomes were not found in `data`: 'sex'.
我也試過這種方式
fit(penguin_wf, penguins_newdata)
這是我得到的錯誤
Error: The workflow must have a model. Provide one with `add_model()`.
先感謝您。
您的代碼中的問題是您試圖將最終的 model 擬合到缺少目標變量sex
的新數據上,這就是錯誤告訴您的內容。
Error: The following outcomes were not found in `data`: 'sex'.
畢竟你的工作流程有以下行add_formula(sex ~.) %>%
套餐
library(tidyverse)
library(palmerpenguins)
library(tidymodels)
對訓練和測試數據進行預處理和拆分
penguins <- penguins %>%
filter(!is.na(sex)) %>%
select(-year, -island)
penguins_train_test <- penguins[1:233,]
penguins_newdata <- penguins[233:333,-6]
定義工作流程
rf_spec <- rand_forest() %>%
set_mode("classification") %>%
set_engine("ranger")
penguin_wf <- workflow() %>%
add_formula(sex ~ .) %>%
add_model(rf_spec) %>%
使用工作流在訓練數據上擬合 model
penguin_wf %>%
fit(penguins_train_test) -> model
使用 model 預測新數據
predict(model, penguins_newdata)
output
# A tibble: 101 x 1
.pred_class
<fct>
1 female
2 male
3 male
4 male
5 female
6 male
7 female
8 male
9 male
10 female
# ... with 91 more rows
此處不執行調整,model 使用默認參數制作。 當您通過某種重新采樣來調整超參數時,您可以按照我從您的問題中收集到的方式進行調整,您可以根據特定指標從調整結果中提取它們
param_final <- rf_tune_results %>%
select_best(metric = "auc")
並將它們設置在工作流程中
rf_workflow <- rf_workflow %>%
finalize_workflow(param_final)
這樣,當您在訓練數據上擬合 model 時,將使用最佳超參數。
我在評論中發布的鏈接中提供了其他詳細信息。
@missuse上面的答案看起來很棒,但我只想添加一些關於哪些工作流程不適合以及哪個工作流程適合的澄清信息。 如果您有新數據但還沒有結果,您希望使用合適的工作流程對其進行預測。
library(tidymodels)
#> Registered S3 method overwritten by 'tune':
#> method from
#> required_pkgs.model_spec parsnip
library(palmerpenguins)
penguins <- penguins %>%
filter(!is.na(sex)) %>%
select(-year, -island)
penguins_newdata <- penguins[233:333,-6]
set.seed(123)
penguin_split <- initial_split(penguins, strata = sex)
penguin_train <- training(penguin_split)
penguin_test <- testing(penguin_split)
rf_spec <- rand_forest() %>%
set_mode("classification") %>%
set_engine("ranger")
unfitted_wf <- workflow() %>%
add_formula(sex ~ .) %>%
add_model(rf_spec)
penguin_final <- last_fit(unfitted_wf, penguin_split)
collect_metrics(penguin_final)
#> # A tibble: 2 x 4
#> .metric .estimator .estimate .config
#> <chr> <chr> <dbl> <chr>
#> 1 accuracy binary 0.940 Preprocessor1_Model1
#> 2 roc_auc binary 0.983 Preprocessor1_Model1
# can predict on this fitted workflow
fitted_wf <- pluck(penguin_final$.workflow, 1)
predict(fitted_wf, new_data = penguins_newdata)
#> # A tibble: 101 x 1
#> .pred_class
#> <fct>
#> 1 female
#> 2 male
#> 3 female
#> 4 male
#> 5 female
#> 6 male
#> 7 female
#> 8 male
#> 9 male
#> 10 female
#> # … with 91 more rows
由reprex package (v2.0.0) 於 2021 年 5 月 6 日創建
我使用變量名希望能更清楚地說明哪個工作流是哪個。 它類似於 model,您可以在其中指定 model,但在將其擬合到一些訓練數據之前,它不能用於預測。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.