0Pricing
R Academy · Урок

Рабочие процессы: объединение рецептов и моделей

Объединяйте предварительную обработку и модель в единый объект рабочего процесса

«Рабочие процессы: объединение рецептов и моделей» — бесплатный урок R Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.

Что такое рабочий процесс

Рабочий процесс объединяет рецепт и спецификацию модели в один объект. Это решает важную проблему: этапы предварительной обработки и моделирования должны рассматриваться как единое целое при перекрёстной проверке и окончательном обучении. В противном случае такие параметры, как средние значения для нормализации, могут просочиться из проверочных блоков.

library(workflows)

# Start an empty workflow
wf <- workflow()
print(wf)

# Workflows have two slots: preprocessor and model
# Both must be filled before fitting

add_recipe() и add_model()

Используйте add_recipe(rec), чтобы присоединить рецепт предварительной обработки, и add_model(spec), чтобы присоединить спецификацию модели parsnip. Оператор конвейера делает такую запись очень понятной.

library(recipes)
library(parsnip)
library(workflows)

rec <- recipe(price ~ ., data = train) |>
  step_impute_median(all_numeric_predictors()) |>
  step_dummy(all_nominal_predictors()) |>
  step_normalize(all_numeric_predictors())

spec <- linear_reg() |> set_engine('lm')

wf <- workflow() |>
  add_recipe(rec) |>
  add_model(spec)

print(wf)

fit() для рабочего процесса

Вызов fit(wf, data = train) для рабочего процесса автоматически применяет prep() к рецепту на обучающих данных, а затем обучает модель на предварительно обработанных признаках. Вам не нужно вручную вызывать prep() или bake().

fitted_wf <- fit(wf, data = housing_train)

# The fitted workflow stores both the prepped recipe
# and the trained model
print(fitted_wf)

predict() для обученного рабочего процесса

При вызове predict(fitted_wf, new_data = test) рабочий процесс автоматически применяет bake() к новым данным с использованием обученного рецепта, а затем формирует предсказания. Это устраняет риск забыть предварительно обработать тестовые данные.

# Predictions automatically preprocess the test data
preds <- predict(fitted_wf, new_data = housing_test)
head(preds)

# For classification
preds_prob <- predict(fitted_wf, new_data = test_df, type = 'prob')
preds_class <- predict(fitted_wf, new_data = test_df, type = 'class')

last_fit() — обучение на всех данных и оценка на тестовых

last_fit(wf, split) принимает итоговый рабочий процесс и объект исходного разделения на обучающую и тестовую выборки. Функция обучает рабочий процесс на обучающей части и оценивает его на тестовой — это стандартный этап оценки итоговой модели после завершения настройки.

library(rsample)

split <- initial_split(housing_data, prop = 0.8, strata = price)

# Fit on training, evaluate on test
final_res <- last_fit(wf, split)

# View performance on the held-out test set
collect_metrics(final_res)

extract_fit_parsnip()

extract_fit_parsnip(fitted_wf) извлекает обученный объект модели parsnip из обученного рабочего процесса. Затем его можно использовать для просмотра коэффициентов и важности переменных или передать инструментам объяснения моделей.

fitted_wf <- fit(wf, data = housing_train)

# Extract the parsnip model
parsnip_fit <- extract_fit_parsnip(fitted_wf)

# Now access the underlying model
tidy(parsnip_fit)      # coefficients for lm
vip::vip(parsnip_fit)  # variable importance plot

extract_recipe()

extract_recipe(fitted_wf) возвращает подготовленный рецепт из обученного рабочего процесса. Это полезно для просмотра применённых преобразований или получения обученной предварительной обработки, чтобы независимо применить её к внешним данным.

fitted_wf <- fit(wf, data = housing_train)

# Get the prepped recipe
prepped_rec <- extract_recipe(fitted_wf)

# Inspect normalization stats
tidy(prepped_rec, number = 3)  # step_normalize details

# Apply recipe to completely new external data
new_baked <- bake(prepped_rec, new_data = brand_new_df)

augment() для рабочих процессов

augment(fitted_wf, new_data) возвращает исходный фрейм данных с добавленными столбцами предсказаний. Для регрессии функция добавляет .pred, а для классификации — .pred_class и столбцы вероятностей для каждого класса.

fitted_wf <- fit(wf, data = housing_train)

# Append predictions to the test data frame
results <- augment(fitted_wf, new_data = housing_test)

# Now compute metrics directly
library(yardstick)
results |>
  metrics(truth = price, estimate = .pred)

Обновление рабочего процесса

Отдельные компоненты рабочего процесса можно обновлять с помощью update_recipe() или update_model(), не создавая его заново. Это удобно во время экспериментов, когда нужно заменить движок модели, сохранив тот же рецепт.

# Original workflow with lm
wf_lm <- workflow() |>
  add_recipe(rec) |>
  add_model(linear_reg() |> set_engine('lm'))

# Swap model to random forest, keep same recipe
wf_rf <- update_model(
  wf_lm,
  rand_forest(trees = 300) |>
    set_engine('ranger') |>
    set_mode('regression')
)

fit_rf <- fit(wf_rf, data = housing_train)

add_formula() и add_recipe()

Если рецепт не нужен, можно использовать add_formula(outcome ~ .) в качестве средства предварительной обработки. Функция применяет минимальные преобразования — только спецификацию формулы. Используйте add_recipe(), когда требуется конструирование признаков, а add_formula() — для быстрых базовых моделей.

# Simple baseline — no recipe needed
baseline_wf <- workflow() |>
  add_formula(price ~ sqft + bedrooms + bathrooms) |>
  add_model(linear_reg() |> set_engine('lm'))

baseline_fit <- fit(baseline_wf, data = housing_train)
baseline_preds <- predict(baseline_fit, new_data = housing_test)

# Compare RMSE to recipe-based model
yardstick::rmse_vec(housing_test$price, baseline_preds$.pred)

Наборы рабочих процессов для сравнения

workflow_set() из пакета workflowsets создаёт набор рабочих процессов, объединяющих несколько рецептов и спецификаций моделей. Затем все комбинации можно одновременно настроить и оценить с помощью workflow_map().

library(workflowsets)

all_workflows <- workflow_set(
  preproc = list(basic = basic_rec, full = full_rec),
  models  = list(
    lm  = linear_reg() |> set_engine('lm'),
    rf  = rand_forest(trees = 200) |> set_engine('ranger') |> set_mode('regression')
  )
)

# Fit all 4 combinations on resamples
results <- workflow_map(all_workflows, 'fit_resamples', resamples = cv_folds)
autoplot(results)

Быстрая проверка

В чём главное преимущество использования last_fit(workflow, split) по сравнению с ручным обучением и формированием предсказаний?

Итоги по рабочим процессам

Основные выводы из раздела «Рабочие процессы: объединение рецептов и моделей»:

  • workflow() |> add_recipe(rec) |> add_model(spec) объединяет предварительную обработку и моделирование.
  • fit(wf, data = train) подготавливает рецепт и обучает модель одним вызовом.
  • predict(fitted_wf, new_data) автоматически применяет bake() к новым данным перед формированием предсказаний.
  • last_fit(wf, split) обучает модель на обучающих данных и оценивает на тестовых — используйте функцию для итоговой оценки модели.
  • extract_fit_parsnip() и extract_recipe() извлекают компоненты для просмотра.
  • augment() добавляет предсказания во фрейм данных для удобного вычисления метрик.
  • workflow_set() одновременно сравнивает несколько комбинаций рецептов и моделей.
# Canonical tidymodels workflow pattern
split    <- initial_split(data, prop = 0.8)
train    <- training(split)
test     <- testing(split)

rec  <- recipe(y ~ ., data = train) |> step_normalize(all_numeric_predictors())
spec <- rand_forest(trees = 300) |> set_engine('ranger') |> set_mode('regression')

wf   <- workflow() |> add_recipe(rec) |> add_model(spec)

final_res <- last_fit(wf, split)
collect_metrics(final_res)

Часто задаваемые вопросы

Урок «Рабочие процессы: объединение рецептов и моделей» бесплатный?

Да — полный текст урока «Рабочие процессы: объединение рецептов и моделей» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.

Чему я научусь в уроке «Рабочие процессы: объединение рецептов и моделей»?

Объединяйте предварительную обработку и модель в единый объект рабочего процесса Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать R Academy?

Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Рабочие процессы: объединение рецептов и моделей»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке R Academy?

Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Создание признаков с помощью recipes
  2. Спецификация моделей с помощью parsnip
  3. Рабочие процессы: объединение рецептов и моделей
  4. Ресэмплинг и перекрёстная проверка с rsample
← Назад к R Academy