Создание признаков с помощью 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Объединение нескольких шагов
Шаги применяются в том порядке, в котором они добавлены. Типичный рецепт для промышленного использования соблюдает такой порядок:
- Заполнение пропусков (сначала исправьте NA)
- Создание признаков (взаимодействия, полиномы)
- Dummy-кодирование (преобразование факторов)
- Удаление признаков с нулевой дисперсией
- Нормализация (масштабирование в конце)
Этот порядок важен: например, нормализация до 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 — локальная установка не требуется.
Все уроки этого курса
- Создание признаков с помощью recipes
- Спецификация моделей с помощью parsnip
- Рабочие процессы: объединение рецептов и моделей
- Ресэмплинг и перекрёстная проверка с rsample