반응형

머신러닝 / 딥러닝 모델을 학습시키기 위해서는 데이터셋이 필요하다.
이 데이터셋은 어떻게 구성하고 활용할까?

sickit-learn의 model_selection 패키지 안에는 학습세트와 테스트세트를 분리할 수 있는 모듈이 있다.
 train_test_split 모듈에 대해서 알아볼 것이다.

train, validation, test 데이터셋

머신러닝, 딥러닝 모델을 피팅시키기 위해서는 데이터셋을 크게 세 가지로 분리한다.

  • training set(학습 데이터셋) : 모델의 학습을 위해 사용되는 데이터
  • validation set(검증 데이터셋) : 모델의 학습 과정에서 성능을 확인하고, 하이퍼 파라미터를 튜닝하는데 사용된다. 여러가지 하이퍼 파라미터로 생성된 모델들 중에 어떤 것이 성능이 좋은지 평가한다.
  • test set(테스트 데이터셋) : 생성된 모델의 예측성능을 평가하는데 사용된다. 

train / test 를 분리하는 이유는 뭘까?

우선, train / test를 분리하는 목적을 정확히 아는 것이 중요하다.
주어진 전체 데이터를 바로 다 모델에 학습시키지 않고, 데이터셋을 분할해서 학습시키는 이유는 Overfitting(과적합)을 방지하기 위해서이다. 실제로 모델을 활용하기 위해서는 학습에 사용되지 않은 데이터에 대한 예측을 잘 해야한다.
만약, 주어진 데이터에만 치중하여 학습할 경우, 조금이라도 다른 패턴을 가진 데이터에 대해서는 모델의 성능이 떨어진다. 때문에, validation data set을 활용하여 학습 중인 모델이 Overfitting 되었는지 확인하여, 학습을 조기에 종료(early stopping)하고, 하이퍼 파라미터를 튜닝하는 등의 조치를 취한다. 
해당 과정을 통해 모델피팅을 한 후, test data set에 대한 예측을 수행하여, 모델의 성능이 잘 나오는지 확인한다.

Overfitting을 방지하는 것은 전체적인 모델 성능을 따져 보았을 때 매우 중요한 프로세스 중 하나이다.

위의 그림을 보면, train data set의 오차율은 계속 하락하고 있으나, iteration이 750을 넘어가는 순간부터  validation(test) data set의 오차율은 점점 증가하는 것을 확인 할 수 있다.

머신러닝 모델의 하이퍼파라미터 튜닝시에 특히 n_estimators  (나무의 갯수)값은 validation 셋의 오차율을 점검해 나가면서 튜닝을 진행해야 하며, 딥러닝 모델도 마찬가지로 validation_data   을 지정해 줌으로써 epoch마다 validation의 오차율을 확인하면서 overfitting을 방지해야 좋은 성능의 모델을 만들 수 있다.




train_test_split 모듈을 활용한 train/test 세트 분리

# 예제 데이터셋 불러오기
from sklearn.datasets import load_iris
dataset = load_iris()
data = dataset['data'] # 데이터 전체(레이블제외)
label = dataset['target'] # 레이블 데이터
print('원 데이터셋의 shape: ',data.shape)
print('레이블 데이터셋의 shape: 'label.shape)

# train_test_split 함수 불러오기
from sklearn.model_selection import train_test_split

# 데이터셋 나누기
X_train, X_test, y_train, y_test = train_test_split(data, 
                                                    label, 
                                                    test_size = 0.25, 
                                                    shuffle = True, 
                                                    random_state = 21)

# 나누어진 데이터셋 확인
print('학습셋의 shape: ', X_train.shape)
print('검증셋의 shape: ', X_test.shape)
print('학습셋 label의 shape: ', y_train.shape)
print('검증셋 label의 shape: ', y_test.shape)

train_test_split( ) 함수의 파라미터

  • test_size : 전체 데이터셋에서 테스트 데이터셋 크기를 얼마로 샘플링할 것인지 결정한다.
     0.25는 전체 데이터 셋의 25%를 test (validation) 셋으로 지정하겠다는 의미다.(default : 0.25)
  • train_size : 전체 데이터셋에서 학습 데이터셋 크기를 얼마로 샘플링할 것인지 결정한다. 다만 test_size를 주로 활용하기 때문에, 잘 쓰이지는 않는다.
  • shuffle : 데이터를 분리하기 전에 데이터를 섞을지 결정하는 파라미터다. 데이터를 분산시켜 보다 효율적인 학습/테스트 데이터 세트를 만드는데 사용한다.(default: True)
  • stratify: default=None 이다. classification을 다룰 때 매우 중요한 옵션값이다. stratify 값을 target으로 지정해주면 각각의 class 비율(ratio)을 train / validation에 유지해 준다. (한 쪽에 쏠려서 분배되는 것을 방지한다) 만약 이 옵션을 지정해 주지 않고 classification 문제를 다룬다면, 성능의 차이가 많이 날 수 있다.
  • random_state : 난수값을 지정하면 여러 번 다시 수행해도 동일한 결과가 나오게 해준다.

train_test_split의 반환 값은 튜플형태로 (1) 학습 데이터셋, (2) 테스트 데이터셋, (3) 학습 데이터셋의 레이블, (4) 테스트 데이터셋 의 순서로 되어있다.

# 출력:
원 데이터셋의 shape: (150, 4)
레이블 데이터셋의 shape: (150)
학습셋의 shape: (112, 4)
검증셋의 shape: (38, 4)
학습셋 label의 shape: (112,)
검증셋 label의 shape: (38,)

관련된 예제 수행한 코드는 아래 링크를 참고
https://github.com/mgkim-developer/30-Days-of-ML-with-Kaggle/blob/main/30-days-of-ml-day-9-model-validation.ipynb

 

GitHub - mgkim-developer/30-Days-of-ML-with-Kaggle: 30 Days of ML with Kaggle

30 Days of ML with Kaggle. Contribute to mgkim-developer/30-Days-of-ML-with-Kaggle development by creating an account on GitHub.

github.com

 

반응형

'AI > 머신러닝과 딥러닝' 카테고리의 다른 글

Predict modeling process  (0) 2021.09.03
컴퓨터 비전 (Computer Vision with Data-Centric)  (0) 2021.08.06