Yet Never Lose Faith

- Good to Great , Jim Collins

How To Preprocess Image Data 자세히보기

Deep Learning/[Books] Do it! 정직하게 코딩하며 배우는 딥러닝 입문

[모델 튜닝] 머신러닝/딥러닝 Validation Set 만드는 이유와 방법

Kellyyyy 2020. 9. 22. 08:00

 

 

 

 

이번 포스팅에서는 머신러닝 모델을 구현할 때 Validation Set을 만드는 이유와 방법을 다룬다.

 

| Validation Set이란?

 

Validation Set이란?

 

Validation Set을 직역하면 '검증데이터 집합'이다. 글자 그대로 '머신러닝 모델을 검증하기 위한 데이터셋' 즉, 성능 평가를 위한 데이터 셋이라고 보면 된다. 보통 위 그림과 같이 전체 데이터 셋의 20% 정도 떼어서 만든다. 

 


그냥 Test Set으로 성능 평가하면 되는 거 아니야?

Nope!

 

모델이 태어나는 과정

 

이는 하나의 머신러닝 모델을 구축하는 프로세스를 이해하면 쉽게 이해가 될 것이다. 모델검증과 모델평가는 분리해서 생각해야한다. 모델 검증은 모델의 성능을 평가하고, 그 결과를 토대로 모델을 튜닝하는 작업을 진행한다. 반면 모델 평가는 최종적으로 '이 모델이 실전에서 이만큼 성능을 낼 것이다!' 라는 것을 확인하는 단계이다. 그렇기 때문에 모델 검증 단계와 모델 평가 단계에서 사용하는 데이터셋은 분리되어야한다. 만약 모델 검증에 쓰였던 데이터를 모델 평가 단계에서도 사용한다면 당연히 높은 점수를 낼 것이기 때문이다. 이런 현상을 'Test Set의 정보가 모델에 새어나갔다' 혹은 '모델의 일반화 성능이 왜곡되었다' 고 한다. 

 

정리하면, Test Set는 모델 튜닝을 모두 마치고 실전에 투입하기 전에 딱 1번(모델 평가 단계)만 사용하는 것이 좋다. 그래서 모델을 튜닝할 때는 별도의 Validation Set을 이용하고, 이는 훈련 세트를 조금 떼어서 만든다.

 


| Validation Set을 만드는 방법?

 

# 데이터 세트 준비하기
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
cancer = load_breast_cancer()
x = cancer.data
y = cancer.target
x_train_all, x_test, y_train_all, y_test = train_test_split(x, y, stratify=y, test_size=0.2, random_state=42)

# 검증세트 분할하기
x_train, x_val, y_train, y_val = train_test_split(x_train_all, y_train_all, stratify=y_train_all, test_size=0.2, random_state=42)
print(len(x_train), len(x_val))
# 364, 91

 

 

보통 검증세트를 분할할 때는 전체 데이터 세트를 8 : 2로 나누어 훈련 세트와 테스트 세트를 만들고, 다시 훈련세트를 8 : 2로 나누어 훈련세트와 검증세트를 만든다. 위 소스는 유방암 데이터를 훈련세트, 테스트세트, 검증세트로 나누는 예시이다. 455개의 훈련세트가 8:2 비율로 나누어져 훈련세트는 364개, 검증세트는 91개로 나누어졌다.


| Warning!

 

전체 데이터양이 너무 적은 경우에는검증세트의 비율이나 train_test_split 함수의 random_state 매개변수의 값을 조금만 조절해도 성능 평가 점수가 크게 변한다. 그래서 데이터 양이 너무 적은 경우에는 검증세트를 나누지 않고 교차검증(cross validation)이라는 방법을 사용하기도 한다. 이 방법에 대해서는 다른 포스팅에서 다룬다.

 


| Reference.

- 도서 <Do it! 정직하게 코딩하며 배우는 딥러닝 입문> 이지스퍼블리싱, 박해선 지음

 


끝.