如何将经过训练和测试的随机森林模型应用于 tidymodels 中的新数据集?

How to apply the trained & tested random forest model to a new dataset in tidymodels?

我已经使用 tidymodels 在 R 中训练和测试了一个随机森林模型。现在我想使用相同的模型来预测一个全新的数据集(不是训练数据集)。

例如 Julia silge,在这篇博客 post : Juliasilge's palmer penguins 中解释了训练、测试和评估模型的步骤。我想将此模型应用于具有相同列的全新数据集(预测列(此处为性别)除外)

任何人都可以帮助我提供预测新数据集的代码。

我可以用示例数据集解释我尝试过的内容

library(palmerpenguins)

penguins <- penguins %>%
  filter(!is.na(sex)) %>%
  select(-year, -island)

#选择最适合的233行进行训练和测试

penguins_train_test<-penguins[1:233,]

#从父数据中拆分出其他几行,并假设这是需要预测(而非测试)的新数据集。因此,对于这个假设,我删除了名为“性别”的列,需要通过拟合模型(而不是测试)来预测它

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)

正在创建模型规格。

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()`.

提前致谢。

您的代码中的问题是您试图将最终模型拟合到缺少目标变量的新数据上 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) %>%

使用工作流在训练数据上拟合模型

penguin_wf %>%      
  fit(penguins_train_test) -> model

使用模型预测新数据

predict(model, penguins_newdata)

输出

# 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

这里没有进行任何调优,使用默认参数制作模型。当您通过某种重采样来调整超参数时,您可以按照我从您的问题中收集到的方式进行调整,您可以从特定指标上最好的调整结果中提取它们

param_final <- rf_tune_results %>%
  select_best(metric = "auc")

并在工作流程中设置它们

rf_workflow <- rf_workflow %>%
  finalize_workflow(param_final)

这样,当您在训练数据上拟合模型时,将使用最佳超参数。

其他详细信息在 link I posted in the comment 中提供。

@missuse 上面的答案看起来不错,但我只想添加一些澄清信息,说明哪个工作流程不适合,哪个工作流程适合。如果您的新数据还没有结果,您希望使用 fitted 工作流程对其进行 predict

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-05-06

我使用变量名希望能够更加清楚地说明哪个工作流程是哪个。它类似于一个模型,您可以在其中指定一个模型,但在您将其拟合到一些训练数据之前,它不能用于预测。