7 분 소요

이번 포스트는 Model을 평가하는 방법 (Model Evaluation) 대해 다룬다.

Model Evaluation

모델 평가의 목적 : 진짜 성능을 측정하자

  • Training 성능이 아니라 Unseen Data에서의 성능을 보는 것
  • 여러 모델 중에서 테스트 데이터에서 가장 잘하는 모델을 선택
    • Training을 잘한다고 좋은 모델은 아님
    • OverFitting 위험이 존재

Evaluation Metrics

어떻게 모델의 성능을 측정할까?

Bias (편향)

  • 너무 단순해서 생기는 오류
  • underfitting, 데이터 패턴을 잡지 못한다.

Variance (분산)

  • 데이터에 너무 민감해서 생기는 오류
  • overfitting, 노이즈까지 학습

Confusion Matrix

confusion matirx

의미

  • TP : 맞춘 Positive
  • FP : 틀린 Positive (Type 1 Error)
  • FN : 놓친 Positive (Type 2 Error)

문제마다 FP / FN 중요도가 다르다.

1. 정확도 (Accuracy) \(Accuracy=\frac{TP+TN}{TP+TN+FP+FN}\)

  • 전체 중에서 맞춘 비율
    • 클래스가 균형일 때,
    • FN / FN의 중요도가 동일할 때 사용
  • 클래스가 불균형일 때는 사용하면 안된다.
    • 99% 정상, 1% 이상인 경우
    • 전부 정상이라고 해도 정확도는 99%
    • 쓰레기 모델이지만 좋아보임.

2. 정확도 (신뢰도) (Precision) \(Precision=\frac{TP}{TP+FP}\)

  • 내가 Positive라고 한 것 중 몇개가 진짜 Positive인가
  • FP를 줄이는게 중요한 상황에 쓰임
    • 스팸 필터, 금융 사기
    • 정상인데 막으면 안되는 경우

3. 탐지율(Recall) \(Recall=\frac{TP}{TP+FN}\)

  • 실제 Positive 중에 몇 개를 잡았냐
  • FN을 줄이는 게 중요한 상황에 쓰임
    • 암 진단, 이상 탐지
    • 놓치면 큰일 나는 경우

F1-Score

\[F1 = 2 \cdot \frac{Precision \cdot Recall}{Precision + Recall}\]
  • Precision과 Recall을 균형 있게 고려한 값
    • 단순 평균이 아닌 harmonic mean 사용
    • 둘 중 하나라도 낮으면 F1 도 크게 떨어진다.
  • 불균형하면 강하게 페널티

F1-score 사용 경우

  1. 하나의 metric으로 보고 싶을 때
  2. class imbalance가 있을 때
  3. FP, FN 이 둘 다 중요할 때

Evaluation Methods

Holdout Method

  • 가장 기본적인 평가 방식 : 데이터를 한 번만 둘로 나누는 것
    • Training set : 모델 학습용
    • Test set : 학습에는 안 쓰고, 마지막 평가만 하는 용도
  • 방법
    • 데이터를 한 번 분할한다.
    • Training set으로 모델을 만든다.
    • Test Set으로 성능을 잰다.
  • 장점 : 구현이 쉽고, 빠르고, 큰 데이터에서는 꽤 괜찮게 작동한다.
  • 단점 : 결과를 나눈 방식에 너무 의존한다. / 데이터를 낭비한다.
    • 평가 결과가 split 운에 따라 흔들릴 수 있다.
    • High Variance

K-Fold Cross Validation

Holdout의 약점을 줄이기 위해 나온 방법

  • 데이터를 한 번만 나누지 말고, 여러 번 나눠서 평균 성능을 보자
  • 방법
    • 데이터를 k개의 Fold로 나눈다.
    • 첫 번째 조각을 validation/test처럼 쓰고, 나머지 4개로 학습
    • 두 번째 조각을 validation/test…
    • 총 K번 학습/평가
  • 최종 성능 = 여러 번 평가한 성능의 평균
  • 장점 : 결과가 더 안정적, 데이터 낭비가 적다.
  • 단점 : K번 학습해야 하기 때문에 계산량이 더 큼

LOOCV (Leave-One-Out Cross Validation)

  • 데이터가 아주 적을 때 극단적으로 사용하는 경우
    • 한 번에 딱 1개만 test로 빼자
  • 일반적인 K-fold에서는 매번 (k-1)/k 만큼 학습에 사용
    • 거의 모든 데이터가 전부 학습에 사용
    • 데이터가 적은데 학습 세트까지 작아지면 모델 성능이 비관적으로 나올 가능성이 크다.
  • LOOCV 방법
    • 데이터가 n개면 1개는 test, 나머지 n-1개는 training
      • 한 데이터 포인트를 남겨두고 나머지로 학습
    • n번 반복하고 모든 데이터에 대한 반복
    • 평균 error 계산
  • 장점 : 매번 거의 모든 데이터를 학습에 사용, 데이터가 적을 때 아주 효율적, 성능 추정에서 training data 부족 문제를 줄일 수 있다.
  • 단점 : 계산량이 매우 크다. / Test Set이 매번 1개뿐

Stratified Cross Validation

  • 문제 상황 : 클래스 비율이 한쪽으로 심하게 치우져 있다.
    • Class Imbalance 상황
  • Class Imblance 상황에서 랜덤 Split의 문제
    • 어떤 fold 에는 minority class 가 거의 없을 수 있다.
    • Fold마다 class Distribution이 달라진다.
      • Fold 간의 성능 차이가 커지고 평균 성능이 믿기 어려워지는 상황
  • 핵심 아이디어 : 각 Fold가 전체 클래스 비율을 최대한 비슷하게 유지하도록 나눔
    • 예를 들어 전체가 90% negative / 10% positive
    • 각 fold도 대략 90% negative / 10% positive

Bootstrap

Bootstrap : Sampling with Replacement

  • 데이터가 적으면 평가가 불안정해진다.
  • 문제상황
    • 데이터가 적어서 모델이 제대로 학습을 못함
    • 성능 추정이 들쭉날쭉함
    • Holdout / CV 하면 학습 데이터 더 줄어든다.
  • 데이터를 여러 번 복제해서 여러 개 dataset처럼 쓰자

Bootstrap

  • 하나의 데이터셋으로부터 여러 개의 데이터셋을 만들어서 사용

  • 복원 추출 : 뽑은 데이터를 다시 넣고 또 뽑는다.

    • 특정 split에 의존 안 함.
    • training size를 유지
    • 더 안정적인 성능을 추정

0.632 Bootstrap

\[Acc = 0.368 \cdot Acc_{train} + 0.632 \cdot Acc_{OOB}\]
  • training accuracy : 너무 optimistic (과적합 느낌)
  • test accuracy : 너무 pessimistic (데이터 적어서)
\[Acc = 0.368 \cdot Acc_{train} + 0.632 \cdot Acc_{OOB}\]

train은 덜 믿고, OOB를 더 믿는다.

train (36.8%) , OOB (63.2%)

  • 장점 : 최대한 데이터 활용, 성능 추정 안정적, 분산까지 추정 가능

0.632인가?

\[(1 - \frac{1}{n})^n\]
  • 이 데이터가 한 번도 안 뽑힐 확률
\[(1 - \frac{1}{n})^n \approx e^{-1} \approx 0.368\]
  • 약 36.8% 데이터는 선택 안 됨.
  • 63.2% 최소 1번 이상 선택

Statistical Tests

문제상황 :

Model A가 평균 Accuracy가 더 높다. 그러면 A가 진짜 더 좋은 모델일까?

  • 항상 그렇지 않다.
  • 데이터 샘플링 randomness
  • noise
  • 모델 variance

T-Test

  • 이 차이가 statistically meaningful 한가?
  • 평균 차이가 0인지 아닌지 검정
    • 각 Fold 마다
\[d_i = Acc(A_i) - Acc(B_i)\] \[\bar{d} = \frac{1}{k} \sum d_i\] \[H_0: \mu_d = 0\] \[H_1: \mu_d \neq 0\]
  • 가설 검정 = 0 : 차이가 없다.
  • 가설 검정 != 0 : 차이가 있다.

T-statistic \(t = \frac{\bar{d}}{s_d / \sqrt{k}}\)

  • 차이가 크고 + 변동이 작으면 -> t가 크다
  • 차이가 작거나 + 변동이 크면 -> t가 작다

P-value

\[p = \text{H0}\]
  • p-value : 이게 우연일 확률

기준

p-value 해석
< 0.05 의미 있음 (reject H₀)
> 0.05 의미 없음 (fail to reject H₀)
  • 평균이 더 높다고 좋은 모델이 아니다.
    • 통계적으로 유의미해야 좋은 모델이다.

Ensemble

왜 서로 다른 모델들은 성능이 다를까?

  • 모델마다 데이터를 바라보는 방식이 다르다.
    • Naive Bayes : 특징들이 서로 독립적이라고 가정
    • Logistic Regression / Perceptron /Linear SVM
      • 데이터를 대체로 선형 경계로 나눌 수 있다고 가정
    • Decision Tree
      • 여러 번 조건 분기를 하면 복잡한 경계도 만들 수 있다고 봄

Complexity

  • 복잡한 모델 : 데이터를 세밀하게 맞추기 가능, 다만 과적합 위험 존재

Objective

  • 최적화 목표가 다르다.

Sensitivity to noise / outliers

  • 노이즈나 이상치에 얼마나 민감한가

Bias

  • 모델이 현실을 얼마나 강하게 단순화되느냐
  • Bias 가 높은 모델의 특징
    • 가정이 너무 강하다 : 현실 데이터 충분히 표현하지 못함.
    • 복잡합 패턴을 못 잡는다 : 데이터가 곡선 형태로 나뉘는데 직선만 쓰겠다고 하면 잘 못 맞춘다.
    • underfitting : 훈련 데이터조차 잘 못 맞춤

Variance

  • 훈련 데이터가 조금 바뀌었을 때 모델이 얼마나 흔들리느냐
  • Variance가 높은 모델의 특징
    • 데이터에 따라 결과가 많이 바뀜
    • noise / outlier에 민감
    • Overfitting

예측 에러는 어디서 오는가?

\[\text{Error} = \text{Bias}^2 + \text{Variance} + \text{Irreducible Noise}\]

Bias

  • 모델의 평균적인 예측이 정답과 얼마나 떨어져 있는가
  • 모델이 근복적으로 잘못된 방향으로 배우는 오차

왜 제곱인가

  • MSE 전개 -> 주로 제곱 형태로 나옴

Variance

  • 모델 예측이 훈련 데이터에 따라 얼마나 들쭉날쭉한가
  • 데이터 샘플링이 바뀔 때 예측이 얼마나 흔들리는가

Irreducibile Noise

  • 줄일 수 없는 잡음
    • 측정 오차
    • 데이터 자체의 불확실성
    • 본질적으로 랜덤한 요소

Bias and Variance of Classifiers

1. Basic Classifier

  • Decision Tree
    • Bias : Low , Variance : High
    • 복잡한 경계도 잘 만들 수 있다. bias가 낮다.
    • 잘 맞출 수는 있는데 불안정하다.
  • Navie Bayes
    • Bias : High , Variance : Low
    • 독립 가정이 너무 강해서 현실을 단순화를 많이 함
    • 안정적이지만 표현력이 약하다.

2. Linear Classifiers

  • Logisitc Regression
    • Bias : Medium / Variance : Low
    • 선형 경계를 쓰기에 유연하지는 않다.
  • Perceptron
    • Bias : Medium to High / Variance : Low to Medium
    • perceptron 도 선형 모델이라 단순한 편이다.
  • Linear SVM
    • Bias : Medium / Variance : Medium
    • 선형 경계지만 margin을 최대화 perceptron보다 더 robust 한 경향이 있다.

3. Advanced SVM

  • Soft-Margin SVM
    • Bias : Medium to Low / Variance : Medium
    • 조금 틀리는 걸 허용하면서 더 현실적인 경계를 만든다.
  • Nonlinear SVM
    • Bias : Low / Variance : Medium to High
    • 표현력이 매우 커지므로 bias는 낮고, 모델이 복잡해져서 분산이 더 올라간다.

Ensemble Learning

  • 하나의 모델만 믿지 말고, 여러 모델을 합쳐서 더 강한 예측기를 만들자
  • Weak Model
    • 개별적으로는 완벽하지 않지만 어느 정도 쓸 만한 예측은 하는 모델
  • 여러 모델을 합치면 좋아지는가?
    • Accuracy 향상
    • Overfitting 완화
    • robust performance

왜 앙상블이 성능을 올릴까?

  • Ensemble이 건드리는 것 : Variance
\[f_{ens}(x) = \frac{1}{k} \sum_{i=1}^{k} f_i(x)\]
  • Variance 계산 \(Var(f_{ens}) = Var\left(\frac{1}{k} \sum f_i\right) = \frac{1}{k^2} \sum Var(f_i)\)

    • 모델 개수 k가 많아질수록 Variance가 줄어든다.

언제 ensemble이 다양한가?

  • 만약 모델들이 다 똑같다면?
    • 평균을 해도 Variance는 그대로
  • 모델 간 Correlation이 낮아야 한다.
\[Var(f_{ens}) = \frac{\sigma^2}{k} + \frac{k-1}{k} \sigma^2 \rho\]
  • k 증가 : Variance 감소
  • p (상관도) 증가 : variance 감소 효과 줄어듬

Bagging

  • Bagging = Bootstrap + Aggregating

  • Parallel (모델은 독립적으로 학습)
  • 여러 모델을 독립적으로 병렬 학습
    • 마지막에 평균/투표
    • variance를 줄이는 데 강하다.
  • 대표 예 : Random Forest
    • Decision Tree + Bagging

과정

  1. Bootstrap Sampling : 복원 추출로 여러 dataset 생성
  2. 각 dataset으로 모델 학습
  3. 결과 평균

Boosting

  • 이전 모델의 실수를 다음 모델이 보완

  • Sequential (모델들이 서로 의존)
  • 이전 모델이 틀린 걸 다음 모델이 더 집중해서 학습
    • 모델들이 순차적으로 쌓임
    • Bias가 줄이는 데 강한 경우가 많다.
  • 대표 예 : AdaBoost, Gradient Boosting, XGBoost

과정

  1. 모델 1 학습
  2. 틀린 데이터 찾기
  3. 그 데이터의 중요도를 향상
  4. 다음 모델이 더 집중해서 학습

AdaBoost

  • Boosting 의 대표 알고리즘

    • 모든 데이터 동일 weight
    • 모델 학습
    • 틀린 데이터 weight 증가
    • 다음 모델이 hard sample 집중
    \[w_i^{(m+1)} = w_i^{(m)} \exp(-\alpha_m y_i f_m(x_i))\]
  • 모델 가중치 \(\alpha_m = \frac{1}{2} \log \frac{1 - \epsilon_m}{\epsilon_m}\)

  • 최종 예측 \(F(x) = sign\left(\sum \alpha_m f_m(x)\right)\)