독립변수가 여러 개인 MultipleLlinear Regression(다중 선형 회귀)
→ Classical Linear Regression 기반으로 사용하고 있어요 →
지금까지는 i(독립변수)가 하나인 경우를 이야기했어요
예를 들어 독립변수 i 가 3개 라면 이렇게 바뀌어요
w 세게를 계산해야 해요 교환 법칙으로 식을 바꾸어 봐요.
w 가 3행 1열로 바뀌었어요!
# 독립변수가 3개인 multiple Linear Regression을 구현해 보아요!
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model
from scipy import stats
from sklearn.preprocessing import MinMaxScaler
### 수치 미분 함수 ###
def numerical_derivative(f, x):
delta_x = 1e-4
derivative_x = np.zeros_like(x)
it = np.nditer(x, flags=['multi_index'])
while not it.finished:
idx = it.multi_index
tmp = x[idx]
x[idx] = tmp + delta_x
fx_plus_deltax = f(x)
x[idx] = tmp - delta_x
fx_minus_deltax = f(x)
derivative_x[idx] = (fx_plus_deltax - fx_minus_deltax) / (2 * delta_x)
x[idx] = tmp
it.iternext()
return derivative_x
############################
# Raw Data Loading
df = pd.read_csv('./data/ozone/ozone.csv', sep=',')
# display(df)
training_data_set = df[['Solar.R', 'Wind', 'Temp', 'Ozone']]
# display(training_data_set.head())
# # 1. 결치값부터 처리해야 해요!
training_data = training_data_set.dropna(how='any')
# display(training_data.shape) # (111, 4)
# # 2. 이상치를 처리해야 해요!
zscore_threshold = 1.8
# # Ozone에 대한 이상치(outlier) 처리
outlier = training_data['Ozone'][np.abs(stats.zscore(training_data['Ozone'])) > zscore_threshold]
training_data = training_data.loc[~(training_data['Ozone'].isin(outlier))]
# display(training_data) # 104 rows × 4 columns, 입력값 전체에 대해 scling
# 3. Normalization(정규화) - Min-Max Normalization
# scaling 작업을 수행하는 객체를 하나 생성(입력값 처리 , Label처리 총 두 개 생성)
scaler_x = MinMaxScaler() # 입력값 전체에 대해 scaling
scaler_y = MinMaxScaler()# label 1개
scaler_x.fit(training_data.iloc[:,:-1].values)
scaler_y.fit(training_data['Ozone'].values.reshape(-1,1))
training_data.iloc[:,:-1] = scaler_x.transform(training_data.iloc[:,:-1].values)
training_data['Ozone'] = scaler_y.transform(training_data['Ozone'].values.reshape(-1,1))
# display(training_data)
# Training Data Set
x_data = training_data.iloc[:,:-1].values
t_data = training_data['Ozone'].values.reshape(-1,1)
# Weight & bias를 정의
W = np.random.rand(3,1)
b = np.random.rand(1)
def predict(x):
return np.dot(x,W) + b # y = Wx + b
def loss_func(input_obj): # [W1의 값, W2의 값, W3의 값, b의 값] 1차원 ndarray, W의 값이 세게로 구성되어 있어요 각각 편미분 3번!
input_w = input_obj[:-1].reshape(-1,1) # 행렬곱 연산을 수행해야 하니까 2차원으로 표현
input_b = input_obj[-1:]
# 평균 제곱 오차를 구해야 해요! => loss함수의 값.
y = np.dot(x_data,input_w) + input_b # 3행 1열 행렬곱
return np.mean(np.power((t_data-y),2))
learning_rate = 1e-4 # loss값을 보고 조절해요
# 반복학습을 진행
for step in range(300000):
input_param = np.concatenate((W.ravel(), b.ravel()), axis=0) # [W1의 값, W2의 값, W3의 값, b의 값]
result_derivative = learning_rate * numerical_derivative(loss_func,input_param)
W = W - result_derivative[:-1].reshape(-1,1)
b = b - result_derivative[-1:]
if step % 30000 == 0:
print('loss : {}'.format(loss_func(input_param))) #loss : 0.024591176425830932
# 학습이 끝났으니 Prediction을 해 보아요!
# display(df)
scaled_predict_data = scaler_x.transform([[180,10,62]])
print(scaled_predict_data)
scaled_result = predict(scaled_predict_data)
# # 원래 값으로 복구해야 해요!
print(scaler_y.inverse_transform(scaled_result)) ##[[7.90431924]]
# sklearn으로 구현한 내용과 비교해보면 될 듯해요!
df = pd.read_csv('./data/ozone/ozone.csv', sep=',')
# display(df)
training_data_set = df[['Solar.R', 'Wind', 'Temp', 'Ozone']]
# display(training_data_set.head())
# # 1. 결치값부터 처리해야 해요!
training_data = training_data_set.dropna(how='any')
# display(training_data.shape) # (111, 4)
# # 2. 이상치를 처리해야 해요!
zscore_threshold = 1.8
# # Ozone에 대한 이상치(outlier) 처리
outlier = training_data['Ozone'][np.abs(stats.zscore(training_data['Ozone'])) > zscore_threshold]
training_data = training_data.loc[~(training_data['Ozone'].isin(outlier))]
# display(training_data) # 104 rows × 4 columns
model = linear_model.LinearRegression()
model.fit(training_data[['Solar.R','Wind','Temp']].values,
training_data['Ozone'].values.reshape(-1,1))
result = model.predict([[180,10,62]]) # [[11.0682182]]
print(result)
[[11.0682182]]
'머신러닝 딥러닝' 카테고리의 다른 글
0901 Classification (0) | 2021.09.01 |
---|---|
0901 TensorFlow (0) | 2021.09.01 |
0831 정규화(Normalization) (0) | 2021.08.31 |
0830 linear regression 데이터 전처리 (0) | 2021.08.30 |
0827Machine Learning에서Linear Regression (0) | 2021.08.27 |
댓글