Nieuwe features maken met domeinkennis

Feature engineering in R

Jorge Zazueta

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

Het belang van domeinkennis

Met domeinkennis kun je relevante, nuttige features voor een model of taak vinden en maken.

Feature engineering is het maken van nieuwe inputfeatures uit bestaande.

Voorbeelden van domeinkennis:

  • Financieel: Kritieke factoren voor faillissement
  • Medisch: Relevante comorbiditeiten voor een behandeling
  • Marketing: Onderscheidende kenmerken van een doelgroep
Feature engineering in R

Variabelen maken op basis van vakkennis

We willen hotelannuleringen voorspellen op basis van deze featurevector:

features <- 
c("IsCanceled", "LeadTime",
  "arrival_date",
  "StaysInWeekendNights",
  "StaysInWeekNights",
  "PreviousCancellations",
  "PreviousBookingsNotCanceled",
  "ReservedRoomType",
  "AssignedRoomType","BookingChanges",
  "DepositType","CustomerType",
  "ADR","TotalOfSpecialRequests")

Features uit ruwe data

We kunnen informatieve features genereren uit arrival_date.

Aankomstdatum kun je opsplitsen in weekdag, week, maand en feestdag

Maar dat wordt snel omslachtig. We moeten dit automatiseren!

Feature engineering in R

Het tidymodels-framework

We gebruiken een workflow gebaseerd op tidymodels, een bundel pakketten voor modelleren en machine learning volgens tidyverse-principes (1), met nadruk op feature engineering.

Eenvoudige tidymodels-workflow: data laden, model definiëren, data splitsen, recipe opzetten, bundelen in workflow, workflow fitten en prestaties beoordelen.

Meer info: www.tidymodels.org

1 [Tidyverse-richtlijnen.](https://design.tidyverse.org/unifying-principles.html)
Feature engineering in R

Data voorbereiden voor analyse

Laten we eerst de data klaarmaken.

cancelations <- 
  cancelations %>% 
  mutate(across(where(is_character),as.factor))
set.seed(123)
split <- cancellations %>% 
    initial_split(
    strata = "IsCanceled")
train <- training(split)
test <- testing(split)

Met de prop-parameter pas je de train/test-split aan (standaard 3/4).

initial_split(data, prop = 3/4, strata = NULL)

Controleer of train en test vergelijkbare aandelen geannuleerde boekingen hebben.

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 in R

Een workflow bouwen

Definieer het model

lr_model <- logistic_reg()

Maak een recipe

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

Print 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 in R

Een workflow bouwen

Bundel het model en de recipe in één workflow-object.

lr_workflow <- 
  workflow()%>%
  add_model(lr_model)%>%
  add_recipe(lr_recipe)

Fit de workflow

lr_fit <- 
  lr_workflow %>%
  fit(data = train)
Feature engineering in R

Een workflow bouwen

Gebruik tidy(lr_fit) om het model samen te vatten.

# 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 in R

Modelprestaties beoordelen

We kunnen nu de modelprestaties beoordelen.

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

ROC-curve van ons model.

Feature engineering in R

Laten we oefenen!

Feature engineering in R

Preparing Video For Download...