핸즈온머신러닝&딥러닝

모델 훈련 (수정 필요)

threegopark 2021. 5. 30. 17:25
728x90

1. 선형 회귀

 

예를 들어, 삶의 만족도 = x0 + (x1 X 1인당_GDP) 라는 선형 함수가 있다고 가정해보자. 여기서 x0과 x1은 각각 편향과 가중치로 모델 파라미터 라고도 한다. 이처럼 선형 회귀 모델은  y = x0 + x1*z1 + x2*z2 + x3*z3 ... 의 모습을 띄고 있으며, 이를 일반화시키면 

y = x · z (x는 편향과 가중치에 대한 열벡터, z는 입력 특성에 대한 열벡터) 로 볼 수 있다.

 

1.1 선형 회귀 측정 지표

 

일반적으로 RMSE or MSE를 사용하며, 오차를 최소화하는 방향으로 모델이 설계된다.

  • RMSE (평균 제곱근 오차)

추정 값 또는 모델이 예측한 값과 실제 환경에서 관측된 값의 차이(잔차)를 다루는 측도이며, 정밀도를 표현하는데 적합하다.

실제 값 세타 1과 측정 값 세타 2의 평균 제곱근 편차 (즉 표준 오차)를 계산하고, 이를 최소화하는 방향으로 모델을 설계한다.

 

위키백과

이를 조금 더 직관적으로 표현해보면

https://www.hatarilabs.com/ih-en/how-to-calculate-the-root-mean-square-error-rmse-of-an-interpolated-ph-raster

 

  • MSE (평균 제곱 오차)

 

4.2 정규 방정식

 

비용 함수를 최소화하는 세타 값(편향 + 가중치)을 찾기 위한 해석적인 방법

편미분을 통해 수학적으로 모수를 구하는 공식이다. 주어진 회귀식(행렬식) Y=XΘ 이 가지는 비용함수 MSE를 Θ에 대하여 미분해서 0이 되게 하는 Θ값 (변곡점)을 구하는 과정이다. 즉, 비용함수 MSE를 최소화하는 최적의 해 Θ를 구하는 것과 같다. 증명 과정은 아래와 같다.

(https://gyeo-ri.com/29 퍼옴)

 

 

행렬에 대한 미분

https://darkpgmr.tistory.com/141

 

벡터 미분과 행렬 미분

논문을 읽거나 어떤 이론을 이해할 때, 그리고 자신이 수식을 전재할 때 종종 벡터, 행렬에 대한 미분이 필요한 경우가 종종 있습니다. 저의 경우는 주로 함수 최적화 기법(Least Squares, Weighted Lest

darkpgmr.tistory.com

 

선형처럼 보이는 데이터를 생성 후 정규방정식을 테스트해보면

import numpy as np
import matplotlib.pyplot as plt

X = 2*np.random.rand(100,1)
#rand : 0에서 1 사이의 균일 분포인 표준정규분포

y = 4 + 3*X + np.random.randn(100,1)
#randn : 평균이 0이고 표준편차가 1인 가우시안 표준정규분포

plt.show(X ,y, 'bo')
plt.xlable('X1', fontsize = 20)
plt.ylabel('y', fontsize = 20, rotation=0)

plt.show()

 

유도한 정규방정식을 사용해 변곡점을 만드는 세타 값을 찾아보면

X_b = np.c_[np.ones((100,1)),X]
#모든 벡터의 1행에 1 추가 (편향 1)

theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
#linalg : 선형대수 모듈

theta_best

구한 최적의 세타 값으로 임의의 선형 데이터에 대한 모델의 예측을 그려보면

X_new = np.array([[0],[2]])
X_new_b = np.c_[np.ones((2,1)), X_new]
y_predict = X_new_b.dot(theta_best)

plt.plot(X_new, y_predict, "r")
plt.plot(X, y, "bo")
plt.axis([0,2,0,15])
plt.show()

 

 

이번에는 사이킷런의 선형 회귀 모델을 이용하여 예측해본다.

from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X,y)
print("편향 & 가중치 : ", lin_reg.intercept_, lin_reg.coef_)
print("예측 : \n",lin_reg.predict(X_new))

 

추가적으로 위에서 구한 최적의 세타값은 다음 두 가지 방법으로 계산이 가능하다.

 

1. scipy.linalg.lstsq() 함수로 직접 호출

theta_best_svd, residuals, rank, s = np.linalg.lstsq(X_b, y, rcond = 1e-6)
theta_best_svd

 

2. 무어-펜로즈 유사역행렬 (np.linalg.pinv())

np.linalg.pinv(X_b).dot(y)

 

https://angeloyeo.github.io/2020/11/11/pseudo_inverse.html

 

의사역행렬의 기하학적 의미 - 공돌이의 수학정리노트

 

angeloyeo.github.io

 

 

'핸즈온머신러닝&딥러닝' 카테고리의 다른 글

모델 훈련 3(다항 회귀, 학습 곡선, 규제)  (0) 2021.06.02
모델 훈련 2(경사 하강법)  (0) 2021.06.01
MNIST 활용, 분류 3  (0) 2021.05.27
MNIST 활용, 분류 2  (0) 2021.05.19
MNIST 활용, 분류  (0) 2021.05.18