머신러닝 혹은 딥러닝 모델링을 하고자 할 때 우리는 데이터 셋을 나누어 사용한다. 이때 어떤 비율로 나누어 사용하면 좋을지, 각 데이터 셋의 역할은 무엇인지 하나씩 알아보자.
참고로, 개발자로 커리어를 이어나가고 싶다면 수시공고에 지속적으로 지원하는 것이 도움이 된다. 여태 망설였다면 공고를 한번이라도 가볍게 읽어보자.
Training set, Validation set, Test sets 비율
정해진 룰은 없지만 데이터를 충분히 크게 모을 수 있는 요즘에는 다음과 같은 비율을 일반적으로 사용한다.
Training set : Validation set : Test sets = 60 : 20 : 20
Training set의 목적
Training set(훈련 데이터)은 모델을 학습하는데 사용된다.
Training set으로 모델을 만든 뒤 동일한 데이터로 성능을 평가해보기도 하지만, 이는 cheating이 되기 때문에 유효한 평가는 아니다. 마치 모의고사와 동일한 수능 문제지를 만들어 대입 점수를 매기는 것과 같다.
Training set은 Test set이 아닌 나머지 데이터 set을 의미하기도 하며, Training set 내에서 또 다시 쪼갠 Validation set이 아닌 나머지 데이터 set을 의미하기도 한다. 문맥상 Test set과 구분하기 위해 사용되는지, Validation과 구분하기 위해 사용되는지를 확인해야 한다.
Validation set의 목적
Validation set(검정 데이터)은 training set으로 만들어진 모델의 성능을 측정하기 위해 사용된다. 일반적으로 어떤 모델이 가장 데이터에 적합한지 찾아내기 위해서 다양한 파라미터와 모델을 사용해보게 되며, 그 중 validation set으로 가장 성능이 좋았던 모델을 선택한다.
Test set의 목적
Test set(테스트 데이터)은 validation set으로 사용할 모델이 결정 된 후, 마지막으로 딱 한번 해당 모델의 예상되는 성능을 측정하기 위해 사용된다. 이미 validation set은 여러 모델에 반복적으로 사용되었고 그중 운 좋게 성능이 보다 더 뛰어난 것으로 측정되어 모델이 선택되었을 가능성이 있다. 때문에 이러한 오차를 줄이기 위해 한 번도 사용해본 적 없는 test set을 사용하여 최종 모델의 성능을 측정하게 된다.
Validation set과 Test set의 차이
Validation set은 여러 모델들 각각에 적용되어 성능을 측정하며, 최종 모델을 선정하기 위해 사용된다. 반면 test set은 최종 모델에 대해 단 한번 성능을 측정하며, 앞으로 기대되는 성능을 예측하기 위해 사용된다.
실제 모델의 사용
Training set으로 모델들을 만든 뒤, validation set으로 최종 모델을 선택하게 된다. 최종 모델의 예상되는 성능을 보기 위해 test set을 사용하여 마지막으로 성능을 평가한다. 그 뒤 실제 사용하기 전에는 쪼개서 사용하였던 training set, validation set, test set 을 모두 합쳐 다시 모델을 training 하여 최종 모델을 만든다. 기존 training set만을 사용하였던 모델의 파라미터와 구조는 그대로 사용하지만, 전체 데이터를 사용하여 다시 학습시킴으로써 모델이 조금 더 튜닝되도록 만든다.
혹은 data modeling을 진행하는 동안 새로운 데이터를 계속 축적하는 방법도 있다. 최종 모델이 결정 되었을 때 새로 축적된 data를 test data로 사용하여 성능평가를 할 수도 있다.
Training sets, Validation sets, Test sets split 파이썬 코드 예시
다음 MNIST 숫자 필기체 데이터에 대해 SVM(Support Vector Machine) 모델을 수행하는 것이다. SVM의 파라미터 중 하나인 gamma값을 바꿔 가며 어떤 gamma값을 가진 모델이 가장 성능이 좋은지 평가해본다.
import matplotlib.pyplot as plt
from pandas import DataFrame
from sklearn import datasets, svm, metrics
from sklearn.model_selection import train_test_split
# 8x8 Images of digits
digits = datasets.load_digits()
images_and_labels = list(zip(digits.images, digits.target))
# Plot sample images
_, axes = plt.subplots(1, 4)
for ax, (image, label) in zip(axes[:], images_and_labels[:4]):
ax.set_axis_off()
ax.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
ax.set_title('Training: %i' % label)
print('---------Sample---------')
plt.show()
# flattened to (samples, feature) matrix:
n_samples = len(digits.images)
data = digits.images.reshape((n_samples, -1))
# Split data into train, valid and test subsets
X_train, X_test, y_train, y_test = train_test_split(
data, digits.target, test_size=0.2, random_state=1)
X_train, X_val, y_train, y_val = train_test_split(
X_train, y_train, test_size=0.2, random_state=1)
gmm_list = [0.1, 0.01, 0.001]
score_list = []
# Validation
for gmm in gmm_list:
# Support vector classifier
classifier = svm.SVC(gamma=gmm)
classifier.fit(X_train, y_train)
# Score with validation set
predicted = classifier.predict(X_val)
score = metrics.accuracy_score(predicted, y_val)
score_list.append(score)
result = list(map(list, zip(gmm_list, score_list)))
result_df = DataFrame(result,columns=['gamma', 'score'])
print('-------Validation-------')
print(result_df)
print('')
print('----------Test----------')
# Test
best_gmm = result_df.iloc[result_df['score'].argmax()]['gamma']
classifier = svm.SVC(gamma=best_gmm)
classifier.fit(X_train, y_train)
predicted = classifier.predict(X_test)
test_score = metrics.accuracy_score(predicted, y_test)
print('Test Score :', test_score)
Machine learning 모델로 경진대회를 하는 Kaggle 사이트에서는 다수의 팀이 참여하여 각자의 모델을 적용하였을 때 accuracy가 얼마나 높게 되는지, 사이트 내부적으로 숨겨진 test data로 평가받고 그 결과가 좋을수록 좋은 모델 순으로 순위가 매겨진다. 하지만 오래된 경진대회 문제 같은 경우 너무나 많은 team들이 같은 test data로 평가받았기 때문에 validation data로 모델을 평가한 것과 같은 효과가 나타난다. 때문에 간혹 어떤 모델이 마치 test data에 우연히 잘 적합하여 매우 좋은 모델인 것처럼 결과가 나오기도 한다. Validation set은 모델을 평가하기 위해 여러 번 사용할 수 있으나 Test set은 그렇지 않다는 것을 기억해야 한다.
해당글이 재미있었다면 다음글도 확인해보시길 바란다.
'IT > ML' 카테고리의 다른 글
Ridge regression(능형 회귀) 간단한 설명과 장점 (1) | 2020.10.26 |
---|---|
K-Fold Cross Validation(교차검증) 쉽게 이해하기 (0) | 2020.10.19 |
머신러닝 편향-분산 트레이드오프(Bias-variance tradeoff) 쉽게 이해하기 (0) | 2020.09.22 |
차원의 저주 KNN으로 쉽게 이해하기 (0) | 2020.08.24 |
머신러닝 딥러닝 차이 쉽게 알아보기 (0) | 2020.08.20 |