Ingineria caracteristicilor în R
Jorge Zazueta
Research Professor and Head of the Modeling Group at the School of Economics, UASLP
Cunoștințele de domeniu ne permit să identificăm și să creăm caracteristici relevante și utile pentru un model sau sarcină specifică.
Ingineria caracteristicilor presupune crearea de noi variabile de intrare din cele existente.
Exemple de cunoștințe de domeniu:
Dorim să prezicem anulările hoteliere pe baza următorului vector de caracteristici:
features <-
c("IsCanceled", "LeadTime",
"arrival_date",
"StaysInWeekendNights",
"StaysInWeekNights",
"PreviousCancellations",
"PreviousBookingsNotCanceled",
"ReservedRoomType",
"AssignedRoomType","BookingChanges",
"DepositType","CustomerType",
"ADR","TotalOfSpecialRequests")
Caracteristici din datele brute
Putem genera caracteristici informative dinarrival_date.

Acest proces devine rapid repetitiv. Este nevoie de automatizare!
Vom utiliza un flux de lucru bazat pe tidymodels, o colecție de pachete pentru modelare și învățare automată conform principiilor tidyverse (1), cu accent pe ingineria caracteristicilor.

Puteți afla mai multe la www.tidymodels.org
Să începem prin pregătirea datelor.
cancelations <-
cancelations %>%
mutate(across(where(is_character),as.factor))
set.seed(123)
split <- cancellations %>%
initial_split(
strata = "IsCanceled")
train <- training(split)
test <- testing(split)
Parametrul prop poate fi folosit pentru a modifica proporția date de antrenament/test (implicit este 3/4).
initial_split(data, prop = 3/4, strata = NULL)
Verificați că seturile train și test au proporții similare de rezervări anulate.
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
Declarați modelul
lr_model <- logistic_reg()
Creați rețeta
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())
Afișați 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()
Combinați modelul și rețeta într-un obiect workflow.
lr_workflow <-
workflow()%>%
add_model(lr_model)%>%
add_recipe(lr_recipe)
Antrenați fluxul de lucru
lr_fit <-
lr_workflow %>%
fit(data = train)
Putem folosi tidy(lr_fit) pentru a rezuma modelul nostru.
# 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
Putem evalua acum performanța modelului nostru.
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()

Ingineria caracteristicilor în R