[7주차 - Day2] ML_basics - Decision Theory & Linear Regression

2023. 6. 21. 15:00BOOTCAMP/프로그래머스 인공지능 데브코스

결정이론이란?

새로운 값 x가 주어졌을 때 확률모델 p(x, t)에 기반해 최적의 결정(예를 들어 분류)을 내리는 것

  • 추론단계: 결합확률분포 p(x, Ck)를 구하는 것(p(Ck|x)를 직접 구하는 경우도 있음). 이것만 있으면 모든 것을 할 수 있음.
  • 결정단계: 상황에 대한 확률이 주어졌을 때 어떻게 최적의 결정을 내릴 것인지? 추론단계를 거쳤다면 결정단계는 매우 쉬움.

예제: X-Ray의 이미지로 암 판별

  • x: X-Ray 이미지
  • C1: 암인 경우
  • C2: 암이 아닌 경우
  • p(Ck|x)의 값을 알기 원함

  • 직관적으로 볼 때 p(Ck|x)를 최대화시키는 k를 구하는 것이 좋은 결정

기대손실 최소화 (Minimizing the Expected Loss)

모든 결정이 동일한 리스크를 갖는 것은 아님.

  • 암이 아닌데 암인 것으로 진단
  • 암이 맞는데 암이 아닌 것으로 진단

손실행렬 (loss matrix)

 

  • Lkj: Ck에 속하는 x를 Cj로 분류할 때 발생하는 손실(또는 비용)

데이터에 대한 모든 지식이 확률분포로 표현되고 있는 것을 기억할 것이며, 한 데이터샘플 x의 실제 클래스를 결정론적으로 알고 있는 것이 아니라 그것의 확률만을 알 수 있다고 가정합니다.

 

즉, 우리가 관찰할 수 있는 샘플(예를 들어, 암을 가진 환자의 X-Ray 이미지)은 확률분포 p(x, Ck)를 통해서 생성된 것이라고 간주합니다.

따라서, 손실행렬 L이 주어졌을 때, 다음과 같은 기대손실을 최소화하는 것을 목표로 할 수 있습니다.

선형회귀 (Linear Regression) 실습

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
rng = np.random.RandomState(1)
x = 10 * rng.rand(50)
y = 2 * x - 5 + rng.randn(50)
plt.scatter(x, y);

Scikit-Learn의 LinearRegression estimator를 사용해서 위 데이터를 가장 잘 표현하는 직선을 찾을 수 있습니다.

x.shape
(50,)
x[:, np.newaxis].shape
(50, 1)
from sklearn.linear_model import LinearRegression
model = LinearRegression(fit_intercept=True)

model.fit(x[:, np.newaxis], y)

xfit = np.linspace(0, 10, 1000)
yfit = model.predict(xfit[:, np.newaxis])

plt.scatter(x, y)
plt.plot(xfit, yfit);

모델 학습이 끝난 후 학습된 파라미터들은 model."파라미터이름"_ 의 형태로 저장되며, 기울기와 y절편은 아래와 같이 출력할 수 있습니다.

print("Model slope:    ", model.coef_[0])
print("Model intercept:", model.intercept_)
Model slope: 2.0272088103606953
Model intercept: -4.998577085553204

LinearRegression estimator는 위의 예제와 같은 1차원 입력뿐만 아니라 다차원 입력을 사용한 선형모델을 다룰 수 있다. 다차원 선형모델은 다음과 같은 형태를 가집니다.

𝑦=𝑎0+𝑎1𝑥1+𝑎2𝑥2+⋯

기하학적으로 이것은 hyper-plane으로 데이터를 표현하는 것이라고 말할 수 있습니다.

rng = np.random.RandomState(1)
rng.rand(100, 3).shape
X = 10 * rng.rand(100, 3)
np.dot(X, [1.5, -2., 1.]).shape
rng = np.random.RandomState(1)
X = 10 * rng.rand(100, 3)
y = 0.5 + np.dot(X, [1.5, -2., 1.])

model.fit(X, y)
print(model.intercept_)
print(model.coef_)

𝑦값들은 랜덤하게 생성된 3차원의 𝑥값과 계수들([1.5, -2., 1.])을 곱함으로써 생성되었는데, linear regression을 통해서 이 계수들을 계산해 낼 수 있다는 것을 알 수 있습니다.