Machine Learning/Advanced (hands on machine learning)

6. 모델훈련 - 선형 회귀

jwjwvison 2021. 5. 18. 20:04

 일반적으로 선형 모델은 다음 식 처럼 입력 특성의 가중치 합과 편향(bias)(또는 절편)이라는 상수를 더해 예측을 만든다.

 이 식은 벡터 형태로 더 간단하게 쓸 수 있다.

 

 훈련 세트 X에 대한 선형 회귀 가설 h(세타) MSE는 다음 식 처럼 계산한다.

 

 비용 함수를 최소화하는 세타값을 찾기 위한 해석적인 방법이 있다. 이를 정규방정식 이라고 한다.

 

 이 공식을 테스트하기 위해 선형처럼 보이는 데이터를 생성해보자.

import numpy as np
import matplotlib.pyplot as plt


X=2*np.random.rand(100,1)
y=4+3*X+np.random.randn(100,1)
X_b=np.c_[np.ones((100,1)),X]     #모든 샘플에 x0=1을 추가한다.
theta_best=np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)  

 

 이 데이터를 생성하기 위해 사용한 함수는 y=4+3x1+가우시안_잡음 이다. 정규방정식으로 계산한 값을 확인해보자.

theta_best

 

 세타햇을 사용해 예측을 해보자.

X_new=np.array([[0],[2]])
X_new_b=np.c_[np.ones((2,1)),X_new]   # 모든 샘플에 x0=1을 추가

y_predict = X_new_b.dot(theta_best)
y_predict

 

 모델의 예측을 그래프에 나타내보자

plt.plot(X_new,y_predict,'r-')
plt.plot(X,y,'b.')
plt.axis([0,2,0,15])
plt.show()

 

 사이킷런에서 선형 회귀를 수행하는 것은 간단하다

from sklearn.linear_model import LinearRegression

lin_reg=LinearRegression()
lin_reg.fit(X,y)

lin_reg.intercept_,lin_reg.coef_   # 편향, 가중치

lin_reg.predict(X_new)

 

 linearRegression 클래스는 scipy.linalg.lstsq() 함수를 기반으로 한다.

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