카테고리 없음

sklearn dataset, validation Method

$choice 2021. 5. 21. 17:34

모델을 학습한 후 중요한 것은 일반화 성능입니다. 그 중 일반화 성능 올릴 가능성이 있는 방법은 Cross-validation 방법입니다.

 

모델 학습에 있어서 중요한 것은 데이터 입니다. 어떠한 데이터 A가 있을 때, 여러 모델을 이용하여 데이터 A를 학습시킨다고 가정하였을 때, 물론 해당 모델이 훈련을 잘 하는 것도 있겠지만 데이터의 양이나 질에 따라 모델의 성능이 달라질 수 있습니다.

 

우선 sklearn에서는 dataset을 분할할 수 있는 코드가 제공됩니다.

(데이터 분할하는 코드를 테스트해보기 위해 sklearn 패키지의 Iris(꽃) 데이터 셋을 이용하였습니다.)

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn import svm

X, y = datasets.load_iris(return_X_y=True)
print(" X.shape", X.shape, "\n", "y.shape", y.shape)

 

sklearn에서의 train_test_split은 정말 간단하게 학습 세트를 분리할 수 있습니다.

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.4, random_state=0, stratify=y)

print(" X_train.shape", X_train.shape, "y_train.shape", y_train.shape)

print(" X_test.shape", X_test.shape, "y_test.shape", y_test.shape)

## train_test_split Parameter
## train_test_split(arrays, test_size, train_size, random_state, shuffle, stratify)

# arrays : 입력 데이터
# test_size : 테스트 데이터 셋 비율
# train_size : 기본값 : (1 - test_size)
# random_state : 분할시 셔플이 이루어지는 시드 값
# shuffle : 셔플 여부
# stratify : Data의 비율을 나타내는데, Label의 비율을 유지한채 분할 할지 여부

## Train / Validation / Test 로 분리하기 위한 코드

# X_train, X_test, y_train, y_test = train_test_split(
#     X, y, test_size=0.4, random_state=0)
#    
# X_valid, X_test, y_valid, y_test = train_test_split(
#     X_test, y_test, test_size=0.5, random_state=0)

 

학습과 테스트를 수행할 때, 아래 그림과 같이 데이터를 분할할 수도 있지만

다음과 같이 데이터를 분리할 수 있습니다.

이렇게 데이터를 나누는 이유는 모델의 성능을 평가하기 위해서 입니다. Training에서 학습된 모델이 잘 예측하는지 평가하기 위해 사용하는데, 다음의 장점이 있습니다.

 

먼저 Test Accuracy를 어느정도 예측해볼 수 있다는 것입니다. 즉 Test Data에 대해 좋은 성능을 내는 것이 목표이기 때문에 해당 Training Data에서 학습한 모델이 학습하지 못한 데이터에 대해 얼마나 잘 작동하는지에 대해서 확인이 필요합니다. Test Data를 사용하여 성능을 평가하는 것은 잘못된 방법이기 때문에 따로 Validation Data를 만들어서 확인을 합니다.

 

다음으로는 모델의 성능을 높일 수 있습니다. 분할된 Training Data가 학습이 잘 되지 않는 데이터의 구성되어 있을 수 있습니다.

예를 들면 NLP Task에서 어떤 문장의 입력들이 "나는 슬프다", "나는 행복하다" 등의 입력데이터로 구성되어 있을 수 있습니다. 분할된 데이터가 "나는 슬프다.", "오늘은 좋은 일이 있어서 행복하다."와 같이 해당 표현을 다양하게 할 수 있는 데이터로 구성되어 있을 수도 있습니다. 따라서 학습이 잘 될 수 있는 데이터의 구성을 찾을 수 있고 Overfitting을 방지할 수 있습니다.

 

구체적으로는 다음과 같이 진행됩니다.

  1. 주어진 Data을 Train, Validation, Test들로 나눕니다.
  2. Train Data을 이용하여 모델을 학습합니다.
  3. Validation Data을 이용해 모델의 정확도 및 Validation Data에 대한 Loss를 계산합니다.
  4. Validation Loss가 증가했다면 학습을 종료하고, 아니면 학습을 계속 진행합니다.
  5. 마지막으로 Test Data을 이용해 최종 모델을 평가합니다.

 

이 과정에서 현재의 모델이 Validation Data에 대해 얼마나 잘 작동하는지를 평가하고, 이것을 이용해 Overfitting을 방지하게됩니다.

반응형