이번 글에서는 모델의 검증(Validation) 방법을 간단히 정리해 보았습니다.
모델 검증 방법은 크게 3가지로 나뉩니다.
① 홀드아웃(Hold-out)
가장 간단하고 직접적인 검증 방법으로, 데이터를 임의로 나눠 각각 훈련, 검증, 테스트에 사용합니다.
일반적으로 각 크기를 6:2:2 비율로 나누거나, 훈련과 테스트 데이터셋을 7:3 또는 8:2 비율로 나눈 후, 훈련 데이터셋을 다시 훈련과 검증 셋으로 7:3 또는 8:2 비율로 나눠 사용하기도 합니다.
단점은 데이터셋을 어떻게 나누느냐에 따라 테스트 성능에 차이가 크다는 것입니다. 이는 곧 검증을 한 번만 수행하기 때문이기도 하죠.
따라서 이를 보완하기 위해 다음과 같은 교차 검증 방법이 등장하게 되었습니다.
② 교차 검증(Cross Validation)
쉽게 말해 데이터셋을 여러 개 샘플 세트로 나누고, 이를 돌아가면서 검증하도록 하는 방법입니다.
이 중 k-fold 교차 검증은 전체 데이터를 k개로 나누고, 이들 중 하나가 돌아가면서 검정 세트가 되도록 합니다.
그리고 k번의 validation score 평균값을 최종 평가 지표로 사용합니다.
아래 그림은 k=3일 때 훈련, 검증 데이터셋을 나눈 예시입니다. 일반적으로 k는 5~10 사이로 설정합니다.
교차 검증의 또 다른 방법에는 LOOCV(Leave-One-Out)이 있습니다.
모든 데이터 샘플에 대해 돌아가면서 검증을 수행하는 방식으로, 데이터가 적을 때 사용하는 것이 좋습니다.
데이터 수가 `n`개라면 `n`번의 검증을 수행하므로 계산량이 많기 때문입니다. 그래서 실무에서 일반적으로 사용되지는 않는 것 같네요.
최종 평가 지표는 역시 모든 validation score의 평균값을 사용합니다.
아래 그림은 위 3가지 방법을 비교한 그림입니다.
다시 한 번 설명하면, LOOCV는 k가 데이터셋 크기와 같을 때의 k-fold 방식과 동일합니다.
③ 부트스트랩(Bootstrap)
데이터 내에서 반복적으로 복원 추출을 하는 resampling 방법입니다.
즉 데이터셋을 분할하지 않고, 훈련 데이터셋의 크기를 유지하면서 검증할 수 있기 때문에, 데이터가 적을 때 LOOCV보다 더 먼저 고려될 수 있습니다.
참고로 복원 추출에 대한 설명은 아래 글에서 더 정확하게 이해할 수 있습니다.
이렇게 부트스트래핑을 통해 추출한 샘플을 학습에 사용하고, 나머지 샘플을 검정을 위해 사용합니다. 따라서 OOB(Out-of-Bag) 검증 셋이라고도 부릅니다.
이러한 방법이 가능한 이유는 전체 데이터셋과 복원 추출한 데이터셋이 유사한 분포를 가지기 때문입니다.
아래 주황색 그림은 실제 모집단에서의 샘플들의 분포이고, 파란색 그림은 bootstrapping한 샘플들의 분포입니다.
이처럼 두 분포가 비슷하기 때문에 부트스트래핑한 데이터로부터 기존 데이터의 분산을 추정할 수 있게 됩니다.
또한 확률적으로 중복을 허용한 복원 추출의 경우, 전체 데이터 중 `\frac{1}{3}`이 한 번도 뽑히지 않을 것이므로 약 30%를 validation set으로 사용할 수 있습니다.
부트스트랩을 파이썬으로 구현할 때에는 numpy를 이용하면 간단합니다.
위에서 설명한 것처럼 기존 데이터셋 bag의 평균과 복원 추출한 데이터셋들의 평균값이 각각 300.0574와 299.9464로 거의 같은 것을 확인할 수 있습니다.
import random
import numpy as np
bag = np.random.normal(loc=300.0, size=1000)
print(np.mean(bag))
# 300.05742691415696
sample_mean = []
for i in range(50):
train = random.sample(bag.tolist(), 4)
avg = np.mean(train)
sample_mean.append(avg)
print(np.mean(sample_mean))
# 299.946380750603
아래 자료를 참고하였습니다.
- 책 『데이터 과학자와 데이터 엔지니어를 위한 인터뷰 문답집』
- Bootstrap Sampling in Python
- 모델 검증과 평가
- Bootstrap sampling 쉽게 이해하기
'공부하며 성장하기 > 인공지능 AI' 카테고리의 다른 글
[한 줄 정리] 베이지안 최적화(Bayesian Optimization) (0) | 2022.02.14 |
---|---|
CNN Parameter Sharing (1) | 2022.02.10 |
ROC 곡선 vs. P-R 곡선 (0) | 2022.01.30 |
[한 줄 정리] 분류 모델 평가 지표 (0) | 2022.01.23 |
[한 줄 정리] SMOTE (0) | 2022.01.17 |