Data Science/AI

[필기] 머신러닝 프로젝트 End-to-End 진행의 과정 (핸즈온 머신러닝 챕터 2)

토마토. 2021. 7. 15. 11:13

Working with real data

 

popular sites

1. 

UCI Machine Learning Repository

 

2.

Find Open Datasets and Machine Learning Projects | Kaggle

 

3.

Registry of Open Data on AWS

 

2.2

큰 그림 보기

 

데이터 : 캘리포니아 인구조사 데이터(인구, 중간소득, 중간주택가격 등)목표 : 구역의 중간 주택 가격 예측하기

 

2.2.1. 문제 정의Q1. 비즈니스의 목적이 무엇인가?

 

2.3.데이터 가져오기

 

jupyter 노트북 사용하기 시작한다.housing.tgz라는 single file을 다운로드 받은 것임.housing.csv로 train

 

tgz를 압축 풀기하기 위해 함수를 하나 만들게 된다.1) datasets/housing directory를 만들고2) housing.tgz file을 다운로드 받고3) 안의 내용물을 추출하여 저장한다.

import os
import tarfile
import urllib

DOWNLOAD_ROOT = "https://raw.githubusercontent.com/ageron/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):
    os.makedirs(housing_path, exist_ok=True)
    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()

그런 뒤에 pandas를 불러와서데이터를 읽어들인다.

import pandas as pd

def load_housing_data(housing_path=HOUSING_PATH):
    csv_path = os.path.join(housing_path, "housing.csv")
    return pd.read_csv(csv_path)

data.head() 혹은 .info() 함수를 이용하면 데이터의 구조를 파악할 수 있다.

housing = load_housing_data()
housing.head()

value_counts() 메소드를 이용하면ocean_proximity라는 특성을 어떻게 가지고 있는지 확인할 수 있다.

housing["ocean_proximity"].value_counts()

housing.describe()
data plot using matplotlib.pyplot

%matplotlib inline
import matplotlib.pyplot as plt
housing.hist(bins=50, figsize=(20,15))
plt.show()

 

시각화를 통해feature scaling을 다루게 된다.

 

tail-heavy : extend to the right of the median

 

create a test set

import numpy as np

def split_train_text(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]
train_set, test_set = split_train_test(housing, 0.2)
len(train_set)
len(test_set)

dataset에 ID 만들기위도와 경도 이용해서 만들기

 

housing_with_id["id"] = housing["longitude"] * 1000 + housing["latitude"]
train_set, test_set = split_train_test_by_id(housing_with_id, 0.2, "id")

scikit-learn의 train_test_split 함수를 이용하면데이터셋을 나눌 수 있다.표본의 대표성을 위해서stratified sampling을 고려하여야 한다.

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()

scikit-learn's stratifiedshufflesplit class를 이용해서 할 수 있음

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]
    
strat_test_set["income_cat"].value_counts() / len(strat_test_set)

output

3 0.350533 2 0.318798 4 0.176357 5 0.114583 1 0.039729 Name: income_cat, dtype: float64

 

 

2.4.

데이터 이해를 위한 탐색과 시각화

visualizing geographical data (using longitude & latitude)

housing = strat_train_set.copy()
housing.plot(kind="scatter", x="longitude", y="latitude")

housing.plot(kind="scatter", x="longitude", y="latitude", alpha=0.1)

jet - color map (option cmap)

housing.plot(kind="scatter", x="longitude", y="latitude", alpha=0.4,
            s=housing["population"]/100, label="population", figsize=(10,7),
            c="median_house_value", cmap=plt.get_cmap("jet"), colorbar=True,
)
plt.legend()

looking for correlations

피어슨 상관계수

corr_matrix=housing.corr()
corr_matrix["median_house_value"].sort_values(ascending=False)

'''아웃풋
median_house_value    1.000000
median_income         0.687160
total_rooms           0.135097
housing_median_age    0.114110
households            0.064506
total_bedrooms        0.047689
population           -0.026920
longitude            -0.047432
latitude             -0.142724
Name: median_house_value, dtype: float64 '''

 

from pandas.plotting import scatter_matrix

attributes = ["median_house_value", "median_income", "total_rooms",
              "housing_median_age"]
scatter_matrix(housing[attributes], figsize=(12,8))

위 그림에서는 median_income과 median_housing_value와의 상관관계가두드러지게 나타났다.

 

experimenting with attribute combinations

 

 

2.5.

머신러닝 알고리즘을 위한 데이터 준비

 

data cleaning

결측치 처리

 

handling text and categorical attributes

 

custom transformers

 

feature scaling

 

transformation pipelines

 

 

2.6. 

모델 선택과 훈련

 

 

2.7. 

모델 세부 튜닝

 

 

2.8.

론칭, 모니터링, 시스템 유지 보수

 

 

2.9.

직접 해보세요!

 

 

2.10.연습문제

 

 

<참고>

Geron, Aurelien. (2019). Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow. Sebastopol: O'Reilly Media, Incorporated.