본문 바로가기
파이썬 (Python)/딥러닝 (Deep Learning)

Python 딥러닝 다중 선형 회귀 경사 하강법

by ★√★ 2021. 6. 10.
 안녕하세요 이번 포스팅은 오차를 계산해서 이상적인 모델을 도출하는 경사 하강법 중에 변수가 하나가 아닌 2개일때 어떻게 코드를 구현하는지에 대해서 설명드리도록 하겠습니다. 물론 이 방법도 선형 회귀 방법을 하는 과정에서 오차를 줄여가면서 이상적인 모델의 기울기와 y 절편을 구하는 방식인 건 동일합니다.

 

경사 하강법

 

: 경사 하강법에 대해서 먼저 설명드리도록 하겠습니다. 경사 하강법은 경사 하강법은 임의의 기울기를 잡고 구했을 때는 오차 값이 큰 단점을 보완하기 위해 임의의 기울기와 y 절편을 대입했을 때 발생하는 오차에 대해서 검토를 해보고 그 오차를 최소한으로 줄이는 방법으로 이상적인 모델을 구축할 수 있는 기울기 "a"와 y절편을 구하는 방법입니다. 그리고 여기에서는 추가적으로 인지를 하셔야 하는 게 오차와 기울기의 2차 함수 곡선에서 기울기가 "0" 일 때의 오차 값을 구하는 것입니다.

 

▼ 아래 그림을 보시면 맨 아래 기울기가 "0" 지점이 올 때까지 계속적으로 계산을 하는 것입니다. 그런데 이번에 적용할 경사 하강법은 변수가 1개 이상 즉 2개일 때 어떻게 적용하는지에 대해서 설명드리려고 합니다. 

이차-함수
경사-하강법-이차함수

 

다중 선형회귀 경사 하강법 코드 구현

 

: 위에서 설명 드린 경사 하강법 중에 다중 선형 회귀 경사 하강법에 대해서 코드를 구현해보도록 하겠습니다. 다중 선형 회귀 경사 하강법은 변수가 하나가 아닌 하나 이상의 경우를 위한 코드를 구현하는 것입니다. 즉 기울기가 한 개가 아닌 한 개 이상입니다. 너무 여러 개를 하게 되면 복잡하니까 일단 변수 2개 = 기울기 2개의 케이스를 가지고 코드를 구현해보도록 하겠습니다.

 

▼ 이전에 포스팅한 경사 하강법에서는 변수가 하나였는데, 이번에는 변수가 2개이기 때문에 하나의 조건을 더 설정을 해줘야 합니다. 

 

 변수 1개일때 적용한 경사 하강법에 대해서는 아래 포스팅을 참조하시면 됩니다. 여기에서 부가적으로 설명을 드리면 변수가 1개 이상일 경우에는 조건이 그만큼 늘어난다라고 생각하시면 됩니다.

 

 

Python 딥러닝 경사 하강법

안녕하세요 이번 포스팅은 오차를 계산해서 이상적인 모델을 도출하는 경사 하강법에 대해서 설명드리도록 하겠습니다. 물론 이 방법도 선형 회귀 방법을 하는 과정에서 오차를 줄여가면서 이

davey.tistory.com

 

 즉 늘어나는 것을 입력이라고 생각하고 결과값은 y 그대로라고 생각하시면 되고, y절편 또한 그대로 적용을 하시면 됩니다. 왜냐하면 y절편의 경우에는 상수이기 때문에 조건을 따로 주어지지 않아도 되기 때문입니다. 그리고 y절편을 여러 개 하더라도 덧셈 뺄셈처럼 상수 안에서 사칙 계산이 되는 것이기 때문에 굳이 y절편에 대해서는 1개 이상 설정하지 않으셔도 됩니다. 그럼 아래와 같이 코드를 구현해보도록 하겠습니다. 코드 구현할 때 어차피 사칙 계산이 다 나와있기 때문에 수식에 대해서는 추가적으로 설명은 드리지 않는 걸로 하겠습니다. 

 

# 필요한 라이브러리를 선언
import numpy as np
import matplotlib.pyplot as plt

# 필요한 Source Data를 선언
# 이전 포스팅에서 사용한 Source Data에 커피를 마신 횟수만 추가
T_W = [2, 4, 6, 8,10]
No_Coffee = [0, 3, 4, 2, 1]
Math_Score = [81, 93, 91, 97, 99]

# 리스트를 다른 형태로 불러오는 코드, 참조만 하시면 될 거 같습니다.
T_W_R = [i for i in T_W]
No_Coffee_R = [i for i in No_Coffee]
Math_Score_R = [i for i in Math_Score]

# 3차원이기 때문에 세 분면을 이용해서 그래프를 구현하여야 합니다. 
# 그래서 project Value를 '3d'로 해서 설정을 하였습니다. 
# 각 분면의 label도 각각 설정을 하였습니다.
# value 값들은 점으로 표시하는 scatter로 선언하였습니다.

graph_1 = plt.axes(projection ='3d')
graph_1.set_xlabel('Weekly Study Time')
graph_1.set_ylabel('Number of having Coffee')
graph_1.set_zlabel('Math Score')
graph_1.dist = 11
graph_1.scatter(T_W_R, No_Coffee_R, Math_Score_R)
plt.show()

다중-선형-회귀
다중-선형-회귀

 

▼ 위 코드를 구현 후 실행을 해보면 위의 그림과 같이 세 분면의 그래프로 표현이 되는 걸 확인하실 수 있습니다. 왜냐하면 지금 입력값은 2개이고, 출력 값은 1개이기 때문에 단순한 두 개의 차원으로는 표현하기 힘들기 때문입니다. 

 그럼 이 Source Data를 가지고 경사하강법을 통해 기울기 a1, a2 그리고 y절편 b를 구해보도록 하겠습니다. 경사 하강법을 위한 코드는 아래와 같습니다. 참고로 출력되는 내용은 epoch 횟수를 1000으로 했고, 100번째마다 출력이 되는 것으로 설정을 하였습니다. 

 

# 각 변수의 값을 배열로 치환하는 코드
x1_axis_data = np.array(T_W_R)
x2_axis_data = np.array(No_Coffee_R)
y_axis_data = np.array(Math_Score_R)

# Error 체크를 하여 에러와 기울기 그래프에서 기울기가 '0'으로 가까워지기 위해서
# 수행하는 검토 횟수
epochs = 1001

# 학습률 선언
rate = 0.02

# 기울기 a1, a2 그리고 b의 초기값
a1 = 0
a2 = 0
b = 0

# 에러와 기울기가 '0'으로 가까워지기 위한 a1, a2, b를 구하는 코드
for i in range(epochs):
    predict_value = a1 * x1_axis_data + a2 * x2_axis_data + b

    difference = y_axis_data - predict_value

    v1 = -(2/len(x1_axis_data)*sum(x1_axis_data*difference))
    v2 = -(2/len(x2_axis_data)*sum(x2_axis_data*difference))
    v3 = -(2/len(x1_axis_data)*sum(difference))

# 학습률이 적용되는 수정된 a1, a2, b
    a1 = a1 - rate * v1
    a2 = a2 - rate * v2
    b = b - rate * v3

# 100번째마다 출력되는 값
    if i % 100 == 0:
        # print(a1, a2, b)
        print("epoch=%.02f, 기울기 a1=%.02f, 기울기 a2=%.02f, y 절편 %.02f" % (i, a1, a2, b))

 

위 코드를 실행을 해보면 아래와 같이 결과 값을 보실 수 있습니다. 즉 a1 = 1.98, a2 = 1.05, b는 78.21로 구할 수 있는 것을 확인하실 수 있습니다. 처음 a1, a2, b를 비교해보면서 정말 많은 차이가 나는 걸 확인하실 수 있습니다.

 

▼ 여기에서 학습률을 조금이라도 크게 하면 overflow가 발생할 수도 있으니 이 점은 인지하시고 학습률과 코드를 구현하는 횟수를 여러 번 변경을 해서 차이점을 비교해보는 걸 추천드립니다. 

epoch=0.00, 기울기 a1=22.77, 기울기 a2=7.49, y 절편 b=3.69
epoch=100.00, 기울기 a1=6.31, 기울기 a2=6.59, y 절편 b=35.32
epoch=200.00, 기울기 a1=4.42, 기울기 a2=4.19, y 절편 b=53.87
epoch=300.00, 기울기 a1=3.36, 기울기 a2=2.82, y 절편 b=64.45
epoch=400.00, 기울기 a1=2.75, 기울기 a2=2.04, y 절편 b=70.48
epoch=500.00, 기울기 a1=2.41, 기울기 a2=1.60, y 절편 b=73.92
epoch=600.00, 기울기 a1=2.21, 기울기 a2=1.35, y 절편 b=75.88
epoch=700.00, 기울기 a1=2.10, 기울기 a2=1.20, y 절편 b=77.00
epoch=800.00, 기울기 a1=2.03, 기울기 a2=1.12, y 절편 b=77.64
epoch=900.00, 기울기 a1=2.00, 기울기 a2=1.07, y 절편 b=78.00
epoch=1000.00, 기울기 a1=1.98, 기울기 a2=1.05, y 절편 b=78.21

 

 이상입니다. 지금까지 오차를 계산해서 이상적인 모델을 도출하는 경사 하강법 중에 변수가 하나가 아닌 2개일때 어떻게 코드를 구현하는지에 대해서 포스팅을 작성하였습니다. 선형 회귀라는 방법은 동일하지만 변수의 개수에 따라 적용하는 경사 하강법 코드가 달라지는 점은 인지하시고 코드를 구현하시는 걸 추천드립니다. 그럼 이만 마무리하도록 하겠습니다. 감사합니다. 

 

[저작권이나, 권리를 침해한 사항이 있으면 언제든지 Comment 부탁 드립니다. 검토 후 수정 및 삭제 조치하도록 하겠습니다. 그리고, 기재되는 내용은 개인적으로 습득한 내용이므로, 혹 오류가 발생할 수 있을 가능성이 있으므로, 기재된 내용은 참조용으로만 봐주시길 바랍니다. 게시물에, 오류가 있을 때도, Comment 달아 주시면, 검증 결과를 통해, 수정하도록 하겠습니다.] 

 

관련 다른 글

728x90

댓글