0Pricing
R Academy · Lekcja

Inżynieria cech za pomocą recipes

Zdefiniuj kroki wstępnego przetwarzania obejmujące normalizację, kodowanie i imputację.

Inżynieria cech za pomocą recipes to bezpłatna lekcja R Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej R Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs R Academy zawiera 4 lekcji w sumie.

Czym jest recipe?

W tidymodels recipe to schemat wstępnego przetwarzania danych. Zapisuje kroki potrzebne do przekształcenia surowych danych w cechy gotowe do użycia przez model — bez natychmiastowego ich stosowania.

Kluczową funkcją jest recipe(outcome ~ ., data = train), która definiuje formułę i referencyjny zbiór danych używany do oszacowania statystyk potrzebnych podczas wstępnego przetwarzania.

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()) centruje każdy predyktor numeryczny tak, aby miał średnią 0, i skaluje go do odchylenia standardowego równego 1. Jest to niezbędne w przypadku algorytmów wrażliwych na skalę cech, takich jak regresja logistyczna, SVM czy sieci neuronowe.

Średnia i odchylenie standardowe są obliczane na zbiorze treningowym i konsekwentnie stosowane do danych testowych za pomocą 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()) przekształca zmienne kategoryczne (typu factor/character) w numeryczne kolumny zmiennych zero-jedynkowych (zakodowane one-hot). Domyślnie tworzy k-1 kolumn dla czynnika o k poziomach, unikając doskonałej współliniowości.

Dla modeli opartych na drzewach, które korzystają z pełnego kodowania one-hot, należy użyć one_hot = TRUE.

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()

Brakujące wartości powodują niepowodzenie działania większości silników modeli. step_impute_median(all_numeric_predictors()) zastępuje wartości NA medianą obliczoną na zbiorze treningowym. Mediana jest bardziej odporna na wartości odstające niż imputacja średnią.

W przypadku zmiennych kategorycznych należy użyć step_impute_mode(), aby uzupełnić braki najczęściej występującą wartością.

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

print(rec)

step_zv() — usuwanie zerowej wariancji

step_zv(all_predictors()) usuwa każdy predyktor, który ma tylko jedną unikatową wartość (zerową wariancję). Takie kolumny nie zawierają informacji i mogą powodować błędy w niektórych silnikach modeli.

W przypadku prawie zerowej wariancji należy użyć step_nzv(all_predictors()), która usuwa również kolumny, w których jedna wartość zdecydowanie dominuje.

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() — trenowanie recipe

prep(recipe) szacuje wszystkie parametry wymagane przez kroki — na przykład średnią i odchylenie standardowe do normalizacji oraz mediany do imputacji — korzystając z danych treningowych. Wynikiem jest przygotowana (prepped) recipe, która zna wszystkie parametry przekształceń.

Recipe należy zawsze przygotowywać wyłącznie na danych treningowych, aby uniknąć wycieku danych ze zbioru testowego.

# 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() — stosowanie do nowych danych

bake(prepped_recipe, new_data = test_data) stosuje wszystkie kroki wstępnego przetwarzania, korzystając z wcześniej oszacowanych parametrów, do dowolnego zbioru danych. Zapewnia to spójność przekształceń między zbiorem treningowym i testowym.

Przekazanie new_data = NULL stosuje przekształcenia do danych treningowych użytych podczas 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() — wyodrębnianie przetworzonych danych treningowych

juice(prepped_recipe) to funkcja pomocnicza równoważna bake(prepped_recipe, new_data = NULL). Zwraca wstępnie przetworzoną wersję danych treningowych użytych podczas prep().

Uwaga: juice() jest częściowo przestarzała na rzecz bake(prep, new_data = NULL), ale można ją znaleźć w starszym kodzie 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

Łączenie wielu kroków

Kroki są stosowane w kolejności, w której zostały dodane. Typowa recipe używana produkcyjnie ma następującą kolejność:

  1. Imputacja (najpierw uzupełnienie wartości NA)
  2. Tworzenie cech (interakcje, wielomiany)
  3. Kodowanie zmiennych zero-jedynkowych (konwersja factorów)
  4. Usuwanie cech o zerowej wariancji
  5. Normalizacja (skalowanie na końcu)

Ta kolejność ma znaczenie — na przykład normalizacja przed kodowaniem zmiennych zero-jedynkowych prowadziłaby do niepoprawnych wyników.

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)

Analizowanie wyników prep

Po wywołaniu prep() można sprawdzić działanie poszczególnych kroków za pomocą tidy(prepped_rec). Każdy krok ma identyfikator liczbowy; można przeanalizować go dokładniej za pomocą tidy(prepped_rec, number = 1), aby zobaczyć oszacowane parametry.

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

Recipes w praktyce

Recipes szczególnie dobrze sprawdzają się w połączeniu z workflow. Zamiast ręcznie wywoływać prep() i bake(), można dodać recipe do workflow, a tidymodels automatycznie obsłuży prep/bake podczas wywołań fit() i predict().

Eliminuje to częste źródło błędów, w którym wstępne przetwarzanie jest stosowane inaczej podczas trenowania i wnioskowania.

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)

Szybkie sprawdzenie

Co robi wywołanie prep(recipe) w ramach recipes w tidymodels?

Powtórzenie: recipes

Najważniejsze informacje z tematu Inżynieria cech za pomocą recipes:

  • recipe(outcome ~ ., data = train) definiuje schemat wstępnego przetwarzania.
  • step_normalize(), step_dummy(), step_impute_median(), step_zv() to najczęściej używane kroki.
  • prep() szacuje parametry wyłącznie na podstawie danych treningowych — nigdy danych testowych.
  • bake(prepped, new_data) stosuje wytrenowaną recipe do dowolnego zbioru danych.
  • Kolejność kroków ma znaczenie: imputacja → tworzenie → kodowanie → usuwanie → skalowanie.
  • W środowisku produkcyjnym należy umieścić recipe w workflow(), aby zautomatyzować prep/bake podczas fit i 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)

Często zadawane pytania

Czy lekcja „Inżynieria cech za pomocą recipes” jest bezpłatna?

Tak — pełny tekst „Inżynieria cech za pomocą recipes” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu R Academy, przejdź na CoddyKit PRO. Kurs R Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Inżynieria cech za pomocą recipes”?

Zdefiniuj kroki wstępnego przetwarzania obejmujące normalizację, kodowanie i imputację. Ćwiczysz R Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć R Academy?

Nie wymagamy żadnego doświadczenia. R Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Inżynieria cech za pomocą recipes”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji R Academy?

Tak. Każda lekcja R Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Inżynieria cech za pomocą recipes
  2. Specyfikacje modeli za pomocą parsnip
  3. Workflowy: łączenie recipes i modeli
  4. Próbkowanie i walidacja krzyżowa za pomocą rsample
← Powrót do R Academy