R Tidymodels: Какие объекты сохранить для использования в производстве после настройки рабочего процесса на основе рецептов с использованием предварительной обработки?

После разработки рабочего процесса на основе рецептов 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)

person wphampton    schedule 02.02.2021    source источник


Ответы (2)


У вас есть некоторая гибкость в том, как вы подходите к этому, в зависимости от ваших ограничений, но в целом я бы рекомендовал сохранить / сериализовать подходящий рабочий процесс, возможно, после с помощью мясника, чтобы уменьшить его размер. Вы можете увидеть пример сценария подгонки модели в этом репозитории, который показывает в конце, как я сохраняю подобранный рабочий процесс.

Когда вы собираетесь прогнозировать с помощью этого рабочего процесса, нужно помнить о некоторых вещах. У меня есть пример API-интерфейса сантехника в то же самое репо, которое демонстрирует, что необходимо для прогнозирования для этого конкретного рабочего процесса. Обратите внимание, что пакеты, как пакет, необходимый для прогнозирования, загружаются / прикрепляются для этого API. Я использовал не все tidymodels, а только те определенные пакеты, которые мне нужны, для лучшей производительности и меньшего размера контейнера.

person Julia Silge    schedule 04.02.2021

Мне не удалось сохранить подобранный рабочий процесс. При попытке прогнозирования с новыми данными запрашивает целевую переменную (модель оттока)

predict(churn_model, the_data)
Error: Problem with `mutate()` column `churn`.
i `churn = dplyr::if_else(churn == 1, "yes", "no")`.
x object 'churn' not found

Я до сих пор не понимаю, почему запрашивается столбец, который не должен присутствовать в данных, поскольку это переменная, которую я пытаюсь предсказать ...

person Forge    schedule 09.06.2021