Train, Validation, and Test Set

- 16 mins

Summary

이번 포스팅에서는 인공지능 분야에서 중요한 개념 중 하나인 dataset splitting(데이터셋 분할)에 대해서 알아보겠습니다.

데이터의 개념부터 이해해보자

”data are a set of values of qualitative or quantitative variables about one or more persons or objects.”

데이터 분할이란? 굳이? 왜?

data_split.jpg

위와 같이 나누어진 각 데이터셋이 어떻게 사용 되는지에 대해 알아보겠습니다.

Train Set:

Validation Set:

Test Set:

데이터셋의 특징에 따른 분할

지금까지 어떻게 기본적인 dataset splitting을 진행하는지 알아보았습니다. 하지만 모델의 학습 효과와 성능을 극대화 하기 위해서는 우리가 학습에 사용하는 데이터의 양이나 특성 등을 이해하고 그에 적합한 분할을 해 주는것이 중요합니다. 지금부터는 데이터가 가지고 있을 수 있는 다양한 특징에 따라 어떻게 분할 하는 것이 효율적인지 알아보겠습니다.

데이터의 양

첫번째로는 주어진 데이터의 양에 따라 데이터셋 분할을 하는 방법에 대해서 알아보겠습니다.

데이터가 많은 경우

데이터가 적은 경우

k_fold.jpg

데이터의 특성에 따라

data_type.jpg

데이터의 distribution과 target의 성질에 따라

Evaluation Metric

마지막으로 모델을 훈련시키고 validation set에 대한 결과를 평가할때 사용되는 evaluation metric에 대해 간단히 알아보겠습니다.

“Evaluation metrics are used to measure the quality of the statistical or machine learning model.”

eval_metric.jpg

Code

#먼저 필요한 라이브러리를 가져옵니다. 
import torch
import torchvision.datasets as dsets
import torchvision.transforms as transforms

#torchvision.dataset 을 통해 MNIST 데이터를 다운로드 하고, train 과 test set 을 각 객체에 저장합니다. 
mnist_train = dsets.MNIST(root = MNIST_data/., train=True, transform=transforms.ToTensor(), download=True)
mnist_test = dsets.MNIST(root = MNIST_data/., train=False, transform=transforms.ToTensor(), download=True)


#다운로드한 데이터를 data_loader 통해 가져옵니다
data_loader = torch.utils.data.DataLoader(dataset=mnist_train, batch_size=batch_size, shuffle = True, drop_last=True)
#필요한 라이브러리를 가져옵니다.
import numpy as np
from sklearn.model_selection import train_test_split

#아래 보이는 것이 임의로 만들어낸 각 (20,4) 와 (20, 1)의 shape을 가진 데이터셋입니다.
x_data = np.array([
    [2, 1, 4, 2],
    [3, 2, 15, 1],
    [3, 4, 7, 11],
    [5, 15, 8, 5],
    [7, 5, 2, 9],
    [2, 5, 1, 8],
    [8, 9, 3, 6],
    [9, 10, 6, 8],
    [6, 12, 13, 1],
    [9, 2, 18, 32],
    [6, 10, 12, 2],
    [2, 4, 7, 15],
    [15, 6, 2, 7],
    [16, 2, 6, 1],
    [10, 8, 2, 6],
    [13, 12, 11, 2],
    [5, 9, 1, 12],
    [16, 18, 3, 15],
    [12, 1, 8, 3],
    [6, 2, 9, 16]
])
y_data = np.array([3, 5, 7, 10, 12, 7, 13, 13, 12, 13, 12, 6, 13, 6, 6, 2, 17, 12, 2, 9])

#scikit-learn 라이브러리에서 제공하는 train_test_split 함수를 이용하여 데이터를 분할합니다. 
#parameter test_size는 전체 테이터셋에서 test set가 차지하는 비율을, 
#shuffle은 데이터를 무작위로 섞을것인지, 그리고 random_state는 
#데이터를 무작위로 섞을때 reproducibility를 위한 난수의 초기값을 설정해 줍니다.  
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.2, shuffle=True, random_state=777) 

#train set 을 한번 더 나누어서 validation set 또한 만들어 낼 수 있습니다. 
x_train, x_val, y_train, y_val = train_test_split(x_train, y_train, test_size=0.25, shuffle=True, random_state=777)

#최종적으로 분할된 각 test, validation, test set 을 모두 출력해 보겠습니다. 
print("x_train:", x_train)
print("y_train:", y_train)
print("x_val:", x_val)
print("y_val:", y_val)
print("x_test:", x_test)
print("y_test:", y_test)

x_train: [[ 5 15 8 5] [16 18 3 15] [ 8 9 3 6] [13 12 11 2] [ 7 5 2 9] [ 3 4 7 11] [ 6 2 9 16] [ 2 1 4 2] [ 9 10 6 8] [ 6 12 13 1] [16 2 6 1] [ 6 10 12 2]]

y_train: [10 12 13 2 12 7 9 3 13 12 6 12]

x_val: [[ 5 9 1 12] [ 9 2 18 32] [12 1 8 3] [ 2 5 1 8]]

y_val: [17 13 2 7]

x_test: [[10 8 2 6] [15 6 2 7] [ 2 4 7 15] [ 3 2 15 1]]

y_test: [ 6 13 6 5]

정리

이번 포스팅을 통해 우리는 dataset splitting이 무엇이고, 그 중요성에 대해 알아보았습니다. Train, validation, 그리고 test set 각각의 역할과 차이점에 대해 이야기 하고, 기존의 데이터셋을 분할하던 방식과 최근의 트렌드, 그리고 우리가 dataset splitting을 할때에 고려해야할 다양한 요소들에 대해 설명드리면서 간단한 코드 예시까지 보여드렸습니다. 설명드린 내용 외에도 딥러닝 모델을 개발할때에 우리가 데이터를 어떻게 다루고 사용 할 것인지는 매우 중요한 부분이기 때문에, 추후에 다른 분할방식이나 각 데이터셋들의 특성들에 대하여 공부하시면 좋겠습니다.

Reference

comments powered by Disqus
rss facebook twitter github youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora