Train, Validation, Test Set
우리는 모델을 개발할때, 범용적으로 사용할 수 있는 모델을 만들려고 한다. Unseen data에 대하여 예측 또는 분류를 하는 것이 목표이기 때문이다. 여기서 unseen data란, 우리의 모델이 처음 보는 데이터셋, 또는 학습해 보지 않은 데이터를 말한다. 모델이 실제로 적용되었을때는 처음보는 데이터에 대하여 예측 또는 분류를 할 것이기 때문에, 그만큼 모델의 unseen data에 대한 성능이 좋아야 한다는 것을 우리는 알 수 있다.
따라서 dataset을 나누지 않고 전부 학습에 사용한다면 해당 dataset에 대해서만 성능이 좋은 모델을 만들게 될 것이고, 개발한 모델에 대한 성능을 점검할 수 없을 뿐만 아니라 실제로 모델이 적용되었을 때 좋은 성능을 기대하지 못할 것이다.
따라서 dataset을 어떻게 나누고 사용하는지가 매우 중요하다. 가장 기본적인 분할법은 전체 dataset을 80%는 train set과 20%는 test set으로 나누는 것이다. 이는 train set을 이용해 모델을 학습시키고, test set을 이용해 모델의 성능을 평가하기 위함이다.
하지만 단순히 train set과 test set으로만 나누게 된다면 모델의 성능 검정을 한번 밖에 할 수 없고, test set에 대한 결과를 토대로 모델을 수정하게 되면 overfitting이 발생할 가능성이 높아진다.
따라서 train set을 다시 train set과 validation set으로 나눈다. 아래와 같이 대다수는 전체 데이터셋을 train, validation, test set을 각 6:2:2 비율로 나누어 사용한다.
Train Set:
- Train set은 온전히 모델의 학습만을 위해서 사용된다. Train set을 통해 모델을 학습시키고, parameter나 feature등을 수정해서 모델의 성능을 높이는 작업을 거칠때 사용된다.
Validation Set:
- Validation set과 test set은 모델의 학습에 직접적으로 관여하지 않는다는 점에서 공통점을 가지고 있지만, validation set은 학습이 끝난 모델에 적용시켜 test set을 이용한 모델의 평가로 넘어가기 이전에 최종적으로 모델을 fine tuning하는데에 사용한다. 학습이 완료된 모델이라고 하더라도 epoch을 몇 번 돌릴 것인지, 또는 learning rate의 설정은 어떻게 할 것인지 등에 따라 모델의 성능이 달라질 수 있기 때문에, 우리는 validation set을 통해 우리가 만든 모델이 test set에서, 그리고 실제로 배포되었을 때 높은 성능을 낼 수 있도록 만들어 주는 것이다.
Test Set:
- Test set은 최종적으로 우리가 만든 모델의 성능을 평가하기 위한 데이터셋이기 때문에 모델의 학습에는 전혀 사용되지 않는다. Test set을 통해 우리의 모델이 배포된 이후에 실사용 되었을 때 모델이 얼마나 좋은 성능을 발휘할 수 있을지 알아보는 것이다. 앞서 이야기 했듯이, 모델이 실상에 사용되었을 때도 성공적이기 위해서는 unseen data에 대해 좋은 성능을 발휘하는 것이 매우 중요한데, test set이 unseen data의 역할을 해주어 우리가 만든 모델의 성능을 효과적으로 평가할 수 있도록 도와주는 것이다.
train / test 분리
train_test_split 함수를 통해 한 줄로 분리할 수 있다.
패키지는 sklearn.model_selection에 있다.
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)
옵션 값 설명
- test_size: 테스트 셋 구성의 비율을 나타낸다. train_size의 옵션과 반대 관계에 있는 옵션 값이며, 주로 test_size를 지정해준다. 0.2는 전체 데이터 셋의 20%를 test (validation) 셋으로 지정하겠다는 의미입니다. default 값은 0.25
- shuffle: default=True. split을 해주기 이전에 섞을건지 여부이다. 보통은 default 값으로 놔둔다.
- stratify: default=None. classification을 다룰 때 매우 중요한 옵션값이다. stratify 값을 target으로 지정해주면 각각의 class 비율(ratio)을 train / validation에 유지해 준다. (한 쪽에 쏠려서 분배되는 것을 방지) 만약 이 옵션을 지정해 주지 않고 classification 문제를 다룬다면, 성능의 차이가 많이 날 수 있다.
- random_state: 세트를 섞을 때 해당 int 값을 보고 섞으며, 하이퍼 파라미터를 튜닝시 이 값을 고정해두고 튜닝해야 매번 데이터셋이 변경되는 것을 방지할 수 있다.
참조
https://pozalabs.github.io/Dataset_Splitting/
Train, Validation, and Test Set
Dataset Splitting summary
pozalabs.github.io
https://teddylee777.github.io/scikit-learn/train-test-split/
train_test_split 모듈을 활용하여 학습과 테스트 세트 분리
train_test_split 모듈을 활용하여 학습과 테스트 세트 분리하는 방법에 대하여 알아보겠습니다.
teddylee777.github.io
'데이터 분석' 카테고리의 다른 글
분류 모델 성능 평가 지표 (Confusion Matrix) (0) | 2024.04.02 |
---|---|
박스플롯 (Boxplot) 이란 ? (0) | 2024.03.20 |
[데이터 분석] LabelEncoding, fillna, inplace 옵션 (1) | 2024.03.13 |
[데이터 분석] 데이터 시각화 Seaborn 라이브러리 (0) | 2024.03.10 |
[데이터 분석] 영화 관객수 예측 (0) | 2024.03.07 |