Skapa nya särdrag med hjälp av domänkunskap

Feature Engineering i R

Jorge Zazueta

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

Varför domänkunskap är viktigt

Domänkunskap hjälper oss att identifiera och skapa relevanta och användbara särdrag för en modell eller uppgift.

Särdrags­konstruktion handlar om att skapa nya indatasärdrag från befintliga.

Exempel på domänkunskap:

  • Finans: Avgörande faktorer för konkurs
  • Medicin: Befintliga tillstånd relevanta för en specifik behandling
  • Marknadsföring: Utmärkande drag hos en konsumentgrupp
Feature Engineering i R

Skapa variabler baserat på yrkeskunskap

Vi vill förutsäga hotellbokningsavbokningar baserat på följande särdragsvektor:

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

Särdrag från rådata

Vi kan skapa informativa särdrag frånarrival_date.

Ankomstdatum kan delas upp i veckodag, vecka, månad och helgdag

Men det blir snabbt omständligt. Vi behöver automatisera det!

Feature Engineering i R

Ramverket tidymodels

Vi använder ett arbetsflöde baserat på tidymodels, en samling paket för modellering och maskininlärning enligt tidyverse-principer (1) med fokus på särdragskonstruktion.

Enkelt tidymodels-arbetsflöde: läs in data, deklarera modell, dela data, skapa recept, samla i arbetsflöde, anpassa arbetsflöde och utvärdera prestanda.

Läs mer på www.tidymodels.org

1 [Tidyverse vägledande principer.](https://design.tidyverse.org/unifying-principles.html)
Feature Engineering i R

Förbered data för analys

Vi börjar med att förbereda vår data.

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

Parametern prop används för att ändra uppdelningen av tränings- och testdata (standardvärdet är 3/4).

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

Kontrollera att train- och test-mängderna har liknande andelar avbokade reservationer.

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

Bygg ett arbetsflöde

Deklarera modellen

lr_model <- logistic_reg()

Bygg ett recept

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

Skriv ut 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 i R

Bygg ett arbetsflöde

Samla modellen och receptet i ett workflow-objekt.

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

Anpassa arbetsflödet

lr_fit <- 
  lr_workflow %>%
  fit(data = train)
Feature Engineering i R

Bygg ett arbetsflöde

Vi kan använda tidy(lr_fit) för att sammanfatta modellen.

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

Utvärdera modellens prestanda

Vi kan nu utvärdera modellens prestanda.

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-kurva (Receiver Operating Characteristic) för vår modell.

Feature Engineering i R

Nu kör vi en övning!

Feature Engineering i R

Preparing Video For Download...