UOMOP

확률적 경사 하강법 using algorithm (boston) 본문

Ai/DL

확률적 경사 하강법 using algorithm (boston)

Happy PinGu 2022. 2. 1. 19:23

Stochastic Gradient Descent(확률적 경사 하강법)은 학습 데이터 셋에서 하나의 샘플만을 이용해서 가중치와 절편을 update하게 된다.

하나의 샘플만을 이용해서 선형식을 업데이트하지만 Batch Gradient Descent와 비교해보았을 때 크게 차이나지 않는 것이 특징이다.


1. 데이터 불러오기

import numpy as np
import pandas as pd
from sklearn.datasets import load_boston

boston = load_boston()
boston_df = pd.DataFrame(boston.data, columns = boston["feature_names"])
boston_df["PRICE"] = boston.target

2. SGD 함수 선언

def sgd(feature, target, learning_rate, iter_epochs, verbose):
    
    bias = np.random.rand(1,)
    w1   = np.random.rand(1,)
    w2   = np.random.rand(1,)
    
    
    print("####### 최초 bias, w1, w2 #######\n")
    print("bias : {}\tw1 : {}\tw2 : {}\n\n\n".format(bias, w1, w2))
    
    for i in range(iter_epochs) :
        
        
        sgd_index = np.random.choice(len(target), 1)
    
        feature_1 = feature[sgd_index, 0]
        feature_2 = feature[sgd_index, 1]
        target_in = target[sgd_index]
            
        N = len(target_in)
            
        predict = bias + w1 * feature_1 + w2 * feature_2
        diff    = target_in - predict
    
        bias_update = -(2/N) * learning_rate * (np.dot(np.ones((N,)), diff))
        w1_update   = -(2/N) * learning_rate * (np.dot(feature_1.T, diff))
        w2_update   = -(2/N) * learning_rate * (np.dot(feature_2.T, diff))
        
        
        ##########################################################################
        
        predict_for_loss = bias + w1 * feature[:, 0] + w2 * feature[:, 1]
        
        diff_for_loss = target - predict_for_loss
        
        err = np.mean(np.square(diff_for_loss))
        
        #########################################################################
        
        bias = bias - bias_update
        w1   = w1 - w1_update
        w2   = w2 - w2_update
        
        
        if verbose == True :
            
            print("Epoch(   {}/{})\tbias : {}\tw1 : {}\tw2 : {}\terror : {}"
                                                .format(i+1, iter_epochs, bias, w1, w2, err))
            
    return bias, w1, w2
확률적 경사 하강법은 506개의 샘플 중에서 하나의 샘플만을 이용해서 선형식의 가중치와 절편을 업데이트하게 된다. 
np.random.choice(A, B) 는 0~(A-1) 정수에서 B개 만큼 난수를 뽑아낸다.
np.random.choice을 이용해서 랜덤한 인덱스를 받고 동일한 샘플의 feature, target을 찾아서 선형식을 업데이트한다. 

여기서, 주의 할 점은 loss(MSE)이다. bias, w1, w2는 한 샘플의 data만을 이용해서 update시켰지만 MSE는 모든 데이터에 값을 확인해야한다. 따로 loss을 위한 변수들을 설정해주고 MSE를 출력하였다.

3. feature 전처리 (Scaling)

from sklearn.preprocessing import MinMaxScaler

mms = MinMaxScaler()
scaled_feature = mms.fit_transform(boston_df[["RM", "LSTAT"]])

4. SGD를 통해서 가중치, 절편 확인

bias, w1, w2 = sgd(scaled_feature, boston_df["PRICE"], learning_rate = 0.01, 
                                                            iter_epochs = 5000, verbose = True)



5. 도출해낸 가중치, 절편으로 선형식을 완성하고, 예측 진행

z = bias + w1 * scaled_feature[:, 0] + w2 * scaled_feature[:, 1]

print(z)


6. 예측 결과를 DataFrame에 추가

boston_df["PREDICT_using_hand"] = z

boston_df.head()

 

 

 

 

 

 

 

 

 

 

Comments