Feature engineering en R
Jorge Zazueta
Research Professor and Head of the Modeling Group at the School of Economics, UASLP
Les connaissances métier permettent d'identifier et de créer des caractéristiques pertinentes et utiles pour un modèle ou une tâche donnée.
Le feature engineering consiste à créer de nouvelles entrées à partir de celles existantes.
Exemples de connaissances métier :
Nous voulons prédire les annulations d'hôtels à partir du vecteur de caractéristiques suivant :
features <-
c("IsCanceled", "LeadTime",
"arrival_date",
"StaysInWeekendNights",
"StaysInWeekNights",
"PreviousCancellations",
"PreviousBookingsNotCanceled",
"ReservedRoomType",
"AssignedRoomType","BookingChanges",
"DepositType","CustomerType",
"ADR","TotalOfSpecialRequests")
Caractéristiques issues des données brutes
On peut générer des variables informatives à partir de arrival_date.

Mais cela devient vite fastidieux. Il faut automatiser !
Nous utiliserons un workflow basé sur tidymodels, un ensemble de packages pour la modélisation et le Machine Learning suivant les principes de tidyverse (1), avec un accent sur le feature engineering.

Plus d'infos sur www.tidymodels.org
Commençons par préparer les données.
cancelations <-
cancelations %>%
mutate(across(where(is_character),as.factor))
set.seed(123)
split <- cancellations %>%
initial_split(
strata = "IsCanceled")
train <- training(split)
test <- testing(split)
Le paramètre prop permet de modifier la répartition apprentissage/test (par défaut : 3/4).
initial_split(data, prop = 3/4, strata = NULL)
Vérifiez que les ensembles train et test présentent des proportions similaires de réservations annulées.
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
Déclarer le modèle
lr_model <- logistic_reg()
Construire une recette
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())
Afficher 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()
Regrouper le modèle et la recette dans un objet workflow.
lr_workflow <-
workflow()%>%
add_model(lr_model)%>%
add_recipe(lr_recipe)
Ajuster le workflow
lr_fit <-
lr_workflow %>%
fit(data = train)
On peut utiliser tidy(lr_fit) pour résumer le modèle.
# 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
Nous pouvons maintenant évaluer les performances du modèle.
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 en R