본문 바로가기
머신러닝 딥러닝

0831 MultipleLlinear Regression

by 대금부는개발자 2021. 8. 31.
SMALL

독립변수가 여러 개인 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]]

LIST

'머신러닝 딥러닝' 카테고리의 다른 글

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

댓글