Feature Engineering v R
Jorge Zazueta
Research Professor and Head of the Modeling Group at the School of Economics, UASLP
Znalosti z oboru nám pomáhají identifikovat a vytvářet relevantní příznaky pro daný model nebo úlohu.
Feature engineering spočívá ve vytváření nových vstupních příznaků z existujících dat.
Příklady znalostí z oboru:
Chceme předpovídat storna hotelových rezervací na základě následujícího vektoru příznaků:
features <-
c("IsCanceled", "LeadTime",
"arrival_date",
"StaysInWeekendNights",
"StaysInWeekNights",
"PreviousCancellations",
"PreviousBookingsNotCanceled",
"ReservedRoomType",
"AssignedRoomType","BookingChanges",
"DepositType","CustomerType",
"ADR","TotalOfSpecialRequests")
Příznaky ze surových dat
Z arrival_date lze odvodit informativní příznaky.

To se ale rychle stává zdlouhavým. Je třeba to zautomatizovat!
Budeme používat workflow založené na tidymodels – kolekci balíčků pro modelování a strojové učení podle principů tidyverse (1) s důrazem na feature engineering.

Více informací na www.tidymodels.org
Nejprve připravíme data.
cancelations <-
cancelations %>%
mutate(across(where(is_character),as.factor))
set.seed(123)
split <- cancellations %>%
initial_split(
strata = "IsCanceled")
train <- training(split)
test <- testing(split)
Parametr prop umožňuje změnit poměr rozdělení dat (výchozí hodnota je 3/4).
initial_split(data, prop = 3/4, strata = NULL)
Ověřte, že sady train a test mají podobné proporce zrušených rezervací.
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
Deklarujeme model
lr_model <- logistic_reg()
Vytvoříme recept
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())
Výpis 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()
Spojíme model a recept do objektu workflow.
lr_workflow <-
workflow()%>%
add_model(lr_model)%>%
add_recipe(lr_recipe)
Natrénujeme workflow
lr_fit <-
lr_workflow %>%
fit(data = train)
Pomocí tidy(lr_fit) můžeme shrnout náš model.
# 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
Nyní můžeme vyhodnotit výkonnost modelu.
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 v R