Feature Engineering i R
Jorge Zazueta
Research Professor and Head of the Modeling Group at the School of Economics, UASLP
Domänkunskap hjälper oss att identifiera och skapa relevanta och användbara särdrag för en modell eller uppgift.
Särdragskonstruktion handlar om att skapa nya indatasärdrag från befintliga.
Exempel på domänkunskap:
Vi vill förutsäga hotellbokningsavbokningar baserat på följande särdragsvektor:
features <-
c("IsCanceled", "LeadTime",
"arrival_date",
"StaysInWeekendNights",
"StaysInWeekNights",
"PreviousCancellations",
"PreviousBookingsNotCanceled",
"ReservedRoomType",
"AssignedRoomType","BookingChanges",
"DepositType","CustomerType",
"ADR","TotalOfSpecialRequests")
Särdrag från rådata
Vi kan skapa informativa särdrag frånarrival_date.

Men det blir snabbt omständligt. Vi behöver automatisera det!
Vi använder ett arbetsflöde baserat på tidymodels, en samling paket för modellering och maskininlärning enligt tidyverse-principer (1) med fokus på särdragskonstruktion.

Läs mer på www.tidymodels.org
Vi börjar med att förbereda vår 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)
Parametern prop används för att ändra uppdelningen av tränings- och testdata (standardvärdet är 3/4).
initial_split(data, prop = 3/4, strata = NULL)
Kontrollera att train- och test-mängderna har liknande andelar avbokade reservationer.
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
Deklarera modellen
lr_model <- logistic_reg()
Bygg ett 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())
Skriv ut 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()
Samla modellen och receptet i ett workflow-objekt.
lr_workflow <-
workflow()%>%
add_model(lr_model)%>%
add_recipe(lr_recipe)
Anpassa arbetsflödet
lr_fit <-
lr_workflow %>%
fit(data = train)
Vi kan använda tidy(lr_fit) för att sammanfatta modellen.
# 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
Vi kan nu utvärdera modellens prestanda.
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 i R