[Tidy Modeling with R] 9. Performance Metrics (모델 성과 지표)

2023. 9. 27. 17:35·Data Science/Modeling

0. 개요

이번 시간에는 yardstick 패키지를 사용한 모델의 성과 지표에 대해서 알아보려고 합니다.

우선 본격적인 소개에 앞서 해변가에서 핸드메이드 아이스크림을 판매하고 있다고 생각해 봅시다. 판매하는 입장에서 최고의 전략은 판매 될 아이스크림의 수를 예측하여 해당 수량의 재료만큼 준비하여 버리는 것 없이 최대의 수익을 버는거겠죠. 반면에 100개 만큼의 아이스크림이 팔릴거라고 예측했으나 30개밖에 못팔았다면 남은 70개에 해당하는 재료를 버려야 하고 100개 만큼의 아이스크림이 팔릴거라고 에측했으나 300명의 손님이 찾아온다면 아이스크림 200개 대한 이득은 벌지 못하는거죠.

 

이처럼, 관심있는 수량을 정확하게 예측할 수 있다면 좋은데요 어떻게 미래의 아이스크림의 수를 예측할 수 있을까요?

아이스크림의 판매량은 온도나 시간에 영향을 받기 때문에, 처음으로 ARIMA 모델이나 지수평활법, 시계열 회귀를 포함한 시계열 모델링을 생각해 볼 수 있겠습니다. 또한 시계열적인 요소를 제거하고 기온이나 습도, 휴일유무 등의 여러개의 변수를 사용해 머신러닝 및 딥러닝의 회귀를 수행할 수 있을 것 입니다. 이처럼 관심있는 사건에 대한 예측을 수행하려면 보통 여러개의 모델을 생성하게 되는데 그렇다면 여러가지 모델 중 최종적으로 사용할 모델을 어떻게 선택하게 될까요? 

 

본문에서는 이런 문제를 해결할 수 있는 방법 중 Performance Metrics(성과지표)에 대해 설명합니다.

모델이 있으면 모델이 얼마나 잘 작동하는지 알아야합니다. 주관적으로 이 모델은 좋다고 생각하여 접근하는 것이 아닌 정량적인 수치를 가지고 모델을 이해하고 여러 모델을 비교하며 모델을 선택하는 것이 좋습니다. 또한 정량적인 수치를 계산하기 위해서 모델을 적합할때 사용한 Training set이 아닌 Testing set을 이용해서 측정해야 합니다. 왜냐하면 Training set으로 성과지표를 측정한다면 학습시킨 데이터에 대해 성과를 측정하는 것이기에 과도하게 긍정적인 결과를 보일 것 입니다. 참고로 여러가지 성과지표가 존재하는 만큼 상황에 맞는 지표를 선택하는 것이 중요할 수 있습니다.

 

 

1. Performance Metrics and Inference

모델의 효율성은 모델이 어떻게 사용되는지에 달려있습니다. 추론모델(Inferential Model)은 주로 변수들간의 관계를 이해하기 위해서 사용되며 통계 이론을 근거로 하는 경우가 많습니다. 반면에 예측모델(Prediction Model)은 예측력이 가장 중요하며 상대적으로 통계적 지식은 덜 중요할 수 있습니다. 이때 예측력은 예측한 값과 실제값이 얼마나 가까운지를 수량화한 값이며 해당 챕터에서 에측과 관련한 지표들에 대해서 소개합니다. (통계적 유의한 변수가 실용적으로 유용하지 않는 경우가 있으므로 본문에서는 예측력과 관련한 지표를 주로 소개합니다.)

 

 

2. Regression Metrics

parsnip 또는 워크플로우 객체에 predict 함수를 사용하면 (열이름이 정해진) 티블(데이터프레임)을 출력하는 것을 기억하시나요?

이와 유사하게 yardstick 패키지에서 지원하는 성과 지표 함수들 역시 아래와 같은 일관된 인터페이스를 가지고 있습니다.

metrics_name(data, truth, ...)
  • data 인자는 데이터 프레임 혹은 티블 객체를 입력받습니다.
  • truth 인자는 실제로 관측된 데이터 값에 해당하는 열 이름을 입력받습니다.

 

아래는 8장에 나온 모델링 코드입니다.

library(tidymodels)
library(tidyverse)

ames.split <- ames %>% initial_split(prop=3/4, strata = Sale_Price)
ames.train <- ames.split %>% training()
ames.test <- ames.split %>% testing()

ames_recipe <- 
  recipe(Sale_Price ~ Neighborhood + Gr_Liv_Area + Year_Built + Bldg_Type + Latitude,
         data = ames.train) %>% 
  step_log(Gr_Liv_Area, base = 10) %>% 
  step_other(Neighborhood, threshold = 0.01) %>% 
  step_dummy(all_nominal_predictors()) %>% 
  step_interact(~ Gr_Liv_Area:starts_with("Bldg_Type_")) %>% 
  step_ns(Latitude, deg_free = 20)

lm_model <- linear_reg() %>% 
  set_engine("lm") %>% 
  set_mode("regression")

lm_workflow <- workflow() %>% 
  add_recipe(ames_recipe) %>%
  add_model(lm_model)

ames.test_pred <- predict(lm_fit, new_data = ames.test, type="numeric")
ames_test_lm_result <- ames.test %>% 
  select(Sale_Price) %>% 
  bind_cols(predict(lm_fit, ames.test, type="numeric"))

  • recipe 함수와 step_* 함수를 사용해 전처리기(Preprocessor)를 정의했습니다.
  • parsnip 패키지를 사용하여 선형회귀모델을 구축하였습니다.
  • workflows 패키지를 사용하여 모델과 전처리기를 통합한 워크플로 객체를 생성하였습니다.
  • predict 함수를 사용하여 열 이름이 .pred인 티블 객체를 출력하였습니다.

 

이제 모델을 적합하는데 사용하지 않은 ames.test 데이터를 사용한 실제 결과값과 예측값이 있으므로 성과지표 중 하나인 RMSE를 계산해봅시다. RMSE는 Root Mean Squared Error의 약자로 잔차 제곱의 평균을 제곱근한 것으로 아래와 같이 정의합니다. 

$$ RMSE = \sqrt{\frac{1}{N} \sum_{i=1}^{n}(y_i-\widehat{y_i})^2} $$

rmse(ames_test_lm_result, truth = Sale_Price, estimate = .pred)
  • ames_test_lm_result에는 실제값인 Sale_Price와 예측값인 .pred열이 포함되어 있습니다.

 

또한 이처럼 하나씩 계산할 수 있으나 공장 함수(Factory Function)인 yardstick::metric_set 함수를 사용하여 성과 지표들을 포함하는 지표를 계산하는 함수를 출력할 수 있습니다! (Function Factory 이므로 metric_set을 사용한 결과는 함수임을 유의하세요)

ames_metrics <- metric_set(rmse, rsq, mae)
ames_metrics(ames_test_lm_result, truth = Sale_Price, estimate = .pred)

 

마지막으로 본문에서 소개하지 않았지만 회귀 프로세스에서 사용할만 성과지표는 아래와 같습니다.

  • rmse (root mean squared error)
  • rsq ($R^2$)
  • mae (mean absolute error)
  • mape (mean absolute percentage error)
  • mase (주로 시계열 모델링에서 사용, mean absolute scaled error)
  • smape (Symmetric mean absolute percentage error)

 

 

3. Binary Classification Metrics (이진 분류 성과 지표)

two_class_example 데이터 셋을 보면 4가지의 변수가 있는데, truth는 예측하고자 하는 변수의 실제값, Class1과 Class2는 해당 범주에 속할 확률, predicted는 모델이 예측한 값을 나타내고 있습니다.

이처럼 두가지 범주를 예측하는 이진 분류 프로세스에서는 오즈비나 혼동행렬(Confusion Metrics)등을 사용하여 성과를 측정할 수 있습니다. 오즈비에 관한 내용은 추후에 포스팅 할 범주형 자료 분석에서 다룰 수 있도록 하겠으며 일단 혼동행렬과 그와 관련된 지표들을 살펴보겠습니다.

 

yardstick::conf_mat을 사용하며 혼동행렬을 구할 수 있습니다.

conf_mat(two_class_example, truth = truth, estimate = predicted)

  • 227개의 데이터가 실제 Class1d이며 예측도 Class1로 분류되었습니다.
  • 31개의 데이터가 실제로는 Class1이나 예측을 Class2로 잘못 분류되었습니다.

 

이진분류에서 자주 사용되는 성과 지표인 정확도, F1 score, 민감도(Sensitivity), 특이도(specificity)를 다음과 같이 구할 수 있습니다. (참고 https://moogie.tistory.com/50, mn_log_loss : negative log-likelihood)

accuracy(two_class_example, truth = truth, estimate = predicted)
f_meas(two_class_example, truth = truth, estimate = predicted)
sens(two_class_example, truth = truth, estimate = predicted)
spec(two_class_example, truth = truth, estimate = predicted)

 

하나하나 입력하는 것이 번거러운 경우 함수 공장을 출력하는 yardstick::metric_set을 이용하여 다음과 같이 한번에 구할 수도 있습니다.

classification_metrics <- metric_set(accuracy, spec, sens, f_meas)
classification_metrics(data = two_class_example, truth = truth, estimate = predicted)

 

또한, 이진 분류에서 사용하는 성과지표는 앞서 소개한 실제값과 예측값을 사용하는 경우도 있으나 한 범주에 속할 확률을 사용하는 경우도 있습니다. 대표적으로 ROC-Curve가 이러한 경우인데 임계치(Threshold)가 달라짐에 따라 특이도와 민감도가 변화하는 것을 시각화하는 방법입니다. 만약 Class1에 대한 ROC-Curve를 시각화하고자 한다면 다음과 같이 코딩할 수 있으며 맨 아래 코드는 AUC(Area Under the ROC-Curve, ROC-Curve의 면적)을 구하는 코드입니다. 

two_roc <- roc_curve(data = two_class_example, truth = truth, Class1)
autoplot(two_roc)
roc_auc(two_roc)  #AUC

 

4절에서는 다중 분류에 대한 성과 지표를 소개하고 있습니다.  accuracy, macro-averaging, macro-weighted averaging, extended AUC에 대해 설명하고 있으니 궁금하신 분들은 참고해보면 좋을 듯 합니다.

 

 

9 Judging Model Effectiveness | Tidy Modeling with R

The tidymodels framework is a collection of R packages for modeling and machine learning using tidyverse principles. This book provides a thorough introduction to how to use tidymodels, and an outline of good methodology and statistical practice for phases

www.tmwr.org

 

저작자표시 비영리 변경금지 (새창열림)

'Data Science > Modeling' 카테고리의 다른 글

[Tidy Modeling with R] 11. Model Comparison (모델 비교)  (0) 2023.10.09
[Tidy Modeling with R] 10. Resampling  (0) 2023.10.01
[Tidy Modeling with R] 8. Feature Engineering with Recipes  (0) 2023.09.21
[Tidy Modeling with R] 7. Model Workflow  (0) 2023.09.13
[Tidy Modeling with R] 6. Model Fitting with parsnip  (0) 2023.09.11
'Data Science/Modeling' 카테고리의 다른 글
  • [Tidy Modeling with R] 11. Model Comparison (모델 비교)
  • [Tidy Modeling with R] 10. Resampling
  • [Tidy Modeling with R] 8. Feature Engineering with Recipes
  • [Tidy Modeling with R] 7. Model Workflow
임파카
임파카
[ML & Statistics] 모바일 버전에서 수식 오류가 있어 PC 환경에서 접속하는 것을 권장합니다.
  • 임파카
    무기의 스탯(Stat)
    임파카
  • 전체
    오늘
    어제
    • Study (148)
      • Data Science (44)
        • Modeling (18)
        • Manipulation (21)
        • Visualization (4)
      • Statistics (5)
        • Mathmetical Statistics (53)
      • Web Programming (17)
      • AI (26)
        • Machine Learning (16)
        • Deep Learning (10)
      • 활동 및 프로젝트 (3)
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
임파카
[Tidy Modeling with R] 9. Performance Metrics (모델 성과 지표)
상단으로

티스토리툴바