Programmers 인공지능 데브코스 - Week 5 Day 3 - E2E Project

donchanee·2021년 1월 7일
0

😃[5주차 - Day3]😃

E2E Project

부동산 회사에 막 고용된 데이터 과학자라고 가정하고 예제 프로젝트를 진행하는 과정을 살펴봅니다.

  • 지도학습(supervised learning), 비지도학습(unsupervised learning), 강화학습(reinforcement learning) 중에 어떤 경우에 해당하는가?
  • 분류문제(classification)인가 아니면 회귀문제(regresssion)인가?
  • 배치학습(batch learning), 온라인학습(online learning) 중 어떤 것을 사용해야 하는가?

위와 같은 과정을 통해 상황을 판단할 수 있습니다. 온라인 학습이라하면 계속적으로 데이터가 들어오는 상황이고, 배치학습은 한번에 데이터를 학습하는 상황을 말합니다.

vector인 경우에는 bold체를 쓰는 경우가 많습니다.

테스트 데이터셋 만들기!

좋은 모델을 만들기 위해서는 모델 평가만을 위해서 사용될 "테스트 데이터셋"을 따로 구분하는 것이 필요합니다.

이를 만들기 위해서는 아래와 같은 코드를 사용합니다.

np.random.seed(42)

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

위와 같은 0.2 정도로 실행하면 80%정도의 학습데이터, 20%정도의 테스트데이터를 구할 수 있습니다.

하지만 위의 경우, 새로운 데이터가 들어왔을 경우 테스트 데이터에 있는 데이터가 트레인 데이터에 들어올 수 있고 반대로도 가능합니다. 이를 막기 위하여, 식별자를 추가하게 됩니다.

인덱스를 id로 추가하기

housing_with_id = housing.reset_index()   # adds an `index` column
train_set, test_set = split_train_test_by_id(housing_with_id, 0.2, "index")

인덱스로 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")

이러한 과정을 거치지 않아도, scikitlearn 에서 제공하는 기본 함수가 있습니다. 위와 비슷한 과정을 거치기 때문에 편리합니다.

from sklearn.model_selection import train_test_split

train_set, test_set = train_test_split(housing, test_size=0.2, random_state=42)

계층적 샘플링

샘플을 뽑았을 때, 그 샘플이 데이터를 대표할 수 있게 샘플링하는 방법 중 하나를 계층적 샘플링이라고 합니다.

전체 데이터를 계층으로 나누고, 테스트 데이터가 전체 데이터를 잘 대표하도록 각 계층에서 올바른 수의 샘플을 추출합니다.

from sklearn.model_selection import StratifiedShuffleSplit

라이브러리에 있는 위 함수를 사용하면 계층적 샘플링을 편리하게 바로 사용할 수 있습니다.

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

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

경도와 위도를 사용한 Scatter Plot 입니다. 딱히 패턴을 찾기는 힘든 Plot입니다.

이에 대해 패턴을 조금 더 찾기 위해 점들이 밀집된 곳을 찾기 위해서

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

alpha 값을 사용해서 살펴보면 밀집된 곳은 더 진하게 나타남을 알 수 있습니다.

더 다양한 정보를 표시하기 위하여, s와 c 파라미터를 사용해보기로 합니다.

s는 원의 반지름을 나타낼 수 있고, c는 색상을 나타낼 수 있습니다.

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,
    sharex=False)
plt.legend()

상관관계(Correlations) 관찰하기

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

correlations 만으로 알아보기에는 한계가 있습니다. 다양한 선형적이지 않은 모양에도 corr는 0으로 나타나기 때문입니다.

Data Cleaning

  • 해당 구역을 제거(행을 제거)
  • 해당 특성을 제거(열을 제거)
  • 어떤 값으로 채움(0, 평균, 중간값 등)

조금 더 advanced 된 방법으로는

SimpleImputer 라는 클래스를 사용하는 방법이 있습니다.

중간값으로 채우는 방법인데, 이를 사용하면 쉽게 데이터를 낭비하지 않고 채워넣을 수 있습니다.

Estimator, Transformer, Predictor

  • 추정기(estimator): 데이터셋을 기반으로 모델 파라미터들을 추정하는 객체를 추정기라고 합니다(예를 들자면 imputer). 추정자체는 fit() method에 의해서 수행되고 하나의 데이터셋을 매개변수로 전달받습니다(지도학습의 경우 label을 담고 있는 데이터셋을 추가적인 매개변수로 전달).

  • 변환기(transformer): (imputer같이) 데이터셋을 변환하는 추정기를 변환기라고 합니다. 변환은 transform() method가 수행합니다. 그리고 변환된 데이터셋을 반환합니다.

  • 예측기(predictor): 일부 추정기는 주어진 새로운 데이터셋에 대해 예측값을 생성할 수 있습니다. 앞에서 사용했던 LinearRegression도 예측기입니다. 예측기의 predict() method는 새로운 데이터셋을 받아 예측값을 반환합니다. 그리고 score() method는 예측값에 대한 평가지표를 반환합니다.

텍스트 자료들은 커지는 순서대로 정렬되어있다고 Guarantee 되지 않습니다.

그래서 이럴경우, One-hot encoding을 사용합니다. One-hot encoding은 array중 한가지의 값만 1로 나머지는 0으로 만든다고 해서 이름이 붙여졌습니다.

모델 훈련

from sklearn.linear_model import LinearRegression

lin_reg = LinearRegression()
lin_reg.fit(housing_prepared, housing_labels)

데이터를 정제시키는 과정이 길었지만, 모델 훈련은 이렇게 간단하게 실행할 수 있습니다.

0개의 댓글