머신러닝 프로젝트를 할 때 큰 그림을 보지 않고 주먹 구구 식으로 프로젝트 했던 경험이 있다.
이때의 비효율성과 내가 왜?이걸 하고 있지 라는 생각은 정말 작업효율과 흥미 모두 떨어지게 한다.
큰그림을 보자
import numpy as np
# For illustration only. Sklearn has train_test_split()
def split_train_test(data, test_ratio):
shuffled_indices = np.random.permutation(len(data))
test_set_size = int(len(data) * test_ratio)
test_indices = shuffled_indices[:test_set_size]
train_indices = shuffled_indices[test_set_size:]
return data.iloc[train_indices], data.iloc[test_indices]
from zlib import crc32
def test_set_check(identifier, test_ratio):
return crc32(np.int64(identifier)) & 0xffffffff < test_ratio * 2**32 #crc32 해쉬함수 이용
#0xfffffffff - > 2**32 -1 identifier 가 들어오면 test인지 아닌지
def split_train_test_by_id(data, test_ratio, id_column):
ids = data[id_column]
in_test_set = ids.apply(lambda id_: test_set_check(id_, test_ratio))
return data.loc[~in_test_set], data.loc[in_test_set]
housing_with_id["id"] = housing["longitude"] * 1000 + housing["latitude"] #지역은 유니크하게 경도위도 속성활용
train_set, test_set = split_train_test_by_id(housing_with_id, 0.2, "id")
import sklearn
from sklearn.model_selection import train_test_split
train_set, test_set = train_test_split(housing, test_size=0.2, random_state=42)
housing["median_income"].hist() #모든 특성을 다 그렇게 하긴 어렵기에 가장 중요한 특성을 갖고 함
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]) #데이터를 보면 감을 잡을수 이씀;; 적절하게 나눠지도록 빈만들어
from sklearn.model_selection import StratifiedShuffleSplit #이미 사이킷런이 다 갖고있음 구현해주면됨
split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
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]
def income_cat_proportions(data):
return data["income_cat"].value_counts() / len(data)
train_set, test_set = train_test_split(housing, test_size=0.2, random_state=42)
compare_props = pd.DataFrame({
"Overall": income_cat_proportions(housing),
"Stratified": income_cat_proportions(strat_test_set),
"Random": income_cat_proportions(test_set),
}).sort_index()
compare_props["Rand. %error"] = 100 * compare_props["Random"] / compare_props["Overall"] - 100
compare_props["Strat. %error"] = 100 * compare_props["Stratified"] / compare_props["Overall"] - 100