Membuat fitur baru dengan pengetahuan domain

Rekayasa Fitur di R

Jorge Zazueta

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

Pentingnya pengetahuan domain

Pengetahuan domain membantu kita mengenali dan membuat fitur yang relevan untuk model atau tugas tertentu.

Rekayasa fitur adalah membuat fitur input baru dari yang sudah ada.

Contoh pengetahuan domain:

  • Keuangan: Penentu utama kebangkrutan
  • Medis: Kondisi bawaan yang relevan bagi terapi tertentu
  • Pemasaran: Ciri pembeda suatu kelompok konsumen
Rekayasa Fitur di R

Membuat variabel dari pengalaman profesional

Kita ingin memprediksi pembatalan hotel berdasarkan vektor fitur berikut:

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

Fitur dari data mentah

Kita dapat menghasilkan fitur informatif dari arrival_date.

Tanggal kedatangan dapat diuraikan menjadi hari, pekan, bulan, dan hari libur

Namun ini cepat menjadi melelahkan. Kita perlu mengotomatiskannya!

Rekayasa Fitur di R

Kerangka kerja tidymodels

Kita akan memakai workflow berbasis tidymodels, kumpulan paket untuk pemodelan dan pembelajaran mesin dengan prinsip tidyverse (1) dengan penekanan pada rekayasa fitur.

Workflow tidymodels sederhana: muat data, deklarasikan model, bagi data, siapkan recipe, gabungkan dalam workflow, fit workflow, dan nilai kinerja.

Pelajari lebih lanjut di www.tidymodels.org

1 [Prinsip panduan Tidyverse.](https://design.tidyverse.org/unifying-principles.html)
Rekayasa Fitur di R

Menyiapkan data untuk analisis

Mari siapkan data kita.

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

Parameter prop dapat mengubah pembagian train/test (default 3/4).

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

Verifikasi bahwa set train dan test memiliki proporsi pembatalan yang serupa.

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
Rekayasa Fitur di R

Membangun workflow

Deklarasikan model

lr_model <- logistic_reg()

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

Cetak 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()
Rekayasa Fitur di R

Membangun workflow

Gabungkan model dan recipe ke objek workflow.

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

Fit workflow

lr_fit <- 
  lr_workflow %>%
  fit(data = train)
Rekayasa Fitur di R

Membangun workflow

Kita dapat merangkum model dengan tidy(lr_fit).

# 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
Rekayasa Fitur di R

Menilai kinerja model

Sekarang kita dapat menilai kinerja model.

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

Kurva ROC (Receiver Operating Characteristic) model kita.

Rekayasa Fitur di R

Ayo berlatih!

Rekayasa Fitur di R

Preparing Video For Download...