import os
import tarfile
import urllib.request
import pandas as pd
DOWNLOAD_ROOT = "https://raw.githubusercontent.com/rickiepark/handson-ml2/master/"
HOUSING_PATH = os.path.join("datasets", "housing")
HOUSING_URL = DOWNLOAD_ROOT + "datasets/housing/housing.tgz"
def fetch_housing_data(housing_url=HOUSING_URL, housing_path=HOUSING_PATH):
if not os.path.isdir(housing_path):
os.makedirs(housing_path)
tgz_path = os.path.join(housing_path, "housing.tgz")
urllib.request.urlretrieve(housing_url, tgz_path)
housing_tgz = tarfile.open(tgz_path)
housing_tgz.extractall(path=housing_path)
housing_tgz.close()
fetch_housing_data()
def load_housing_data(housing_path=HOUSING_PATH):
csv_path = os.path.join(housing_path, "housing.csv")
return pd.read_csv(csv_path)
housing = load_housing_data()
housing.head()
핸즈온 2장의 데이터셋 사용. 전체 데이터셋에서 훈련셋/테스트셋으로 나누는 방법
<train_test_split>
데이터셋을 훈련/테스트셋으로 나누는 함수. 각 샘플마다 해시값을 기준으로 해시 최대값의 몇퍼센트보다 작거나 같은 샘플만 훈련 또는 테스트셋으로 지정하는 방법을 사용한다. 따라서 데이터셋이 업데이트 되고 다시 호출한다 해도 훈련/테스트셋이 꽤 일정하게 나눠진다.
from sklearn.model_selection import train_test_split
train_set, test_set = train_test_split(housing, test_size=0.2, random_state = 42)
<StratifiedShuffleSplit>
train_test_split은 순수한 무작위 샘플링 방식이다.
하지만 현실에선 예를들어 미국인구의 51%가 여성이라면 잘 구성된 모델은 샘플에서도 이 비율을 유지해야한다.
housing의 경우, 만약 중간 소득이 예측값을 결정하는 데 매우 중요하다고 밝혀졌다면, 테스트셋이 전체 데이터 셋에 있는 여러 소득 카테고리를 잘 대표해야 한다.
StratifiedKFold의 계층 샘플링과 ShuffleSplit의 랜덤 샘플링을 합친 것이다. 따라서 kfold와 관련하여 n_splits 옵션이 있는데, 일단 테스트셋을 뽑는게 목적이니 전체 데이터셋을 하나의 fold로 여긴다고 보면 된다.
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])
housing['income_cat'].hist()
n_splits : fold수 // test_size : test셋 비율
split.split(housing, housing['income_cat'])은 income_cat의 카테고리별 비율에 맞게 데이터셋을 분할하는 제너레이터
from sklearn.model_selection import StratifiedShuffleSplit
split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
strat_train_set = pd.DataFrame()
strat_test_set = pd.DataFrame()
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]
income_cat은 쓸모를 다했으니 삭제
for set_ in (strat_train_set, strat_test_set):
set_.drop('income_cat', axis=1, inplace=True)
#strat_train_set.drop('income_cat', axis=1, inplace=True)
#strat_test_set.drop('income_cat', axis=1, inplace=True)
'ML&DATA > ML' 카테고리의 다른 글
sklearn - impute (0) | 2020.10.02 |
---|---|
sklearn - pipeline, compose (0) | 2020.09.01 |
sklearn - make_classification (0) | 2020.09.01 |
sklearn - preprocessing (0) | 2020.08.31 |