Feature Engineering в R
Jorge Zazueta
Research Professor and Head of the Modeling Group at the School of Economics, UASLP
Предметні знання допомагають виявляти й створювати доречні та корисні ознаки для конкретної моделі чи завдання.
Інжиніринг ознак — це створення нових вхідних ознак із наявних.
Приклади предметних знань:
Ми хочемо передбачити скасування бронювань готелю на основі такого вектора ознак:
features <-
c("IsCanceled", "LeadTime",
"arrival_date",
"StaysInWeekendNights",
"StaysInWeekNights",
"PreviousCancellations",
"PreviousBookingsNotCanceled",
"ReservedRoomType",
"AssignedRoomType","BookingChanges",
"DepositType","CustomerType",
"ADR","TotalOfSpecialRequests")
Ознаки з сирих даних
Можна згенерувати інформативні ознаки з arrival_date.

Але це швидко стає виснажливим. Потрібна автоматизація!
Ми використаємо робочий процес на основі tidymodels — набору пакетів для моделювання та машинного навчання за принципами tidyverse (1) з акцентом на інжиніринг ознак.

Детальніше: www.tidymodels.org
Почнімо з підготовки даних.
cancelations <-
cancelations %>%
mutate(across(where(is_character),as.factor))
set.seed(123)
split <- cancellations %>%
initial_split(
strata = "IsCanceled")
train <- training(split)
test <- testing(split)
Параметр prop змінює пропорцію розбиття train/test (типово 3/4).
initial_split(data, prop = 3/4, strata = NULL)
Переконайтеся, що в наборах train і test подібні частки скасованих бронювань.
train %>%
select(IsCanceled) %>% table() %>%
prop.table()
IsCanceled
0 1
0.5826946 0.4173054
test %>%
select(IsCanceled) %>% table() %>%
prop.table()
IsCanceled
0 1
0.5827788 0.4172212
Оголосимо модель
lr_model <- logistic_reg()
Побудуємо recipe
lr_recipe <-
recipe(IsCanceled ~., data = train) %>%
update_role(Agent, new_role = "ID" ) %>%
step_date(arrival_date,
features = c("dow", "week", "month")) %>%
step_holiday(arrival_date,
holidays = timeDate::listHolidays("US")) %>%
step_rm(arrival_date) %>%
step_dummy(all_nominal_predictors())
Надрукуйте lr_recipe
Recipe
Inputs:
role #variables
ID 1
outcome 1
predictor 13
Operations:
Date features from arrival_date
Holiday features from arrival_date
Variables removed arrival_date
Dummy variables from all_nominal_predictors()
Об'єднайте модель і recipe в об'єкт workflow.
lr_workflow <-
workflow()%>%
add_model(lr_model)%>%
add_recipe(lr_recipe)
Навчіть workflow
lr_fit <-
lr_workflow %>%
fit(data = train)
Можна використати tidy(lr_fit) для підсумку моделі.
# A tibble: 65 × 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 (Intercept) -1.92 0.228 -8.43 3.57e- 17
2 LeadTime 0.00414 0.000268 15.4 1.16e- 53
3 StaysInWeekendNights 0.0860 0.0382 2.25 2.45e- 2
4 StaysInWeekNights 0.0804 0.0185 4.34 1.40e- 5
5 PreviousCancellations 2.39 0.147 16.2 2.45e- 59
6 PreviousBookingsNotCanceled -0.440 0.0450 -9.77 1.45e- 22
7 BookingChanges -0.449 0.0463 -9.69 3.18e- 22
8 ADR 0.0104 0.000782 13.2 4.85e- 40
9 TotalOfSpecialRequests -0.727 0.0316 -23.0 5.29e-117
10 arrival_date_week 0.0245 0.0171 1.43 1.53e- 1
# … with 55 more rows
# ℹ Use `print(n = ...)` to see more rows
Тепер оцінимо якість моделі.
lr_aug <- lr_fit %>% augment(test)
bind_rows(
lr_aug %>%
roc_auc(truth = IsCanceled,.pred_0),
lr_aug %>%
accuracy(truth = IsCanceled,.pred_class))
# A tibble: 2 × 3
.metric .estimator .estimate
<chr> <chr> <dbl>
1 roc_auc binary 0.842
2 accuracy binary 0.782
lr_aug %>%
roc_curve(truth = IsCanceled, .pred_0) %>%
autoplot()

Feature Engineering в R