본문 바로가기
개발/Python&머신러닝

Train(학습), Validation(검증), Test(테스트) 데이터, train_test_split

by kamyiho 2021. 3. 6.
728x90
전체 데이터를 학습에 전부 사용하지 않고 나누어 사용하는 이유

- 학습 데이터를 사용해 생성한 모델의 정확도를 검증하기 위해
- 학습한 모델의 성능이 좋고 나쁨을 판단하기 어려움
- 전체 데이터를 사용했을 때 과적합의 문제가 발생할 수 있음
=> 그렇기에 train 데이터와 test 데이터를 분류해서 학습 데이터로 모델을 생성하고, 테스트 데이터로 모델을 평가함

 

 

train_test_split를 사용한 train/test 데이터셋 분리
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# iris 데이터 laod
X, y = load_iris(return_X_y=True)

# X: 입력 데이터
# y: Target 데이터
# test_size: 전체 데이터 중 테스트 데이터의 크기
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

머신러닝 문제에서 train 데이터와 test 데이터를 분리할 때, test 데이터는 완전히 새롭게 경험할 데이터여야 한다. 

그렇지 않고 학습 과정에서 test 데이터에 대한 정보가 들어갈 경우, 모델의 일반화 성능을 측정하기 위하여 진행하는 test 단계의 의미가 무색된다.

 

또한, "train 데이터와 test 데이터" 2가지로 존재할 때 동일한 데이터셋에 대해서 계속 학습을 진행하다 보면,

test 데이터의 성능을 올리는 방향으로 모델이 과적합(Overfitting) 되기 쉽다.
모델의 과적합을 막기 위해서, test 데이터로 평가하기 이전에 평가를 하는 것으로 학습의 성능을 향상시켜야 하며, 이때 사용되는 것이 validation 데이터이다.

 

train_test_split를 사용한 train/validation/test 데이터셋 분리
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# iris 데이터 load
X, y = load_iris(return_X_y=True)


# 먼저, train과 test 데이터를 8:2 비율로 나눠준다.
# 다음, 분리된 train 데이터를 다시 train과 validation 데이터로 나눠준다.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.25)

 

위처럼 train_test_split 함수를 통해 분리하거나, 직접 범위를 지정해 데이터셋을 분리할 수 있다.

 

또한, 딥러닝에서는 model.fit() 에 validation_split 파라미터를 지정해 학습할 수 있다.

반응형

댓글