
데이터마이닝에서는 모델의 성능을 정확하게 평가하고, 개선하기 위해서 데이터를 분할해 사용한다.

Training set, Validation set, Test sets 비율
정해진 룰은 없지만 데이터를 충분히 크게 모을 수 있는 요즘에는 다음과 같은 비율을 일반적으로 사용한다.
Training set : Validation set : Test sets = 60 : 20 : 20
Training set, Validation set, Test sets 모두 target에 적합한 데이터에서 가지고 오면 된다.

주어진 데이터셋의 크기가 지나치게 작다면, 이를 6:2:2의 비율로 나눈다고 하더라도 각 train, validation, test set에 할당되는 데이터의 양이 너무 적어 효과적으로 모델을 학습하고 검증하는데에 어려움을 겪을 수 있다.
우리가 원하는 distribution에서 온 데이터셋을 a라고 부르고,
그 외의 다른 distribution 에서 오는 데이터셋을 b라고 가정해보자.

📌 이때, 예를 들어 시계열 데이터를 사용하여 모델을 학습시킨다고 한다면, 데이터를 random 하게 섞지 않고, 시간의 흐름에 따라 달라지는 데이터를 모델이 학습할 수 있도록 해 주어야 합니다.
시계열 데이터를 포함하는 다양한 데이터는 그성질에 따라 필요로 하는 dataset splitting 방법이 조금씩 달라질 수 있다. 따라서 데이터셋을 분할할때에 우리가 다루는 데이터는 어떤 성질을 가지고 있는지 고려해야 한다.

*distribution: 데이터의 출처(web page, user uploaded images, 미국에서 collect한 데이터, 한국에서 collect 한 데이터, etc.)
*target: 우리가 모델을 통하여 해결하고자 하는 문제, 또는 모델이 좋은 성능을 낼 수 있도록 하는 목표
Evaluation Metric
: 모델을 훈련시키고 validation set에 대한 결과를 평가할 때 사용되는 기준
Dataset splitting 을 하고, train set 으로 학습한 모델이 validation set 을 통해 검증을 받을때에, 우리는 evaluation metric 을 통해 모델의 성능을 평가한다.

if. 성공적으로 평가하는 Evaluation Metric를 세웠다고 할 때, evaluation metric에 따른 결과가 좋지 않다면 dataset splitting을 효과적으로 했는지 다시 한 번 확인해보는 과정이 필요하다.
Training set으로 모델들을 만든 뒤, validation set으로 최종 모델을 선택하게 된다. 최종 모델의 예상되는 성능을 보기 위해 test set을 사용하여 마지막으로 성능을 평가한다. 그 뒤 실제 사용하기 전에는 쪼개서 사용하였던 training set, validation set, test set 을 모두 합쳐 다시 모델을 training 하여 최종 모델을 만든다. 기존 training set만을 사용하였던 모델의 파라미터와 구조는 그대로 사용하지만, 전체 데이터를 사용하여 다시 학습시킴으로써 모델이 조금 더 튜닝되도록 만든다.
혹은 data modeling을 진행하는 동안 새로운 데이터를 계속 축적하는 방법도 있다. 최종 모델이 결정 되었을 때 새로 축적된 data를 test data로 사용하여 성능평가를 할 수도 있다.
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 = []
# Validationfor 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)

Referance
https://deepai.org/machine-learning-glossary-and-terms/evaluation-metrics
https://towardsdatascience.com/the-most-common-evaluation-metrics-in-nlp-ced6a763ac8b
https://medium.com/analytics-vidhya/evaluation-metrics-for-classification-models-e2f0d8009d69