Inżynieria cech w R
Jorge Zazueta
Research Professor and Head of the Modeling Group at the School of Economics, UASLP
Wiedza dziedzinowa pozwala identyfikować i tworzyć istotne cechy dla danego modelu lub zadania.
Inżynieria cech polega na tworzeniu nowych zmiennych wejściowych z istniejących.
Przykłady wiedzy dziedzinowej:
Chcemy przewidywać anulowania rezerwacji hotelowych na podstawie następującego wektora cech:
features <-
c("IsCanceled", "LeadTime",
"arrival_date",
"StaysInWeekendNights",
"StaysInWeekNights",
"PreviousCancellations",
"PreviousBookingsNotCanceled",
"ReservedRoomType",
"AssignedRoomType","BookingChanges",
"DepositType","CustomerType",
"ADR","TotalOfSpecialRequests")
Cechy z danych surowych
Z kolumny arrival_date można wygenerować informacyjne cechy.

To jednak szybko staje się żmudne – potrzebna jest automatyzacja!
Użyjemy przepływu pracy opartego na tidymodels – zbiorze pakietów do modelowania i uczenia maszynowego zgodnym z zasadami tidyverse (1), z naciskiem na inżynierię cech.

Więcej informacji na stronie www.tidymodels.org
Zacznijmy od przygotowania danych.
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żliwia zmianę podziału danych na zbiory treningowy/testowy (domyślnie 3/4).
initial_split(data, prop = 3/4, strata = NULL)
Sprawdź, czy zbiory train i test mają podobne proporcje anulowanych rezerwacji.
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
Deklaracja modelu
lr_model <- logistic_reg()
Budowanie receptury
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())
Wydruk 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()
Połącz model i recepturę w obiekt workflow.
lr_workflow <-
workflow()%>%
add_model(lr_model)%>%
add_recipe(lr_recipe)
Dopasowanie przepływu pracy
lr_fit <-
lr_workflow %>%
fit(data = train)
Funkcja tidy(lr_fit) pozwala podsumować 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
Możemy teraz ocenić wydajność 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()

Inżynieria cech w R