머신 러닝 워크플로우

R에서 tidymodels로 모델링하기

David Svancer

Data Scientist

의사결정나무로 분류하기

의사결정나무는 예측자 공간을 직사각형 구역으로 분할합니다

재귀적 이진 분할

  • 예측자 공간을 겹치지 않는 직사각형 구역으로 나누는 알고리즘

리드 스코어링 데이터 산점도

R에서 tidymodels로 모델링하기

의사결정나무로 분류하기

의사결정나무는 예측자 공간을 직사각형 구역으로 분할합니다

재귀적 이진 분할

  • 예측자 공간을 겹치지 않는 직사각형 구역으로 나누는 알고리즘
  • 분할은 반복적으로 추가됨
    • 수평 또는 수직 분할점

첫 번째 의사결정나무 분할이 있는 산점도

R에서 tidymodels로 모델링하기

의사결정나무로 분류하기

의사결정나무는 예측자 공간을 직사각형 구역으로 분할합니다

재귀적 이진 분할

  • 예측자 공간을 겹치지 않는 직사각형 구역으로 나누는 알고리즘
  • 분할은 반복적으로 추가됨
    • 수평 또는 수직 분할점

두 번째 의사결정나무 분할이 있는 산점도

R에서 tidymodels로 모델링하기

의사결정나무로 분류하기

의사결정나무는 예측자 공간을 직사각형 구역으로 분할합니다

재귀적 이진 분할

  • 예측자 공간을 겹치지 않는 직사각형 구역으로 나누는 알고리즘
  • 분할은 반복적으로 추가됨
    • 수평 또는 수직 분할점

세 번째 의사결정나무 분할이 있는 산점도

R에서 tidymodels로 모델링하기

의사결정나무로 분류하기

의사결정나무는 예측자 공간을 직사각형 구역으로 분할합니다

재귀적 이진 분할

  • 예측자 공간을 겹치지 않는 직사각형 구역으로 나누는 알고리즘
  • 분할은 반복적으로 추가됨
    • 수평 또는 수직 분할점

 

뚜렷한 직사각형 구역 생성

  • 분류에서는 다수 클래스를 예측함

네 개의 직사각형 예측 구역이 있는 산점도

R에서 tidymodels로 모델링하기

트리 다이어그램

  • 내부 노드
    • 의사결정나무의 분할(진한 상자)
  • 단말 노드
    • 더 이상 분할되지 않는 구역
    • 녹색 및 보라색 상자

의사결정나무 다이어그램

내부 노드는 점선, 단말 노드는 강조된 직사각형 구역입니다

네 개의 직사각형 예측 구역이 있는 산점도

R에서 tidymodels로 모델링하기

모델 명세

parsnip에서의 모델 명세

  • decision_tree()
    • parsnip의 의사결정나무 일반 인터페이스
    • 일반 엔진은 'rpart'
    • 모드는 'classification' 또는 'regression'
      • 리드 스코어링 데이터에는 'classification' 필요
dt_model <- decision_tree() %>% 

set_engine('rpart') %>%
set_mode('classification')
R에서 tidymodels로 모델링하기

피처 엔지니어링 레시피

리드 스코어링 데이터 변환

  • recipe 객체에 인코딩
    • 다중공선성 제거
    • 수치 예측자 정규화
    • 명목 예측자 더미 변수 생성

관리할 두 개의 R 객체

  • parsnip 모델과 recipe 명세
  • 하나의 객체로 합치면 더 편리
leads_recipe <- recipe(purchased ~ .,
                       data = leads_training) %>%

step_corr(all_numeric(), threshold = 0.9) %>% step_normalize(all_numeric()) %>% step_dummy(all_nominal(), -all_outcomes())
leads_recipe
Data Recipe
Inputs:
      role #variables
   outcome          1
 predictor          6

Operations:
Correlation filter on all_numeric()
Centering and scaling for all_numeric()
Dummy variables from all_nominal(), -all_outcomes()
R에서 tidymodels로 모델링하기

모델과 레시피 결합하기

workflows 패키지는 모델 과정을 간소화합니다

  • parsnip 모델과 recipe 객체를 하나의 workflow 객체로 결합

 

workflow() 함수로 초기화

  • add_model()로 모델 추가
  • add_recipe()recipe 추가
    • 학습된 recipe가 아닌 명세여야 함
leads_wkfl <- workflow() %>%

add_model(dt_model) %>%
add_recipe(leads_recipe)
leads_wkfl
== Workflow =====================
Preprocessor: Recipe
Model: decision_tree()
-- Preprocessor -----------------
3 Recipe Steps
* step_corr()
* step_normalize()
* step_dummy()
-- Model --------------------------
Decision Tree Model Specification (classification)
Computational engine: rpart
R에서 tidymodels로 모델링하기

워크플로우로 모델 학습하기

workflow 객체 학습

  • workflowlast_fit()에 전달하고 데이터 분할 객체 제공
  • collect_metrics()로 평가 결과 확인

내부 동작

  • 학습/테스트 데이터셋 생성
  • recipe 학습 및 적용
  • 학습 데이터로 의사결정나무 학습
  • 테스트 데이터 예측 및 지표 계산
leads_wkfl_fit <- leads_wkfl %>% 
  last_fit(split = leads_split)

leads_wkfl_fit %>% collect_metrics()
# A tibble: 2 x 3
  .metric  .estimator .estimate
  <chr>    <chr>          <dbl>
1 accuracy binary         0.771
2 roc_auc  binary         0.775
R에서 tidymodels로 모델링하기

예측 수집하기

last_fit()으로 학습된 workflowcollect_predictions()에 전달할 수 있습니다

  • 테스트 데이터의 상세 결과 생성
  • 이전처럼 yardstick 함수로 사용자 정의 성능 지표 탐색 가능
leads_wkfl_preds <- leads_wkfl_fit %>% 
  collect_predictions()

leads_wkfl_preds
# A tibble: 332 x 6
   id          .pred_yes .pred_no  .row .pred_class purchased
  <chr>           <dbl>   <dbl>    <int>   <fct>       <fct>
train/test split  0.120    0.880     2      no          no
train/test split  0.755    0.245    17      yes         yes
train/test split  0.120    0.880    21      no          no
train/test split  0.120    0.880    22      no          no
train/test split  0.755    0.245    24      yes         yes
# ... with 327 more rows
R에서 tidymodels로 모델링하기

사용자 정의 지표 탐색

metric_set()으로 사용자 정의 지표 집합 생성

  • ROC AUC, 민감도, 특이도

 

예측 데이터셋을 leads_metrics()에 전달해 지표 계산

leads_metrics <- metric_set(roc_auc, sens, spec)

leads_wkfl_preds %>% leads_metrics(truth = purchased, estimate = .pred_class, .pred_yes)
# A tibble: 3 x 3
  .metric .estimator .estimate
  <chr>   <chr>          <dbl>
1 sens    binary         0.75 
2 spec    binary         0.783
3 roc_auc binary         0.775
R에서 tidymodels로 모델링하기

연체 대출 데이터셋

은행의 소매 대출 금융 데이터

  • 결과 변수는 loan_default

 

loans_df
# A tibble: 872 x 8
loan_default  loan_purpose   missed_payment_2_yr loan_amount interest_rate installment annual_income debt_to_income
 <fct>           <fct>            <fct>             <int>        <dbl>         <dbl>         <dbl>       <dbl>
 no        debt_consolidation      no              25000         5.47          855.         62823        39.4 
 yes       medical                 no              10000        10.2           364.         40000        24.1 
 no        small_business          no              13000         6.22          442.         65000        14.0 
 no        small_business          no              36000         5.97         1152.        125000         8.09
 yes       small_business          yes             12000        11.8           308.         65000        20.1 
# ... with 867 more rows
R에서 tidymodels로 모델링하기

워크플로우를 만들어 봅시다!

R에서 tidymodels로 모델링하기

Preparing Video For Download...