После разработки рабочего процесса на основе рецептов Tidymodels, который настраивается и адаптируется к некоторым обучающим данным, я Мне непонятно, какие объекты (адаптированный рабочий процесс, рецепт и т. д.) следует сохранить на диск для использования при прогнозировании новых данных в производстве. Я понимаю, что могу использовать _1 _ / _ 2_, _3 _ / _ 4_ или другие параметры, чтобы на самом деле сохранить / загрузить эти объекты, но какие?
В чистой среде R у меня будут входящие новые необработанные данные, которые нужно будет предварительно обработать с использованием рецепта, который я использовал при обучении модели. Затем я хочу сделать прогнозы на основе этих данных после их предварительной обработки. Если я намереваюсь использовать функции prep()
и bake()
для предварительной обработки новых данных, как я делал данные обучения, тогда мне как минимум понадобятся рецепт и исходные данные обучения, которые, кажется, заставят prep()
работать. Кроме того, мне также нужна подобранная модель / рабочий процесс, чтобы делать прогнозы. Кажется, три объекта. Если я сохраню на диск объект рабочего процесса в СЕССИИ 1, тогда у меня будет возможность извлечь из него рецепт и модель в СЕССИИ 2 с помощью pull_workflow_prepped_recipe()
и pull_workflow_fit()
соответственно. Но для prep()
, похоже, требуются исходные данные обучения, которые я могу сохранить в рабочем процессе, если раньше использовал _11 _..., но затем они удаляются из рабочего процесса после вызова fit()
. Услышь мои крики о помощи! :)
Итак, представьте себе два разных сеанса R, где в первом сеансе я выполняю все обучение и построение модели, а второй сеанс - это какое-то работающее производственное приложение, которое использует то, что было изучено в первом сеансе. Мне нужна помощь со стрелками внизу SESSION1 и в нескольких местах на SESSION 2. Я использовал Tidymodels Начать работу в качестве основы для этого примера.
СЕССИЯ 1
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
СЕССИЯ 2
### 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)