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ść:
- Imputacja (najpierw uzupełnienie wartości NA)
- Tworzenie cech (interakcje, wielomiany)
- Kodowanie zmiennych zero-jedynkowych (konwersja factorów)
- Usuwanie cech o zerowej wariancji
- 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 5Recipes 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
- Inżynieria cech za pomocą recipes
- Specyfikacje modeli za pomocą parsnip
- Workflowy: łączenie recipes i modeli
- Próbkowanie i walidacja krzyżowa za pomocą rsample