Créer de nouvelles caractéristiques grâce aux connaissances métier

Feature engineering en R

Jorge Zazueta

Research Professor and Head of the Modeling Group at the School of Economics, UASLP

L'importance des connaissances métier

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 :

  • Finance : déterminants clés des faillites
  • Médical : comorbidités pertinentes pour un traitement donné
  • Marketing : traits distinctifs d'un groupe de consommateurs
Feature engineering en R

Créer des variables à partir de l'expérience professionnelle

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.

La date d'arrivée peut être décomposée en jour de la semaine, semaine, mois et jour férié

Mais cela devient vite fastidieux. Il faut automatiser !

Feature engineering en R

Le framework tidymodels

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.

Workflow tidymodels simple : charger les données, déclarer le modèle, scinder les données, configurer la recette, regrouper dans un workflow, entraîner le workflow et évaluer les performances.

Plus d'infos sur www.tidymodels.org

1 [Principes directeurs du Tidyverse.](https://design.tidyverse.org/unifying-principles.html)
Feature engineering en R

Préparer les données pour l'analyse

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
Feature engineering en R

Créer un workflow

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()
Feature engineering en R

Créer un workflow

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)
Feature engineering en R

Créer un workflow

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
Feature engineering en R

Évaluer les performances du modèle

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()

Courbe ROC (Receiver Operator Characteristic) de notre modèle.

Feature engineering en R

Passons à la pratique !

Feature engineering en R

Preparing Video For Download...