반응형
단순한 데이터
단순한 데이터를 가지고 단변량 선형회귀분석을 머신러닝 라이브러리를 사용하지 않고 구현해보기
x_data = np.array([1,2,3,4,5], dtype=np.float64).reshape(5,1)
y_data = np.array([3,5,7,9,11], dtype=np.float64).reshape(5,1)
W = np.random.randn(1,1) # 1행 1열짜리 ndarray, 0과1사이의 균등분포에서 실수 난수 추출
b = np.random.randn(1) # 1차원
# learning rate의 값 설정
learning_rate = 1e-4
print('W : ', W)
print('b : ', b)
W는 weight, b는 bias를 의미한다
y = Wx + b 이며
loss function은 MSE를 사용한다.
1. 다변수 함수의 모든 변수에 대해 편미분을 수행하는 함수
def numerical_derivative(f, x) : ## x는 input value
delta = 1e-4
derivative = np.zeros_like(x)
# iterator를 이용해서 입력변수 W, b 각각에 대한 편미분을 수행
it = np.nditer(x, flags=['multi_index'])
while not it.finished :
idx = it.multi_index
tmp = x[idx]
x[idx] = tmp + delta
fx_plus_delta = f(x)
x[idx]= tmp - delta
fx_minus_delta = f(x)
# 중앙 차분
derivative[idx] = (fx_plus_delta - fx_minus_delta) / (2*delta)
x[idx] = tmp
it.iternext()
return derivative ## 입력차원과 shape이 동일한 배열 리턴
2. 손실함수
def loss_function(input_value) : # input_value = [W, b]
input_W = input_value[0].reshape(1,1)
input_b = input_value[1]
# 예측값
y_pred = np.dot(x_data, input_W) + input_b
# loss function
mse = np.power(y_data - y_pred, 2).mean()
return mse
3. 예측 함수
def predict(x):
y = np.dot(x, W) + b
return y
이렇게 정의한 세 함수를 가지고 학습을 진행한다.
loss = []
for step in range(300000):
input_param = np.concatenate((W.ravel(), b.ravel()), axis=0) # [W, b]
derivative_result = learning_rate * numerical_derivative(loss_function, input_param)
W = W - derivative_result[0].reshape(1,1)
b = b - derivative_result[1]
loss.append(loss_function(input_param))
# if step % 30000 == 0 :
# print('W : ', W)
# print('b : ', b)
# print('loss : ', loss_function(np.concatenate((W.ravel(), b.ravel()), axis=0)))
loss라는 리스트는 loss가 줄어드는 것을 확인하기 위해 추가해주었고,
주석처리 된 부분은 W, b, loss가 변화되어가는 것을 확인할 수 있게 해주는 부분이다.
더보기
ndarray.ravel() : n차원의 ndarray를 1차원으로 바꾸어 줌.
학습을 완료하고 loss를 plot으로 그려보면 loss가 줄어드는 것을 확인할 수 있다.
학습결과
W : [[2.00000982]]
b : [0.99996454]
W는 2에 가깝게, b는 1에 가깝게 나왔다.
예측
print(predict([[6]]))
[[13.00000851]]
scikit-learn 사용하기
import numpy as np
from sklearn import linear_model
# Trainig Data Set
x_data = np.array([1,2,3,4,5], dtype=np.float64).reshape(5,1)
y_data = np.array([3,5,7,9,11], dtype=np.float64).reshape(5,1)
# model 객체 생성
model = linear_model.LinearRegression()
# model 학습
model.fit(x_data, y_data)
# parameter 확인
print('W: {}, b:{}'.format(model.coef_, model.intercept_))
# 예측
print(model.predict(np.array([[6]])))
W: [[2.]], b:[1.]
[[13.]]
단순한 데이터를 가지고 선형회귀를 진행해보았을 때는 사이킷런을 이용해서 학습한 것과 비슷한 결과가 나왔다.
실제 데이터
온도와 오존 데이터를 가지고 위와 같이 학습을 진행했다
전처리 하지 않았을때
python을 통해 학습한 모델과 사이킷런을 이용해 학습한 모델은 차이가 컸다
반응형
'AI' 카테고리의 다른 글
[ML] Classification Metrics (0) | 2022.04.12 |
---|---|
[ML] Model Evaluation & Regression Metrics (0) | 2022.04.08 |
[ML] Linear Regression (0) | 2022.03.28 |
파이썬으로 수치미분 구현하기 - 중앙차분 (0) | 2022.03.25 |
Machine Learning 개요 (0) | 2022.03.24 |