728x90
데이터의 특성상 몇 개의 층(Strata)으로 나누어진 데이터의 경우는 동일한 확률로 뽑는 것보다 층간의 비율에 맞춰 각 층 안에서 표본을 뽑는 것이 낫다. 모든 데이터에서 표본을 뽑는 경우 특정층이 뽑히지 않거나 소수로 뽑힐 확률도 있기 때문이다. 각 층 내에서 동질적이고 유사한 개체들로 묶여있는 데이터 집단에서는 층화추출이 단순확률추출보다 더 효율적이다.
import pandas as pd
import pandas as pd
from sklearn.model_selection import StratifiedShuffleSplit
if __name__ == '__main__':
data = [{'이름': '영수', '분야': '언어', '국어': 100, '영어': 90, '수학': 50, '과학': 45, '중국어': 92},
{'이름': '철수', '분야': '언어', '국어': 98, '영어': 99, '수학': 30, '과학': 46, '중국어': 82},
{'이름': '미혜', '분야': '수리', '국어': 20, '영어': 30, '수학': 99, '과학': 99, '중국어': 42},
{'이름': '영이', '분야': '수리', '국어': 40, '영어': 50, '수학': 80, '과학': 85, '중국어': 62},
{'이름': '영구', '분야': '언어', '국어': 70, '영어': 90, '수학': 40, '과학': 65, '중국어': 99},
{'이름': '구희', '분야': '융합', '국어': 90, '영어': 96, '수학': 60, '과학': 85, '중국어': 100},
{'이름': '지혜', '분야': '융합', '국어': 99, '영어': 92, '수학': 80, '과학': 75, '중국어': 82},
{'이름': '미영', '분야': '융합', '국어': 98, '영어': 90, '수학': 99, '과학': 100, '중국어': 82},
{'이름': '영미1', '분야': '수리', '국어': 42, '영어': 40, '수학': 98, '과학': 88, '중국어': 17},
{'이름': '수환1', '분야': '수리', '국어': 33, '영어': 10, '수학': 99, '과학': 89, '중국어': 22},
{'이름': '영미2', '분야': '수리', '국어': 42, '영어': 40, '수학': 98, '과학': 88, '중국어': 17},
{'이름': '수환2', '분야': '수리', '국어': 33, '영어': 10, '수학': 99, '과학': 89, '중국어': 22},
{'이름': '영미3', '분야': '수리', '국어': 42, '영어': 40, '수학': 98, '과학': 88, '중국어': 17},
{'이름': '수환3', '분야': '수리', '국어': 33, '영어': 10, '수학': 99, '과학': 89, '중국어': 22},
{'이름': '영미4', '분야': '수리', '국어': 42, '영어': 40, '수학': 98, '과학': 88, '중국어': 17},
{'이름': '수환4', '분야': '수리', '국어': 33, '영어': 10, '수학': 99, '과학': 89, '중국어': 22}]
data = pd.DataFrame(data)
sss = StratifiedShuffleSplit(n_splits=1, train_size=0.7, random_state=0)
X = data[['국어', '영어', '수학', '과학','중국어']]
y = data['분야']
sss.get_n_splits(X, y)
for train_index, test_index in sss.split(X, y):
print("TRAIN:", train_index, "TEST:", test_index)
X_train, X_test = X.iloc[train_index], X.iloc[test_index]
y_train, y_test = y.iloc[train_index], y.iloc[test_index]
print('Train:', y_train.tolist())
print('Test:', y_test.tolist())
결과 값
TRAIN: [12 10 15 3 6 8 5 4 13 14 1] TEST: [11 0 7 2 9]
Train: ['수리', '수리', '수리', '수리', '융합', '수리', '융합', '언어', '수리', '수리', '언어']
Test: ['수리', '언어', '융합', '수리', '수리']
결과 값을 보면 Train set과 Test set이 모집단의 비율에 맞춰 뽑힌 것을 볼 수 있다.
728x90
'Data Science > Data Preprocessing' 카테고리의 다른 글
[04. Feature Sampling] 003. Train / Validation / Test Split (0) | 2021.07.20 |
---|---|
[04. Feature Sampling] 001. Simple Random Sampling (0) | 2021.07.20 |
[03. Feature Engineering] 006. Dimensionality Reduction (0) | 2021.07.20 |
[03. Feature Engineering] 005. Dummy (0) | 2021.07.06 |
[03. Feature Engineering] 004. Transform (0) | 2021.06.29 |