Рабочие процессы: объединение рецептов и моделей
Объединяйте предварительную обработку и модель в единый объект рабочего процесса
«Рабочие процессы: объединение рецептов и моделей» — бесплатный урок 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 fittingadd_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 plotextract_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 — локальная установка не требуется.
Все уроки этого курса
- Создание признаков с помощью recipes
- Спецификация моделей с помощью parsnip
- Рабочие процессы: объединение рецептов и моделей
- Ресэмплинг и перекрёстная проверка с rsample