[ML/DL] Train/Test/Valid Dataset

하나·2022년 3월 23일
0

ML/DL

목록 보기
1/9
post-thumbnail

모델을 학습 시킬 때 사용할 데이터는 train/test/valid(혹은 Dev) 으로 분리해서 학습에 사용된다. 이렇게 분리하는 이유와 각 데이터 셋의 용도와 데이터를 분리할 때 사용할 수 있는 모듈들을 알아보자~

간단히 말해,
1. train data 는 모델을 학습할 때 쓰이는 데이터셋
2. validation data 는 학습된 모델이 잘 학습이 되었는지, 오버피팅은 없는지 확인하는데에 쓰이는 데이터셋
3. test data 는 모델이 학습이 끝난 뒤 마지막에 모델의 성능을 평가하기 위해 사용하는 데이터셋
이라고 말할 수 있겠다.

즉, validation (혹은 develop 이라고도 불린다) data set은 training 과정에서 참조할 수 있지만 test data set은 학습과정과는 무관한 성능을 평가하는데에만 사용되는 데이터이다.

그러나 validation data set이 훈련 과정 중 가중치를 결정하는데에 이용되는 것은 아니다 validation data set은 오직 training 중 발생하는 오버피팅을 방지하기 위해, 언제 학습을 멈출지 판단하기 위해 이용된다.

(추가) sklearn 이나 pytorch 같은 머신러닝 라이브러리에서는 데이터를 split 해주는 기능을 제공해줘서 우리는 간단하게 데이터셋을 원하는 비율로 나눌 수 있다.

  • sklearn의 ShuffleSplit 과 torch.utils.data의 subset 사용해서 데이터 나누기

from torch.utils.data import Subset
Subset 함수를 이용하여 데이터셋을 생성하면, 부모set이 업데이트 됬을 때, subset도 함께 업데이트 된다.

# split the data into two groups
# trian 0.8, test 0.2
from sklearn.model_selection import ShuffleSplit
sss = ShuffleSplit(n_splits=1, test_size=0.2, random_state=0)
indices = range(len(fetal_ds1))

for train_index, val_index in sss.split(indices):
   print(len(train_index))
   print('-'*10)
   print(len(val_index))
# creat train_ds and val_ds
from torch.utils.data import Subset

train_ds = Subset(fetal_ds1, train_index)
print(len(train_ds))
val_ds = Subset(fetal_ds2, val_index)
print(len(val_ds))
  • sklearn 에서 데이터 나누기
    train_test_split 모듈 이용
from sklearn.datasets import load_iris # 샘플 데이터 로딩
from sklearn.model_selection import train_test_split

# load sample
dataset = load_iris()

data = dataset['data']
target = dataset['target']

# train_test_split
x_train, x_valid, y_train, y_valid = train_test_split(data, target, test_size=0.2, shuffle=True, stratify=target, random_state=34)

참고 : https://teddylee777.github.io/scikit-learn/train-test-split, https://deep-learning-study.tistory.com/676

0개의 댓글