본문 바로가기
Python Library/Scikit-Learn

[Scikit-Learn] train_test_split 모듈을 활용하여 학습과 테스트 세트 분리

by goatlab 2021. 12. 20.
728x90
반응형
SMALL

train_test_split 모듈

 

scikit-learn의 model_selection 패키지 안에 train_test_split 모듈을 활용하여 손쉽게 학습 데이터 셋 (train set)과 테스트 셋 (test set)을 분리할 수 있다.

 

train / test 은 train / validation 으로 볼 수 있다.  ML 모델에 train 데이터를 100% 학습시킨 후 test 데이터에 모델을 적용했을 때 성능이 잘 안 나오는 경우가 있다. 이것을 보통 과적합 (overfitting)되었다라고 한다. 즉, 모델이 가진 학습 데이터에 overfitting되도록 학습하면 이를 조금이라도 벗어난 케이스에 대해서는 예측율이 현저히 떨어진다. 그렇기 때문에 overfitting을 방지하는 것은 전체적인 모델 성능을 따져보았을 때 매우 중요한 프로세스 중 하나이다.

 

기존 train / test로 구분 되어 있었던 데이터 set을 train에서 train / validation으로 일정 비율 쪼갠 다음에 학습 시에는 train set으로 학습 후 중간중간 validation set으로 내가 학습한 모델 평가를 해주는 것이다. 모델이 overfitting되었다면, validation set으로 검증시 예측율이나 오차율이 떨어지는 현상을 확인할 수 있으며, 이런 현상이 나타나면 학습을 종료한다.

 

ML 모델의 하이퍼파라미터 튜닝 시 validation set의 오차율을 점검해 나가면서 튜닝을 진행해야 하며, 딥러닝 모델도 마찬가지로 validation_data를 지정해 줌으로써 매 epoch 마다 validation의 오차율을 확인하면서 overfitting을 방지해야 좋은 성능의 모델을 만들 수 있다. 검증 방법에는 K-Fold 교차 검증 방식이 많이 이용되고 있다.

 

패키지는 sklearn.model_selection에 있다.

 

from sklearn.datasets import load_xx # xx sample data loading
from sklearn.model_selection import train_test_split

# load sample
dataset = load_xx()

x = dataset['data']
y = dataset['label']

# train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, shuffle=True, stratify=None, random_state=34)
 test_size: 테스트 set 구성의 비율을 나타낸다. train_size와 반대 관계에 있는 옵션 값이며, 주로 test_size를 지정해 준다. 0.2는 전체 데이터 set의 20%를 test (validation) set으로 지정하겠다는 의미. default 값은 0.25

◦ shuffle: default=True, split을 해주기 전에 섞을건지 여부. 보통은 default 값


◦ stratify: default=None. classification을 다룰 때 매우 중요한 옵션값. stratify 값을 target으로 지정해주면 각각의 class 비율(ratio)을 train / validation에 유지해 준다. (한 쪽에 쏠려서 분배되는 것을 방지) 이 옵션을 지정해 주지 않고 classification 한다면 성능의 차이가 많이 날 수 있다.


◦ random_state: set를 shuffle할 때 int 값만큼 섞으며, 하이퍼파라미터를 튜닝시 이 값을 고정해두면 매번 데이터 set이 바뀌는 것을 방지

 

예제

 

import numpy as np
from sklearn.model_selection import train_test_split

X, y = np.arange(10).reshape((5, 2)), range(5)
X
array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7],
       [8, 9]])
list(y)
[0, 1, 2, 3, 4]
X_train, X_test, y_train, y_test = train_test_split(
     X, y, test_size=0.33, random_state=42)

X_train
array([[4, 5],
       [0, 1],
       [6, 7]])
y_train
[2, 0, 3]
X_test
array([[2, 3],
       [8, 9]])
y_test
[1, 4]
# list split
train_set, valid_set = train_test_split(train_set, test_size=0.2, shuffle=True)

 

 

 

 

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

 

sklearn.model_selection.train_test_split

Examples using sklearn.model_selection.train_test_split: Release Highlights for scikit-learn 0.24 Release Highlights for scikit-learn 0.24 Release Highlights for scikit-learn 0.23 Release Highlight...

scikit-learn.org

 

728x90
반응형
LIST

'Python Library > Scikit-Learn' 카테고리의 다른 글

[Scikit-Learn] HistGradientBoostingClassifier  (0) 2023.07.05
사이킷런 (Scikit-Learn)  (0) 2021.12.20