계층 분포 반영하기
예를들어, 데이터가 주어졌을 때 레이블 값을 추정하는데 어떤 변수(반드시 범주형)가 매우 중요하다고 가정해보자.
이때, 해당 변수는 수치형일수도 범주형일 수도 있다. 하지만 여기서는 계층을 반영한다는 개념으로 train과 test 데이터셋을 나누는 방법에 대해서 설명한다.
예를들어, 중간 소득(어떤 변수)이 중간 주택 가격(레이블)을 예측하는 데 매우 중요하다고 하자. 그렇다면 train과 test 데이터셋 모두 이러한 특성을 반영해서 샘플링해주는 것이 좋다. 즉, 소득이라는 변수가 원본데이터와 train, test 모두 동일하게 분포해 있는 것이 좋다는 얘기다.
1.
아마도, 중간 소득은 수치형으로 저장되어있을 것이기 때문에 먼저 소득 변수를 카테고리화 시켜준다. 이때, 계층별로 데이터가 충분히 있게끔 만들어주어야 한다.
# 카테고리 5개
housing['income_cat'] = pd.cut(housing['median_income'], bins=[0.,1.5,3.0,4.5,6.,np.inf], labels=[1,2,3,4,5])
Python
복사
2.
StratifiedShuffleSplit 을 사용해서 계층 샘플링을 진행한다.
from sklearn.model_selection import StratifiedShuffleSplit
split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=0) # train, test 분리하는거라서 n_splits=1
for train_index, test_index in split.split(housing, housing['income_cat']):
strat_train_set = housing.loc[train_index]
strat_test_set = housing.loc[test_index]
Python
복사
3.
원본의 비율을 잘 반영했는지 test의 비율과 비교해본다.
strat_test_set['income_cat'].value_counts/ len(strat_test_set) # 테스트 데이터의 비율
housing['income_cat'].value_counts / len(housing) # 원본 데이터의 비율
Python
복사