샘플은 1, 2, 3 세 개의 클래스 중 하나에 속해 있습니다. 이탈리아의 동일 지역에서 자랐지만 세 종류의 다른 와인 포도 품종을 의미합니다. 자세한 내용은 데이터셋 설명을 참고하세요(https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.names).
사이킷런의 model_selection 모듈에 있는 train_test_split 함수를 사용하면 가장 간편하게 데이터셋을 랜덤한 훈련 데이터셋과 테스트 데이터셋으로 나눌 수 있습니다.
>>> from sklearn.model_selection import train_test_split
>>> X, y = df_wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values
>>> X_train, X_test, y_train, y_test =\
... train_test_split(X, y,
... test_size=0.3,
... random_state=0,
... stratify=y)
먼저 인덱스 1에서 인덱스 13까지 특성을 넘파이 배열로 변환하여 변수 X에 할당합니다. 첫 번째 열의 클래스 레이블은 변수 y에 할당합니다. 그다음 train_test_split 함수를 사용하여 X와 y를 랜덤하게 훈련 데이터셋과 테스트 데이터셋으로 분할합니다. test_size = 0.3으로 지정했기 때문에 와인 샘플의 30%가 X_test와 y_test에 할당됩니다. 나머지 샘플 70%는 X_train과 y_train에 각각 할당됩니다. stratify 매개변수에 클래스 레이블 배열 y를 전달하면 훈련 데이터셋과 테스트 데이터셋에 있는 클래스 비율이 원본 데이터셋과 동일하게 유지됩니다.
Note ≡ 훈련 데이터셋과 테스트 데이터셋의 적절한 분할 비율
데이터셋을 훈련 데이터셋과 테스트 데이터셋으로 나누면 학습 알고리즘에 도움이 될 수 있는 유익한 정보를 감추게 된다는 것을 기억하세요. 테스트 데이터셋으로 너무 많은 정보를 떼어 놓아서는 안 됩니다. 반대로 테스트 데이터셋이 작으면 일반화 오차에 대한 추정은 더 부정확해질 것입니다. 훈련 데이터셋과 테스트 데이터셋으로 나눌 때 이 트레이드오프의 균형을 맞추어야 합니다. 실전에서 가장 많이 사용하는 비율은 데이터셋의 크기에 따라 60:40, 70:30 또는 80:20입니다. 대용량의 데이터셋일 경우에는 90:10 또는 99:1의 비율로 훈련 데이터셋과 테스트 데이터셋을 나누는 것도 보통이고 적절합니다. 예를 들어 데이터셋에 10만 개 이상의 훈련 샘플이 있다면 일반화 성능을 잘 추정하기 위해 1만 개의 샘플만 테스트로 떼어 놓아도 괜찮습니다. 더 자세한 내용은 제가 쓴 ‘머신러닝의 모델 평가와 모델 선택, 알고리즘 선택’(http://arxiv.org/pdf/1811.12808.pdf)을 참고하세요.13
또한, 떼어 놓았던 테스트 데이터셋을 버리지 말고 훈련과 평가 후에 전체 데이터셋으로 모델을 다시 훈련하여 모델의 예측 성능을 향상시키는 방법이 널리 사용됩니다. 이런 방식이 일반적으로 권장되지만, 데이터셋이 작고 테스트 데이터셋에 이상치가 들어 있다면 일반화 성능은 오히려 나빠질 수 있습니다. 전체 데이터셋을 사용하여 모델을 다시 훈련한 후에는 이 모델의 성능을 평가할 독립된 데이터셋이 남아 있지도 않습니다.
13 역주 이 글은 역자의 블로그에 번역되어 있습니다(https://bit.ly/2pUx9AA).