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의 평균 제곱근 편차 (즉 표준 오차)를 계산하고, 이를 최소화하는 방향으로 모델을 설계한다.
이를 조금 더 직관적으로 표현해보면
- MSE (평균 제곱 오차)
4.2 정규 방정식
비용 함수를 최소화하는 세타 값(편향 + 가중치)을 찾기 위한 해석적인 방법
편미분을 통해 수학적으로 모수를 구하는 공식이다. 주어진 회귀식(행렬식) Y=XΘ 이 가지는 비용함수 MSE를 Θ에 대하여 미분해서 0이 되게 하는 Θ값 (변곡점)을 구하는 과정이다. 즉, 비용함수 MSE를 최소화하는 최적의 해 Θ를 구하는 것과 같다. 증명 과정은 아래와 같다.
행렬에 대한 미분
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 |