보통은 입력(X)와 출력(y)의 쌍을 y값을 기준으로 랜덤하게 7:3 혹은 8:2로 학습용과 테스트용으로 분류한다.
통상적으로 sklearn 패키지에 있는 train_test_split() 함수를 사용하여 전체 데이터에서 학습용과 테스용 데이터의 인덱스를 얻어온다.
물론 위와 같은 방식으로 간편하게 사용하기 좋지만, 데이터의 분포가 정규분포인 경우 특정 영역에서 샘플링이 몰리는 현상은 여전하다.
그래서 계층적 샘플링(stratified sampling)을 사용하여 각 계층내에서 램덤하게 샘플링하여
위와 같이 분포가 많거나 적거나 상관없이 골고루 영역에서 램덤하게 샘플링 할 수 있다.
우선 pandas의 cut() 함수를 이용하여 데이터를 구간에 따라 라벨을 부여하고 bar 그래프를 그려본다.
import pandas as pd
import numpy as np
from matplotlib.pyplot import plt
...
data_dict['y_labels'] = pd.cut(data_dict['y'], bins=[0.0, 1.5, 3.0, 4.5, 6.0, np.inf], labels=[1, 2, 3, 4, 5])
data_dict['y_labels'].value_counts().sort_index().plot.bar(rot=0, grid=True)
plt.xlabel('categories')
plt.ylabel('counts')
plt.show()
...
그리고 train_test_split() 함수의 stratify 매개변수를 사용하여 계층적 샘플링을 수행할 수 있다.
strat_train_set, strat_test_set = train_test_split(
data_dict, test_size=0.2, stratify=data_dict['y_labels'], random_state=42
)
앞으로 계층적 샘플링을 사용하자.