사례 기반 학습과 모델 기반 학습

머신러닝 시스템은 어떻게 일반화되는가에 따라 분류할 수 있습니다. 대부분의 머신러닝은 예측하는 것이 목표입니다.

다시 말하면, 주어진 훈련 데이터로 학습하지만 훈련 데이터에서는 본 적 없는 새로운 데이터로 일반화되어야 한다는 뜻입니다.

일반화를 위한 두 가지 접근법은 아래와 같습니다.


사례 기반 학습

가장 간단한 형태의 학습은 단순히 기억하는 것입니다. 아마도 가장 간단한 형태의 학습은 단순히 기억하는 것입니다. 
스팸 필터를 이러한 방식으로 만들면 사용자가 스팸이라고 지정한 메일과 동일한 모든 메일을 스팸으로 분류합니다. 최악의 방법은 아니지만 최선도 아닙니다.

스팸 메일과 동일한 메일을 스팸이라고 지정하는 대신 스팸 메일과 매우 유사한 메일을 구분하도록 스팸 필터를 프로그램할 수 있습니다. 

이렇게 하려면 두 메일 사이의 유사도(Similarity)를 측정해야 합니다. 두 메일 사이의 매우 간단한 유사도 측정 방법은 공통으로 포함한 단어의 수를 세는 것입니다. 스팸 메일과 공통으로 가지고 있는 단어가 많으면 스팸으로 분류합니다. 이를 사례 기반 학습(Instance-Based Learning)이라고 합니다. 시스템이 사례를 기억함으로써 학습합니다. 그리고 유사도 측정을 사용해 새로운 데이터에 일반화합니다.

< Fig. 1. 사례 기반 학습 예시 >


모델 기반 학습

샘플로부터 일반화시키는 다른 방법은 이 샘플들의 모델을 만들어 예측하는 것입니다.

이를 모델 기반 학습(Model-Based Learning)이라고 합니다.


< Fig. 2. 모델 기반 학습 예시 >


모델 기반 학습의 예시로 돈이 사람을 행복하게 만드는지 알아보도록 하겠습니다.

OECD 웹사이트에서 더 나은 삶의 지표(Better Life Index) 데이터와 IMF 웹사이트에서 1인당 GDP 통계를 내려받습니다.

두 데이터 테이블을 합치고 1인당 GDP로 정렬합니다.


< Fig. 3. 1인당 GDP 순으로 정렬한 데이터 >


위의 데이터를 보기 편하게 시각화 합니다.


< Fig. 4. 그래프로 표현한 1인당 GDP와 삶의 질 관계 >


Fig. 4를 살펴보면 어떠한 경향을 찾을 수 있습니다. 삶의 만족도는 국가의 1인당 GDP가 증가할수록 거의 선형으로 상승하는 것을 확인할 수 있었습니다.

그러므로, 1인당 GDP의 선형 함수로 삶의 만족도를 모델링 해보겠습니다. 이 단계를 모델 선택(Model Selection)이라고 합니다.

1인당 GDP라는 특성 하나를 가진 삶의 만족도에 대한 선형 모델(Linear Model)입니다.


삶의 만족도 = 𝜃₀ + 𝜃₁ × 1인당 GDP


이 모델은 두 개의 모델 파라미터 𝜃₀와 𝜃₁을 가집니다. 이 모델 파라미터를 조정하여 Fig. 5 처럼 어떤 선형 함수를 표현하는 모델을 얻을 수 있습니다.

모델을 사용하기 전에 𝜃₀와 𝜃₁을 정의해야 합니다. 모델이 최상의 성능을 내도록 하는 값을 어떻게 유추할 수 있을까요?

이 질문에 대답하기 위해서는 측정 지표를 정해두어야 합니다. 모델이 얼마나 좋은지, 나쁜지를 결정하는 효용 함수[각주:1](또는 적합도 함수[각주:2])를 정의하거나,

얼마나 이 모델이 나쁜지 측정하는 비용 함수[각주:3]를 정의할 수 있습니다. 선형 회귀에서는 보통 선형 모델의 예측과 훈련 데이터 사이의 거리를 재는 비용 함수를 주로 사용합니다.


여기에서 선형 회귀 알고리즘이 등장합니다. 알고리즘에 훈련 데이터를 공급하면 데이터에 가장 잘 맞는 선형 모델의 파라미터를 찾습니다.

이를 모델을 훈련[각주:4]시킨다고 말합니다. 실습을 통해 해당 모델을 훈련시켜보도록 하겠습니다.

아래의 파이썬 코드는 데이터를 로드하고 준비한 다음 산점도를 그려 시각화하고 선형 모델을 훈련하여 예측하는 과정을 보여줍니다.


사이킷런을 활용한 선형 모델의 훈련과 실행 코드

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sklearn
import warnings
warnings.filterwarnings(action="ignore", module="scipy", message="^internal gelsd")


# Load the data
oecd_bli = pd.read_csv("BLI.csv", thousands=',')
gdp_per_capita = pd.read_csv("WEO.csv", thousands=',', delimiter='\t',
encoding='latin1', na_values="n/a")

# Pre-process the data
def prepare_country_stats(oecd_bli, gdp_per_capita):
oecd_bli = oecd_bli[oecd_bli["INEQUALITY"]=="TOT"]
oecd_bli = oecd_bli.pivot(index='Country', columns="Indicator", values="Value")
gdp_per_capita.rename(columns={"2015": "GDP per capita"}, inplace=True)
gdp_per_capita.set_index('Country', inplace=True)
full_country_stats = pd.merge(left=oecd_bli, right=gdp_per_capita,
left_index=True, right_index=True)
full_country_stats.sort_values(by="GDP per capita", inplace=True)
remove_indices = [0, 1, 6, 8, 33, 34, 35]
keep_indices = list(set(range(36)) - set(remove_indices))
return full_country_stats[["GDP per capita", 'Life satisfaction']].iloc[keep_indices]


# Prepare the data
country_stats = prepare_country_stats(oecd_bli, gdp_per_capita)
X = np.c_[country_stats["GDP per capita"]]
y = np.c_[country_stats["Life satisfaction"]]

# Visualize the data
country_stats.plot(kind='scatter', x="GDP per capita", y='Life satisfaction')
plt.show()

# Select a linear model
model = sklearn.linear_model.LinearRegression()

# Train the model
model.fit(X, y)

# Make a prediction for Cyprus
X_new = [[22587]] # Cyprus' GDP per capita
print(model.predict(X_new)) # outputs [[ 5.96242338]]


결과

[[ 5.96242338]]

지금까지의 작업을 간단히 요약하자면 다음과 같습니다.


  1. 데이터를 분석합니다.
  2. 모델을 선택합니다.
  3. 훈련 데이터로 모델을 훈련시킵니다.
  4. 마지막으로 새로운 데이터에 모델을 적용해 예측을 하고, 이 모델이 일반화되길 기대합니다.


이와 같은 과정이 머신러닝 프로젝트의 전형적인 형태라고 할 수 있습니다.



Reference

    • 오렐리앙 제롱, '핸즈온 머신러닝', 한빛미디어, 2018
    • https://github.com/ageron/handson-ml/blob/master/01_the_machine_learning_landscape.ipynb

  1. Utility Function [본문으로]
  2. Fitness Function [본문으로]
  3. Loss Function [본문으로]
  4. Training [본문으로]

+ Recent posts