교차 검증으로 성능 추정

R에서 tidymodels로 모델링하기

David Svancer

Data Scientist

학습/테스트 데이터셋

 

모델링의 첫 단계는 학습/테스트 데이터 분할입니다

  • 과적합 방지
    • 학습 데이터로 모델 적합
    • 테스트 데이터로 모델 평가

 

단점

  • 모델 성능 단 한 번만 추정

 

학습/테스트 데이터셋 분할 다이어그램

R에서 tidymodels로 모델링하기

K-겹 교차 검증

모델 성능을 탐색하는 리샘플링 기법

  • 모델 적합 과정에서 성능을 K번 추정

 

학습/테스트 데이터셋으로 분할

R에서 tidymodels로 모델링하기

K-겹 교차 검증

모델 성능을 탐색하는 리샘플링 기법

  • 모델 적합 과정에서 성능을 K번 추정
  • 학습 데이터를 무작위로 K개 비슷한 크기의 세트로 분할
  • 폴드를 사용해 K회 모델 학습과 평가 수행

 

학습 데이터를 교차 검증 폴드로 분할

R에서 tidymodels로 모델링하기

교차 검증과 머신 러닝

5-겹 교차 검증 수행

  • 모델 학습·평가 5회 반복

 

5겹 교차 검증 첫 번째 반복

R에서 tidymodels로 모델링하기

교차 검증과 머신 러닝

5-겹 교차 검증 수행

  • 모델 학습·평가 5회 반복
  • 반복 1
    • 폴드 1은 평가, 폴드 2~5는 학습에 사용

 

5겹 교차 검증 첫 번째 반복

R에서 tidymodels로 모델링하기

교차 검증과 머신 러닝

5-겹 교차 검증 수행

  • 모델 학습·평가 5회 반복
  • 반복 1
    • 폴드 1은 평가, 폴드 2~5는 학습에 사용
  • 반복 2
    • 폴드 2는 평가에 사용

 

5겹 교차 검증 두 번째 반복

R에서 tidymodels로 모델링하기

교차 검증과 머신 러닝

5-겹 교차 검증 수행

  • 모델 학습·평가 5회 반복
  • 반복 1
    • 폴드 1은 평가, 폴드 2~5는 학습에 사용
  • 반복 2
    • 폴드 2는 평가에 사용

 

모델 성능의 총 5개 추정치

 

5겹 교차 검증 다섯 번째 반복

R에서 tidymodels로 모델링하기

교차 검증 폴드 생성

vfold_cv() 함수

  • 학습 데이터
  • 폴드 수, v
  • 층화 변수, strata
  • 재현성을 위해 vfold_cv() 전에 set.seed() 실행
  • splits
    • 폴드 생성을 위한 데이터 분할 객체의 리스트 열
set.seed(214)
leads_folds <- vfold_cv(leads_training,

v = 10,
strata = purchased)
leads_folds
#  10-fold cross-validation using stratification 
# A tibble: 10 x 2
   splits            id    
   <list>            <chr> 
 1 <split [896/100]> Fold01
 2 <split [896/100]> Fold02
 3 <split [896/100]> Fold03
 . ................  ......
 9 <split [897/99]>  Fold09
10 <split [897/99]>  Fold10
R에서 tidymodels로 모델링하기

교차 검증으로 모델 학습

fit_resamples() 함수

  • parsnip 모델 또는 workflow 객체 학습
  • 교차 검증 폴드 제공, resamples
  • 선택적 사용자 정의 메트릭 함수, metrics
    • 기본: 정확도, ROC AUC

 

각 메트릭은 10회 추정

  • 폴드별 1개 추정치
  • 평균은 mean 열에 표시
leads_rs_fit <- leads_wkfl %>%

fit_resamples(resamples = leads_folds,
metrics = leads_metrics)
leads_rs_fit %>% collect_metrics()
# A tibble: 3 x 5
  .metric .estimator  mean     n std_err
  <chr>   <chr>      <dbl> <int>   <dbl>
1 roc_auc binary     0.823    10  0.0147
2 sens    binary     0.786    10  0.0203
3 spec    binary     0.855    10  0.0159
R에서 tidymodels로 모델링하기

교차 검증 결과 상세

collect_metrics() 함수

  • summarize = FALSE를 지정하면 각 폴드의 모든 메트릭 추정치를 제공합니다
  • 총 30개 조합(메트릭 3개 x 폴드 10개)
    • .metric 열: 메트릭 구분
    • .estimate 열: 폴드별 추정값
rs_metrics <- leads_rs_fit %>% 
  collect_metrics(summarize = FALSE)

rs_metrics
# A tibble: 30 x 4
   id     .metric .estimator .estimate
   <chr>  <chr>   <chr>          <dbl>
 1 Fold01 sens    binary         0.861
 2 Fold01 spec    binary         0.891
 3 Fold01 roc_auc binary         0.885
 4 Fold02 sens    binary         0.778
 5 Fold02 spec    binary         0.969
 6 Fold02 roc_auc binary         0.885
# ... with 24 more rows
R에서 tidymodels로 모델링하기

교차 검증 결과 요약

collect_metrics()는 티블을 반환합니다

  • dplyr로 요약 가능
    • rs_metrics로 시작
    • .metric로 그룹화
    • summarize()로 요약 통계 계산
rs_metrics %>%

group_by(.metric) %>%
summarize(min = min(.estimate), median = median(.estimate), max = max(.estimate), mean = mean(.estimate), sd = sd(.estimate))
# A tibble: 3 x 6
 .metric   min  median   max   mean     sd
  <chr>   <dbl>  <dbl>  <dbl>  <dbl>   <dbl>
1 roc_auc 0.758  0.806  0.885  0.823   0.0466
2 sens    0.667  0.792  0.861  0.786   0.0642
3 spec    0.810  0.843  0.969  0.855   0.0502
R에서 tidymodels로 모델링하기

교차 검증 방법론

fit_resamples()로 학습한 모델은 새로운 데이터에 예측을 제공할 수 없습니다

  • predict()는 리샘플 객체를 허용하지 않음

fit_resamples()의 목적

  • 다양한 모델 유형의 성능 프로파일 탐색·비교
  • 최고 성능 모델 유형을 선택해 학습에 집중
predict(leads_rs_fit,
        new_data = leads_test)

Error in UseMethod("predict") : 
  no applicable method for 'predict' applied to 
  an object of class 
  "c('resample_results', 
      'tune_results',  
      'tbl_df', 
      'tbl', 'data.frame')"
R에서 tidymodels로 모델링하기

교차 검증을 해봅시다!

R에서 tidymodels로 모델링하기

Preparing Video For Download...