이번 글에서는 모델의 검증(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보다 더 먼저 고려될 수 있습니다.
참고로 복원 추출에 대한 설명은 아래 글에서 더 정확하게 이해할 수 있습니다.
앙상블 학습(Ensemble Learning)이란?
이번 글은 앙상블 학습에 대한 개념과 주요 전략에 대해 쉽게 이해할 수 있도록 정리해 보았다. 앙상블 ensemble, 하면 무엇이 떠오르는가? 다양한 악기가 모여 멋진 연주를 함께 만들어 가는 모습
nanunzoey.tistory.com
이렇게 부트스트래핑을 통해 추출한 샘플을 학습에 사용하고, 나머지 샘플을 검정을 위해 사용합니다. 따라서 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 |