R Tidymodels:利用预处理安装基于配方的工作流程后,要保存哪些对象以供生产使用?

wph*_*ton 8 r r-recipes tidymodels

在设计了基于Tidymodels配方的工作流程(经过调整然后适合一些训练数据)后,我不清楚应该将哪些对象(适合的“工作流程”、“配方”等)保存到磁盘以用于预测新的生产中的数据。我知道我可以使用saveRDS()/ readRDS()write_rds()/read_rds()或其他选项来实际保存/加载这些对象,但是哪些

在干净的 R 环境中,我将收到新的原始数据,这些数据需要使用我在训练模型时使用的“配方”进行预处理。然后我想在预处理后根据该数据进行预测。如果我打算像处理训练数据一样使用prep()bake()函数来预处理新数据,那么我将至少需要配方和原始训练数据,它似乎可以发挥prep()作用。另外,我还需要拟合模型/工作流程来进行预测。看起来是三个物体。如果我将 SESSION 1 中的工作流对象保存到磁盘,那么我可以分别使用pull_workflow_prepped_recipe()和来从 SESSION 2 中提取配方和模型pull_workflow_fit()。但prep()似乎需要原始训练数据,我可以将其保留在工作流程中,并提前使用retain = TRUE...,但在调用 后,它会从工作流程中删除fit()。听到我的呼救声吧!:)

因此,想象两个不同的 R 会话,第一个会话是我进行所有训练和模型构建,第二个会话是一些正在运行的生产应用程序,它使用从第一个会话中学到的知识。我需要 SESSION1 底部箭头以及 SESSION 2 中多个位置的帮助。我使用 Tidymodels入门作为此示例的基础。

第一节

library(tidymodels)
library(nycflights13)
library(readr)
set.seed(123)
flight_data <- 
  head(flights, 500) %>% 
  mutate(
    arr_delay = ifelse(arr_delay >= 30, "late", "on_time"),
    arr_delay = factor(arr_delay),
    date = as.Date(time_hour)
  ) %>% 
  inner_join(weather, by = c("origin", "time_hour")) %>% 
  select(dep_time, flight, origin, dest, air_time, distance, carrier, date, arr_delay, time_hour) %>% 
  na.omit() %>% 
  mutate_if(is.character, as.factor)

set.seed(555)
data_split <- initial_split(flight_data, prop = 3/4)
train_data <- training(data_split)
test_data  <- testing(data_split)

flights_rec <- 
  recipe(arr_delay ~ ., data = train_data) %>% 
  update_role(flight, time_hour, new_role = "ID") %>% 
  step_date(date, features = c("dow", "month")) %>%
  step_holiday(date, holidays = timeDate::listHolidays("US")) %>%
  step_rm(date) %>%
  step_dummy(all_nominal(), -all_outcomes()) %>%
  step_zv(all_predictors())

lr_mod <- 
  logistic_reg() %>% 
  set_engine("glm")

flights_wflow <- 
  workflow() %>% 
  add_model(lr_mod) %>% 
  add_recipe(flights_rec)

flights_fit <- 
  flights_wflow %>% 
  fit(data = train_data)

predict(flights_fit, test_data)

### SAVE ONE OR MORE OBJECTS HERE FOR NEXT SESSION  <------------
# What to save? workflow (pre or post fit()?), recipe, training data...etc.
write_rds(flights_wflow, "flights_wflow.rds")  # Not fitted workflow
write_rds(flights_fit, "flights_fit.rds")  # Fitted workflow
Run Code Online (Sandbox Code Playgroud)

第二节

### READ ONE OR MORE OBJECTS HERE FROM PRIOR SESSION <------------
flights_wflow <- read_rds("flights_wflow.rds")
flights_fit <- read_rds("flights_fit.rds")

# Acquire new data, do some basic transforms as before
new_flight_data <- 
  tail(flights, 500) %>% 
  mutate(
    arr_delay = ifelse(arr_delay >= 30, "late", "on_time"),
    arr_delay = factor(arr_delay),
    date = as.Date(time_hour)
  ) %>% 
  inner_join(weather, by = c("origin", "time_hour")) %>% 
  select(dep_time, flight, origin, dest, air_time, distance, carrier, date, arr_delay, time_hour) %>% 
  na.omit() %>% 
  mutate_if(is.character, as.factor)

# Something here to preprocess the data with recipe as in SESSION 1 <----------
# new_flight_data_prep <- prep(??)
# new_flight_data_preprocessed <- bake(??)

# Predict new data
predict(flights_fit, new_data = new_flight_data_preprocessed)
Run Code Online (Sandbox Code Playgroud)

Jul*_*lge 9

根据您的限制,您可以灵活地处理此问题,但通常我会建议保存/序列化安装的工作流程,也许在使用屠夫来减小其大小之后。您可以在此存储库中看到示例模型拟合脚本,该脚本最后显示了我如何保存拟合的工作流程。

当您使用此工作流程进行预测时,需要记住一些事项。我在同一存储库中有一个示例 Plumber API,它演示了预测该特定工作流程所需的内容。请注意,如何为此 API 加载/附加预测所需的包。我没有使用所有 tidymodel,而是仅使用我需要的特定包,以获得更好的性能和更小的容器。