고래밥 이야기
10.3 최소 제곱 선형 회귀 모델 구현 본문
머신러닝 교과서 with 파이썬, 사이킷런, 텐서플로를 참고하여 작성하였습니다.
# 안보고 코드를 구현하려고 노력하였기에 변수가 각각 틀릴 수도 있습니다..
# 코드 다 암기하기. 실력이 급하다.
# 10.2의 데이터를 불러와 사용하였습니다.
- 경사 하강법으로 회귀 모델의 파라미터 구하기
import numpy as np
class LinearRegressionGD:
def __init__(self, lr=0.001, n_iter=50):
self.lr = lr
self.n_iter = n_iter # 초기 값 설정, learning rate는 0.001로, n_iter=50으로 잡는다.
def fit(self, X, y):
self.w_ = np.zeros(1 + X.shape[1]) # w0, w1 ... 로 진행 되기에 w0인 1개를 더 붙인다.
self.cost_ = []
for _ in range(n_iter):
output = self.extemp_output(X)
error = y - output
self.w_[1:] = self.w_[1:] +self.lr * np.dot(X.T, error)
self.w_[0] = self.w_[0] + self.lr * error.sum()
cost = (error**2).sum() / 2.0
self.cost_.append(cost)
return self
def extemp_output(self, X):
return np.dot(X, self.w_[:1]) + self.w_[0]
def predict(self, X):
return self.extemp_output(X)
- 위의 식을 통해 직접 구현해보기.
X = df1[[5]].values # X를 2차원으로 만들기 위하여 [[]] 하였다.
y = df1[13].values # y를 1차원으로 표시하기 위하여 []하였다.
from sklearn.preprocessing import StandardScaler
sc_x = StandardScaler()
sc_y = StandardScaler()
X_std = sc_x.fit_transform(X)
y_std = sc.y.fit_transform(y[:,np.newaxis]).flatten()
#사실 굳이 이렇게 왜 하나 싶다. 시작 부터 2차원으로 만들어서 1차원으로 돌리지,,. 뭐 여튼 np.newaxis를 넣음으로써 2차원으로 만들고
#.flatten()을 사용함으로써 다시 1차로 만들었다.
# help(fit_transform)을 함으로써 2차원만을 원소로 받는 이유를 알 수 있다.
lr = LinearRegressionGD()
lr.fit(X_std, y_std)
- 위의 식을 통해 반복횟수와 비용함수를 비교해보자.
plt.plot(range(1, lr.n_iter +1),lr.cost_)
plt.ylabel("Sum_of_squre_of_error")
plt.xlabel("Epoch")
plt.show()
- 데이터와 선형함수를 직접 그려보자
import matplotlib.pyplot as plt
def lin_regplot(X, y, model):
plt.scatter(X, y, c="steelblue", edgecolor = "white", s=70)
plt.plot(X, model.predict(X), color = "black", lw =2)
lin_regplot(X_std, y_std, lr)
plt.show()
- 우리가 구한 것은 standardized된 값이 므로, 실제 값을 알기 위해서는,,,
num_rooms_std = sc_x.transform(np.array([[5]])) # x값에 5를 넣었고, 이를 standardize 진행하였다.
# transform은 2차원 데이터가 가능하므로, 일부로 [[5]]로 넣은 것이다.
price_std = lr.predict(num_rooms_std) # standardized 된 값으로 선형회귀를 진행 하였다.
print(sc_y.inverse_transform(price_std)) # 하지만 우리가 원하는 것은 standardize된 데이터가 아니다. 따라서 원래의 데이터로 돌리는 코드를 활용하였다.
- 실제로는,, 사이킷런으로 회귀모형을 구현한다.
from sklearn.linear_model import LinearRegression
slr = LinearRegression()
slr.fit(X,y)
print(slr.coef_[0]) # 기울기
print(slr.intercept_) # 절편
- 선형대수를 이용한 3가지 계산 방법
# 1(normal equation)
Xb = np.hstack((np.ones((X.shape[0], 1)), X)) # 1번째 열에 1을 그리고 나머지 열에는 X를 담겠다
z1 = np.linalg.inv(np.dot(Xb.T, Xb))
z2 = np.dot(Xb.T, y)
w = np.dot(z1, z2)
# 2(normal equation by qr decomposition)
Q, R = np.linalg.qr(Xb)
w = np.dot(np.linalg.inv(R), np.dot(Q.T, y))
# 3(normal eqution by svd decomposition)
w = np.dot(np.linalg.pinv(Xb), y)
'데이터 분석 > 머신러닝 교과서 with 파이썬, 사이킷런, 텐서플로' 카테고리의 다른 글
10.2 주택 데이터셋 탐색 (0) | 2022.01.18 |
---|---|
7.1 앙상블 학습 (0) | 2022.01.10 |
Comments