들어가며
앞서 머신러닝을 위한 기본적인 상식과 구조에 대해서 알아보았습니다. 이번에는 실제 데이터를 이용해서 모델을 구축하는 과정에 대해서 설명하겠습니다. 이제부터 여러분이 머신러닝 개발자로서 주식회사에서 투자를 위한 캘리포니아 주택 가격 예측모델 제작 의뢰를 받았다고 가정하고 진행해보도록 하겠습니다.
1. 기본적인 준비
앞으로 모델을 구축하기 위해서는 colab을 사용할 것입니다. colab은 클라우드 기반으로 작업을 수행하기 때문에 공유하기도 쉽고 각자 컴퓨터의 기능에 구애받지 않기에 선택했습니다. colab을 사용하기 위한 방법은 구글링을 하시면 쉽게 알 수 있습니다.
1.1 설정
모델 구축을 위해서 공통 모듈을 임포트 하는 등 기본적인 설정을 위한 코드입니다. 제일 먼저 실행하시면 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
# 파이썬 2와 파이썬 3 지원
from __future__ import division, print_function, unicode_literals
# 공통
import numpy as np
import os
# 일관된 출력을 위해 유사난수 초기화
np.random.seed(42)
# 맷플롯립 설정
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
plt.rcParams['axes.labelsize'] = 14
plt.rcParams['xtick.labelsize'] = 12
plt.rcParams['ytick.labelsize'] = 12
# 한글출력
matplotlib.rc('font', family='NanumBarunGothic')
plt.rcParams['axes.unicode_minus'] = False
# 그림을 저장할 폴드
PROJECT_ROOT_DIR = "."
CHAPTER_ID = "end_to_end_project"
IMAGES_PATH = os.path.join(PROJECT_ROOT_DIR, "images", CHAPTER_ID)
def save_fig(fig_id, tight_layout=True, fig_extension="png", resolution=300):
path = os.path.join(IMAGES_PATH, fig_id + "." + fig_extension)
if tight_layout:
plt.tight_layout()
plt.savefig(path, format=fig_extension, dpi=resolution)
|
cs |
https://colab.research.google.com/drive/1wWaPMCEb3ewf3CNKIeu262vQaCG36apw#scrollTo=-jABc-9vhiLf
2. 데이터 다운로드
작업 설정 후 가장 처음 해야 하는 것은 모델을 구축하기 위한 데이터 다운로드입니다. 다운로드할 파일은 캘리포니아 주택의 여러 가지 특성과 가격이 합쳐진 샘플들입니다. 일일이 다운로드하는 것은 귀찮으니 코드로 구현해서 다운로드해봅시다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
import os
import tarfile
from six.moves import urllib
DOWNLOAD_ROOT = "https://raw.githubusercontent.com/ageron/handson-ml/master/"
HOUSING_PATH = os.path.join("datasets", "housing")
HOUSING_URL = DOWNLOAD_ROOT + "datasets/housing/housing.tgz"
# housing.csv 파일 다운로드
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()
# csv 다운로드
fetch_housing_data()
import pandas as pd
# pandas 규격에 맞춘 csv 파일 추출
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
|
cs |
2.1 데이터 알아보기
데이터를 다운로드했으니 어떤 특성들이 있는지, 데이터 타입은 어떠한지 그리고 각 특성의 범위는 어떠한지 등 데이터에 대해서 알아봅시다. 효율적인 모델을 구축하기 위해서는 데이터에 대한 이해도가 높을수록 좋기 때문입니다.
우선 데이터를 그대로 출력해봅시다.
총데이터는 20640개이며 특성은 10개입니다. 개수는 실제 효율적인 모델을 구축하기에는 부족한 편이지만 컴퓨팅 자원의 소모를 고려해서 이 정도로 사용해봅시다.
2.2 데이터 타입 알아보기
특성들을 보아하니 대부분 실수로 되어있지만 oceam_proximity 특성은 똑같은 유형이 많습니다. 이번에는 특성의 데이터 타입에 대해서 알아봅시다.
여기에서는 두 가지 정보를 알 수 있습니다.
1. 데이터 타입을 알아보니 oceam_proximity 특성은 object형식입니다. 똑같은 데이터 값이 많으므로 아마 카테고리 형태의 데이터로 추정됩니다. 이는 value_counts()를 통해 확인할 수 있습니다.
2. total_bedrooms특성의 데이터 중 20433개의 데이터만 null형태가 아니므로 나머지 207개의 데이터가 null형태로 손실되어 있는 것입니다. 데이터의 손실은 모델 학습에 큰 영향을 끼치므로 이를 정제할 필요가 있다는 것을 확인했습니다. (이는 추후 "데이터 정제" 글에서 설명하겠습니다.)
2.3 데이터 분포 확인하기
이번에는 각 특성의 데이터 분포를 히스토그램을 통해서 알아보도록 하겠습니다.
히스토그램은 실수형 데이터만 다루므로 ocean_proximity를 제외한 9개의 특성을 표현합니다. 이것을 보면 한눈에 데이터 분호와 이상치를 파악할 수 있습니다. housing_media_age와 median_house_value의 데이터 최대치 빈도가 이상하리만큼 큽니다. 이를 확인하기 위해서 데이터 크롤링 팀에 연락을 해야 합니다. 답변으로 두 특성은 최대치가 설정되어있고 이를 넘어가는 데이터는 모두 최대치로 통합하여 표현한다고 합니다. 이대로 모델에 학습시키면 모델이 잘못 학습할 가능성이 크므로 두 특성 또한 정제할 필요가 있습니다.
마무리
우선 모델을 학습시키기 위한 설정, 데이터 다운로드 그리고 간단히 데이터를 훑어보고 데이터 정제가 필요한 부분에 대해서 확인했습니다. 다음 글에서는 모델을 학습시키기 위한 훈련 세트와 마지막 평가를 위한 테스트 세트의 필요성과 추출방법에 대해서 설명하겠습니다.
'Machine Learning' 카테고리의 다른 글
머신러닝 프로젝트 - 계층적 샘플링(stratified sampling) (0) | 2020.02.29 |
---|---|
머신러닝 프로젝트 - 2. 테스트 세트 추출하기 (0) | 2020.02.29 |
머신러닝 프로젝트 개발 과정 - 0. 문제 정의 (0) | 2020.02.18 |
머신러닝 시스템의 종류( 지도, 비지도, 준지도, 강화, 배치/온라인, 사례/모델기반) (0) | 2020.02.15 |
신경망 학습 - (4 - 3) AdaGrad(Adaptive Gradient) (0) | 2020.01.28 |