2 분 소요

train_test_split(): train data / test data


안녕하세요. 데이터 사이언티스트를 위한 정보를 공유하고 있습니다.

M1 Macbook Air를 사용하고 있으며, 블로그의 모든 글은 Mac을 기준으로 작성된 점 참고해주세요.


train_test_split() - 학습/테스트 데이터 세트 분리

데이터 세트를 학습(train) 데이터 세트와 테스트(test) 데이터 세트로 분리하는 이유는 간단합니다.

머신러닝에서는 학습 데이터로 모델을 학습시키고,

모델의 성능을 평가하기 위해서 테스트 데이터로 테스트를 진행합니다.

이 과정에서 학습 데이터와 테스트 데이터는 중복없이 완벽히 분리가 돼야 합니다.

그 이유에 대해서 학습 데이터는 문제집, 테스트 데이터는 수능 시험이라고 비유하여 설명하겠습니다.

어떤 학생이 문제집에 있는 문제를 완벽하게 공부하였다고 가정해 봅시다.

그런데 문제집의 문제가 수능 시험에 그대로 출제 된다면, 학생은 실수가 없다면 시험에서 만점을 받게 될 것 입니다.

과연 학생의 실력을 잘 평가했다고 볼 수 있을까요?

다시 모델의 관점에서 바라보면,

학습 데이터를 학습한 모델의 실제 성능을 평가하기 위해서

다시 학습 데이터로 모델을 평가를 하는 것은 테스트의 의미가 없어지게 되는 것입니다.

따라서 모델의 실제 데이터에 대한 응용력, 즉 성능을 판단하기 위해서는 학습 데이터와는 전혀 다른 새로운 데이터 세트가 필요한 것입니다.


학습 데이터 세트와 테스트 데이터 세트를 분리하는 데 도움을 주는 유용한 메소드가 있습니다.

바로 model_selection이라는 모듈에 있는 train_test_split()입니다.

train_test_split()이 어떻게 쓰이는지 먼저 붓꽃 데이터 세트로 예시를 보여드리겠습니다.

In:

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

dt = DecisionTreeClassifier()
# Decision Tree 분류기를 dt라는 이름으로 생성
iris_data = load_iris()
# 붓꽃 데이터 가져오기

X_train, X_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target,
                                                    test_size = 0.2, random_state = 1)
# 전체 데이터의 20%를 테스트 데이터 세트로 분리
# 피처 데이터와 레이블 데이터가 각각 훈련, 테스트 데이터 세트로 분리되어 총 4개의 데이터 세트가 만들어지고,
# X_train, X_test, y_train, y_test 이름으로 저장

In:

dt.fit(X_train, y_train)
# dt 모델이 훈련 데이터를 학습하도록 함
y_pred = dt.predict(X_test)
# 학습된 dt 모델이 피처 테스트 데이터를 가지고 결과를 예측하도록 함
print(f"예측 정확도: {accuracy_score(y_test, y_pred):.4f}")
# 피처에 대한 실제 레이블 테스트 데이터와 모델이 예측한 결과를 비교하여 정확도를 산출

Out:

예측 정확도: 0.9667

위의 예시에서 전체 데이터의 20% 비율의 데이터 세트를 테스트 데이터 세트로 지정하였고,

간단히 결정 트리(Decision Tree) 분류 모델을 통해 예측 정확도까지 산출해 보았습니다.

약 96.67%의 예측 정확도를 확인할 수 있었습니다.

물론 사이킷런의 샘플 데이터 세트는 규모가 작아서 모델의 성능에 대한 신뢰도가 높지는 않습니다.

추후에 모델이나 성능 평가 방법에 대해서는 따로 포스팅 하도록 하겠습니다.


train_test_split()의 주요 파라미터에 대해 좀 더 자세히 알아보겠습니다.

데이터 세트를 나누는 메소드이기 때문에 필수적으로

첫 번째 파라미터로는 피처 데이터 세트, 두 번째 파라미터로는 레이블 데이터 세트가 입력되어야 합니다.

(피처는 특정 레이블이 갖고 있는 특성을 의미하고, 레이블은 분류 결과값을 의미합니다.

예를 들어 붓꽃 데이터의 경우에 꽃잎의 길이, 꽃잎의 너비, 꽃받침의 길이, 꽃받침의 너비 정보는 피처이고,

setosa인지, versicolor인지, virginica인지 꽃의 품종에 대해 숫자로 나타낸 것이 레이블입니다.)

다른 파라미터는 선택적으로 입력하면 됩니다.

test_size: 전체 데이터에서 테스트 데이터 세트의 비율을 어떻게 샘플링할지 결정합니다. default는 0.25입니다.

train_size: test_size처럼 훈련 데이터 세트의 비율을 결정하는데 test_size가 결정되면 자동으로 분리가 되기 때문에 일반적으로 잘 사용되지는 않습니다.

shuffle: 데이터를 분리하기 전에 데이터를 섞을지 결정합니다. default는 true입니다. 전체 데이터를 훈련 데이터 세트와 테스트 데이터 세트에 적절히 분산시키기 위해 일반적으로는 셔플을 사용하는 편입니다.

random_state: 해당 메소드를 호출할 때마다 훈련 데이터 세트와 테스트 데이터 세트를 동일하게 분리하기 위해 사용됩니다. 지정되지 않으면 호출할 때마다 각 데이터 세트의 구성이 달라집니다. 지정되는 숫자는 특별한 의미가 없으며 랜덤한 숫자로 지정해주면 됩니다.

이렇게 파라미터를 설정하여 train_test_split()을 호출하면,

피처 학습 데이터 세트, 피처 테스트 데이터 세트, 레이블 학습 데이터 세트, 레이블 테스트 데이터 세트가 순서대로 반환됩니다.


읽어주셔서 감사합니다.

정보 공유의 목적으로 만들어진 블로그입니다.

미흡한 점은 언제든 댓글로 지적해주시면 감사하겠습니다.


업데이트:

댓글남기기