0Pricing
R Academy · Урок

Создание признаков с помощью recipes

Определяйте этапы предварительной обработки для нормализации, кодирования и заполнения пропусков

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

Что такое рецепт?

В tidymodels recipe — это схема предварительной обработки данных. Она записывает шаги, необходимые для преобразования исходных данных в признаки, готовые для модели, не применяя их немедленно.

Основная функция — recipe(outcome ~ ., data = train). Она задаёт формулу и эталонный набор данных, используемый для оценки статистик, необходимых во время предварительной обработки.

library(recipes)
library(tidymodels)

# Create a recipe using the training data
rec <- recipe(price ~ ., data = train_data)
print(rec)

step_normalize()

step_normalize(all_numeric_predictors()) центрирует каждый числовой предиктор так, чтобы его среднее было равно 0, и масштабирует его до стандартного отклонения 1. Это необходимо для алгоритмов, чувствительных к масштабу признаков, например для логистической регрессии, SVM и нейронных сетей.

Среднее и SD вычисляются по обучающему набору и единообразно применяются к тестовым данным с помощью bake().

rec <- recipe(price ~ ., data = train_data) |>
  step_normalize(all_numeric_predictors())

# Check what steps are recorded
print(rec)

step_dummy()

step_dummy(all_nominal_predictors()) преобразует категориальные переменные (факторы и строки) в числовые фиктивные столбцы с one-hot-кодированием. По умолчанию для фактора с k уровнями создаются k-1 столбцов, что позволяет избежать точной мультиколлинеарности.

Используйте one_hot = TRUE для моделей на основе деревьев, которым полезно полное one-hot-кодирование.

rec <- recipe(price ~ ., data = train_data) |>
  step_dummy(all_nominal_predictors())

# After prep and bake, factor columns become 0/1 numeric columns
prepped <- prep(rec)
baked <- bake(prepped, new_data = NULL)
names(baked)

step_impute_median()

Пропущенные значения приводят к сбою большинства движков моделей. step_impute_median(all_numeric_predictors()) заменяет значения NA медианой, вычисленной по обучающему набору. По сравнению с заменой средним медиана устойчивее к выбросам.

Для категориальных переменных используйте step_impute_mode(), чтобы заполнить пропуски наиболее часто встречающимся значением.

rec <- recipe(price ~ ., data = train_data) |>
  step_impute_median(all_numeric_predictors()) |>
  step_impute_mode(all_nominal_predictors())

print(rec)

step_zv() — удаление нулевой дисперсии

step_zv(all_predictors()) удаляет предикторы, имеющие только одно уникальное значение (нулевую дисперсию). Такие столбцы не содержат информации и могут вызывать ошибки в некоторых движках моделей.

Для почти нулевой дисперсии используйте step_nzv(all_predictors()): эта функция также удаляет столбцы, в которых одно значение подавляюще преобладает.

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

print(rec)

prep() — обучение рецепта

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

Всегда вызывайте prep только для обучающих данных, чтобы избежать утечки данных из тестового набора.

# Build the full recipe
rec <- recipe(price ~ ., data = train_data) |>
  step_impute_median(all_numeric_predictors()) |>
  step_dummy(all_nominal_predictors()) |>
  step_zv(all_predictors()) |>
  step_normalize(all_numeric_predictors())

# Estimate parameters from training data
prepped_rec <- prep(rec)
print(prepped_rec)

bake() — применение к новым данным

bake(prepped_recipe, new_data = test_data) применяет все шаги предварительной обработки с уже оценёнными параметрами к любому набору данных. Это обеспечивает одинаковые преобразования для обучающих и тестовых данных.

Передайте new_data = NULL, чтобы применить преобразования к обучающим данным, использованным во время вызова prep().

# Apply recipe to test data
baked_test <- bake(prepped_rec, new_data = test_data)
head(baked_test)

# Apply to training data (same as juice())
baked_train <- bake(prepped_rec, new_data = NULL)
dim(baked_train)

juice() — извлечение обработанных обучающих данных

juice(prepped_recipe) — вспомогательная функция, эквивалентная bake(prepped_recipe, new_data = NULL). Она возвращает предварительно обработанную версию обучающих данных, использованных при вызове prep().

Примечание: juice() считается немного устаревшей в пользу bake(prep, new_data = NULL), но встречается в старом коде tidymodels.

# juice() extracts the processed training data
train_processed <- juice(prepped_rec)
glimpse(train_processed)

# Equivalent modern approach
train_modern <- bake(prepped_rec, new_data = NULL)
identical(train_processed, train_modern)  # TRUE

Объединение нескольких шагов

Шаги применяются в том порядке, в котором они добавлены. Типичный рецепт для промышленного использования соблюдает такой порядок:

  1. Заполнение пропусков (сначала исправьте NA)
  2. Создание признаков (взаимодействия, полиномы)
  3. Dummy-кодирование (преобразование факторов)
  4. Удаление признаков с нулевой дисперсией
  5. Нормализация (масштабирование в конце)

Этот порядок важен: например, нормализация до dummy-кодирования даст некорректные результаты.

full_rec <- recipe(sale_price ~ ., data = housing_train) |>
  step_impute_median(all_numeric_predictors()) |>
  step_impute_mode(all_nominal_predictors()) |>
  step_log(sale_price, base = 10) |>
  step_other(all_nominal_predictors(), threshold = 0.05) |>
  step_dummy(all_nominal_predictors()) |>
  step_zv(all_predictors()) |>
  step_normalize(all_numeric_predictors())

print(full_rec)

Проверка результатов prep

После вызова prep() можно проверить результат каждого шага с помощью tidy(prepped_rec). У каждого шага есть числовой идентификатор; чтобы посмотреть оценённые параметры, используйте tidy(prepped_rec, number = 1).

prepped_rec <- prep(full_rec)

# View all steps and their status
tidy(prepped_rec)

# Inspect normalization parameters (mean, sd per column)
tidy(prepped_rec, number = 5)  # step_normalize is step 5

Рецепты на практике

Рецепты особенно полезны в сочетании с рабочими процессами. Вместо ручного вызова prep() и bake() добавьте рецепт в рабочий процесс — tidymodels автоматически обработает prep и bake во время fit() и predict().

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

library(workflows)

# Recipe + model spec combined in a workflow
wf <- workflow() |>
  add_recipe(full_rec) |>
  add_model(linear_reg() |> set_engine('lm'))

# fit() internally calls prep() + bake() on training data
fitted_wf <- fit(wf, data = housing_train)

# predict() applies bake() to new data automatically
predictions <- predict(fitted_wf, new_data = housing_test)
head(predictions)

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

Что делает вызов prep(recipe) в системе рецептов tidymodels?

Повторение: рецепты

Главные выводы из раздела «Создание признаков с помощью рецептов»:

  • recipe(outcome ~ ., data = train) задаёт схему предварительной обработки.
  • step_normalize(), step_dummy(), step_impute_median(), step_zv() — наиболее часто используемые шаги.
  • prep() оценивает параметры только по обучающим данным — никогда не используйте для этого тестовые данные.
  • bake(prepped, new_data) применяет обученный рецепт к любому набору данных.
  • Порядок шагов важен: заполнить пропуски → создать признаки → закодировать → удалить → масштабировать.
  • В промышленном коде помещайте рецепт в workflow(), чтобы автоматизировать prep и bake во время fit и predict.
# Full pipeline in 6 lines
rec <- recipe(target ~ ., data = train) |>
  step_impute_median(all_numeric_predictors()) |>
  step_dummy(all_nominal_predictors()) |>
  step_zv(all_predictors()) |>
  step_normalize(all_numeric_predictors())

prepped <- prep(rec)
train_baked <- bake(prepped, new_data = NULL)
test_baked  <- bake(prepped, new_data = test)

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

Урок «Создание признаков с помощью recipes» бесплатный?

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

Чему я научусь в уроке «Создание признаков с помощью recipes»?

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

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

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

Сколько времени занимает урок «Создание признаков с помощью recipes»?

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

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

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

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

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