RL Researcher

train_test_split()을 활용해 학습과 테스트 세트 분리 본문

Machine-Learning/Scikit-Learn

train_test_split()을 활용해 학습과 테스트 세트 분리

Lass_os 2020. 12. 28. 18:18

1. train_test_split


모든 기계학습(Machine Learning,Deep Learning, Reinforcement Learning)에서는 학습 데이터(train data)와 테스트 데이터(test data)의 분리가 중요합니다. 학습데이터와 테스트 데이터의 분리가 적절하게 이루지지 않은 경우에는 과적합(overfitting)이 발생하기 때문입니다. 코드를 통해서 실습해보도록 하겠습니다.

 

먼저 테스트 데이터 세트를 이용하지 않고 학습 데이터 세트로만 학습하고 예측하게 되면 어떤 문제가 발생하는지 알아보겠습니다.

# 다양한 모듈 import
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

# iris 데이터 불러오기
iris = load_iris()

# 객체 생성
clf = DecisionTreeClassifier()

# 모델 학습
clf.fit(iris.data,iris.target)

# 학습 데이터 세트로 예측 수행
pred = clf.predict(iris.data)

# 예측 정확도 출력
print('예측 정확도:',accuracy_score(iris.target,pred))

========================================================================

<output>
예측 정확도: 1.0

예측 정확도가 100%가 나왔습니다. 이유는 이미 학습한 데이터세트를 기반으로 예측했기 때문입니다.( 모의고사를 한번 보고 답을 알고 있는 상태에서 모의고사 문제와 똑같은 본고사 문제가 출제되었기 때문입니다.)

 

예측을 수행하는 데이터 세트는 학습을 수행한 학습용 데이터 세트가 아닌 전용의 테스트 데이터 세트여야 합니다. 이 문제는 사이킷런(scikit-learn)의 train_test_split()을 통해 원본 데이터 세트에서 학습 및 테스트 데이터 세트를 쉽게 분리할 수 있습니다.

 

테스트 데이터를 전체의 30%로 학습 데이터 세트를 70 %로 분리하겠습니다.

# 다양한 모듈 import
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

# iris 데이터 불러오기
iris = load_iris()

# train, test 데이터 분리
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size = 0.3,random_state=111)

# 객체 생성
clf2 = DecisionTreeClassifier()

# 모델 학습
clf2.fit(x_train,y_train)

# 분리한 테스트 데이터로 예측 수행
pred2 = clf2.predict(x_test)

# 예측 정확도 출력
print('예측 정확도:',accuracy_score(y_test,pred2))

========================================================================

<output>
예측 정확도: 0.9333333333333333

테스트 데이터로 예측을 수행한 결과 정확도가 93%정도 됩니다. 붓꽃 데이터 자체가 150개 밖에 되지 않아, 30% 를 테스트 데이터 사용하여 성능을 판단하기 적절하지는 않습니다. 하지만, train data와 test data를 분리했을 경우 1번째의 결과에 비해 신뢰성을 주고 있습니다.

  • test_size : 전체 데이터에서 테스트 데이터 세트 크기를 얼마로 샘플링할 것인가를 결정합니다. Default값은 0.25, 즉 25%입니다.

  • train_size : 전체 데이터에서 학습용 데이터 세트 크기를 얼마로 샘플링할 것인가를 결정합니다. test_size parameter를 통상적으로 사용하기 때문에 train_size는 잘 사용되지 않습니다.

  • shuffle : 데이터를 분리하기 전에 데이터를 미리 섞을지를 결정합니다. Default는 True입니다. 데이터를 분산시켜서 좀 더 효율적인 학습 및 테스트 데이터 세트를 만드는데 사용됩니다.

  • random_state : random_state는 호출할 때마다 동일한 학습/테스트용 데이터 세트를 생성하기 위해 주어지는 난수 값입니다. train_test_split()은 호출 시 무작위로 데이터를 분리하므로 random_state를 지정하지 않으면 수행할 때마다 다른 학습/테스트 용 데이터를 생성합니다.

Comments