본문 바로가기
ML&DATA/ML

sklearn - model_selection

by sun__ 2020. 10. 2.
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()

housing['income_cat']

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