| name | recipes-patterns |
| description | Feature engineering patterns with recipes, including imputation, encoding, normalization, interactions, and leakage control. |
Recipes Feature Engineering Patterns
Overview
Comprehensive patterns for feature engineering using the recipes package. Covers preprocessing steps for numeric, categorical, and text data while preventing information leakage.
Recipe Fundamentals
Basic Recipe Structure
library(recipes)
rec <- recipe(outcome ~ ., data = training_data)
rec <- recipe(training_data) |>
update_role(outcome, new_role = "outcome") |>
update_role(id_column, new_role = "ID") |>
update_role(-outcome, -id_column, new_role = "predictor")
Selector Functions
all_predictors()
all_outcomes()
all_numeric_predictors()
all_nominal_predictors()
all_numeric()
all_nominal()
starts_with("prefix_")
ends_with("_suffix")
contains("pattern")
matches("regex")
one_of(c("var1", "var2"))
Numeric Preprocessing
Normalization and Scaling
rec <- recipe(outcome ~ ., data = train) |>
step_normalize(all_numeric_predictors()) |>
step_range(all_numeric_predictors(), min = 0, max = 1) |>
step_center(all_numeric_predictors()) |>
step_scale(all_numeric_predictors())
Transformations for Normality
rec <- recipe(outcome ~ ., data = train) |>
step_YeoJohnson(all_numeric_predictors()) |>
step_BoxCox(positive_vars) |>
step_log(skewed_vars, base = 10) |>
step_sqrt(count_vars)
Spline and Polynomial Features
rec <- recipe(outcome ~ ., data = train) |>
step_ns(continuous_var, deg_free = 5) |>
step_bs(continuous_var, deg_free = 5, degree = 3) |>
step_poly(continuous_var, degree = 3)
Categorical Encoding
Dummy Variables
rec <- recipe(outcome ~ ., data = train) |>
step_dummy(all_nominal_predictors()) |>
step_dummy(all_nominal_predictors(), one_hot = TRUE)
Handling Rare Categories
rec <- recipe(outcome ~ ., data = train) |>
step_other(categorical_var, threshold = 0.05, other = "other") |>
step_novel(all_nominal_predictors()) |>
step_unknown(all_nominal_predictors())
Target Encoding (embed package)
library(embed)
rec <- recipe(outcome ~ ., data = train) |>
step_lencode_glm(high_cardinality_var, outcome = vars(outcome)) |>
step_lencode_mixed(category, outcome = vars(outcome)) |>
step_woe(categorical_var, outcome = vars(binary_outcome))
Missing Data Handling
Imputation Methods
rec <- recipe(outcome ~ ., data = train) |>
step_impute_mean(all_numeric_predictors()) |>
step_impute_median(all_numeric_predictors()) |>
step_impute_mode(all_nominal_predictors()) |>
step_impute_knn(all_predictors(), neighbors = 5) |>
step_impute_bag(all_predictors()) |>
step_impute_linear(numeric_var, impute_with = imp_vars(predictor1, predictor2))
Missing Indicators
rec <- recipe(outcome ~ ., data = train) |>
step_indicate_na(all_predictors()) |>
step_impute_median(all_numeric_predictors()) |>
step_impute_mode(all_nominal_predictors())
Dimensionality Reduction
PCA and Related Methods
rec <- recipe(outcome ~ ., data = train) |>
step_normalize(all_numeric_predictors()) |>
step_pca(all_numeric_predictors(), num_comp = 5) |>
step_pca(all_numeric_predictors(), threshold = 0.95)
Other Reduction Methods
library(embed)
rec <- recipe(outcome ~ ., data = train) |>
step_umap(all_numeric_predictors(), num_comp = 2) |>
step_kpca(all_numeric_predictors(), num_comp = 5)
Interactions and Combinations
rec <- recipe(outcome ~ ., data = train) |>
step_interact(terms = ~ var1:var2) |>
step_interact(terms = ~ starts_with("x"):starts_with("z")) |>
step_ratio(numerator = denom_vars(var1), denom = denom_vars(var2))
Feature Selection
rec <- recipe(outcome ~ ., data = train) |>
step_zv(all_predictors()) |>
step_nzv(all_predictors(), freq_cut = 95/5, unique_cut = 10) |>
step_corr(all_numeric_predictors(), threshold = 0.9) |>
step_lincomb(all_numeric_predictors())
Class Imbalance (themis)
library(themis)
rec <- recipe(outcome ~ ., data = train) |>
step_downsample(outcome) |>
step_upsample(outcome) |>
step_smote(outcome) |>
step_adasyn(outcome)
Date/Time Features
rec <- recipe(outcome ~ ., data = train) |>
step_date(date_var, features = c("year", "month", "dow", "doy")) |>
step_holiday(date_var, holidays = c("USChristmasDay", "USNewYearsDay")) |>
step_time(datetime_var, features = c("hour", "minute"))
Text Features (textrecipes)
library(textrecipes)
rec <- recipe(outcome ~ ., data = train) |>
step_tokenize(text_var) |>
step_stopwords(text_var) |>
step_stem(text_var) |>
step_ngram(text_var, num_tokens = 2) |>
step_tfidf(text_var, max_tokens = 100)
Recipe Execution
prepped_rec <- prep(rec, training = train_data)
train_processed <- bake(prepped_rec, new_data = NULL)
test_processed <- bake(prepped_rec, new_data = test_data)
tidy(prepped_rec)
tidy(prepped_rec, number = 1)
Step Ordering Best Practices
recipe(outcome ~ ., data = train) |>
update_role(id, new_role = "ID") |>
step_impute_median(all_numeric_predictors()) |>
step_impute_mode(all_nominal_predictors()) |>
step_other(all_nominal_predictors(), threshold = 0.05) |>
step_novel(all_nominal_predictors()) |>
step_YeoJohnson(all_numeric_predictors()) |>
step_interact(terms = ~ var1:var2) |>
step_dummy(all_nominal_predictors()) |>
step_normalize(all_numeric_predictors()) |>
step_zv(all_predictors()) |>
step_corr(all_numeric_predictors())
Key Principles
- Prevent leakage: All statistics computed from training data only
- Order matters: Impute → Transform → Encode → Normalize → Select
- Use selectors: More maintainable than listing variable names
- Document decisions: Comment why each step is included
- Test on holdout: Verify recipe generalizes to new data