본문 바로가기

파이썬/모델 성능평가

validation set이란? test set과의 차이점과 사용 방법

여태까지 공부를 할 때는 train set과 test set 두개로만 데이터를 나누었다.

다만 이렇게 train, test 두개로만 분리하는 것은 기초적인 수준이고, 보통 현업에서 모델을 만들 때는 train, test, validation set 세개로 나눈다.

 

 

Validation Set과 Test Set의 차이?

 

출처: datavedas.com

 

validation set : 학습이 이미 완료된 모델을 검증하기 위한 set (중간 점검)

test set : 학습과 검증이 끝난 모델의 최종 성능 평가용

 

 

단순히 train, test로만 분리하면 train set으로 모델을 만들고 test set으로 성능을 평가하게 된다. 보통 현업에서 모델을 만들 때는 한번에 모델이 만들어지기 보다는 피드백을 받고 수정을 거치는 경우가 대부분이다. 

 

 

그런데 test set을 검증용으로 사용하면 훈련에 사용되었다고 보기 때문에 모델 수정 후 동일한 test set으로 검증하면 정확한 성능 평가가 어렵다. 그렇기 때문에 필요한 것이 바로 validation set이다.

 

 

validation set은 모델 성능 검증용으로 중간에 사용되는 데이터셋이므로 학습에 일정 부분 관여하게 된다. test set은 train set으로 학습하고, validation set으로 검증까지 끝낸 모델에 대해 최종적으로 성능을 평가할 때 사용한다. 보통 모델을 다 만들어서 보고까지 끝낸 후 현업에 최종 배포하기 전에 test set으로 최종 성능 평가를 한다.

 

 

 

validation set 분리

 

사이킷런의 train_test_split을 두 번 사용하면 된다.

 

train, test를 나눈 후 train을 다시 train-val로 나누거나 test를 val-test로 나눈다.

보통 6:2:2의 비율로 나누며 train set을 쪼개든, test set을 쪼개든 크게 상관없다.

 

 

 

사이킷런의 load_breast_cancer 데이터로 간단하게 validation set을 나누는 실습을 해보자.

 

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.metrics import accuracy_score

cancer = load_breast_cancer()

X, y = cancer.data, cancer.target

#train, test 6:4로 나누기
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size = 0.4, 
                                                    random_state = 42)

#test set을 5:5로 test, val 나누기
X_test, X_val, y_test, y_val = train_test_split(X_test, y_test,
                                                 test_size=0.5,
                                                 random_state = 42)

#모델 훈련
rand_clf = RandomForestClassifier(n_estimators=200, criterion='entropy', random_state=42)
rand_clf.fit(X_train, y_train)

y_pred_train = rand_clf.predict(X_train)
y_pred_val = rand_clf.predict(X_val)

#validation set으로 검증
val_score = accuracy_score(y_val, y_pred_val)
val_score           
>>>0.9736842105263158

#test set으로 검증
y_pred_test = rand_clf.predict(X_test)
test_score = accuracy_score(y_test, y_pred_test)
test_score
>>>0.9736842105263158

 

 

참고로 k겹 교차검증을 사용하면 교차검증에서 알아서 validation set을 나눠주기 때문에 굳이 train_test_split으로 validation을 구분할 필요는 없다.

 

K겹교차검증 기본 개념