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

머신 러닝(Machine Learning) - 선형 회귀 모델링 Analystical Solution 사용 방법

by ★√★ 2021. 2. 28.

안녕하세요, 오늘 포스팅 할 내용은 머신러닝의 한 부분인, 선형 모델링  Analystical Solution  대한 내용입니다. 요즘 핫한 내용인 머신 러닝(Machine Learning) 구현을 위해 구현해야 되는 모델을 도출하기 위해서 사용되는 방법 중에 하나 입니다.

 

선형-회귀-모델링-Analystical-Solution

 

머신 러닝(Machine Learning)은 요즘 일상 생활속에서 너무나도 많이 이용되는 기술이라, 익숙하게 들으셨을 거라고 생각합니다. 선형 모델링  Analystical Solution은 그 중에 하나의 방법이라고 생각하시면 됩니다. 하지만 그 내면에는 어떻게 이뤄졌는지는 잘 모르시는 분들이 많을 거라고 생각합니다. 그래서 제 나름대로 공부한 내용을 정리해서 설명 드리도록 하겠습니다. 

 

 

머신러닝(Machine Learning)

 

: 이전 포스팅에도 말씀 드렸지만, 머신 러닝(Machine Learning)은 기계를 학습 시킨다라는 Definition을 가지고 있습니다. 하지만 어떤 방법으로 Training을 할지에 대해서는 여러 방법이 있습니다. 그 중에 하나가, 제가 이전 포스팅한 Chatbot Training이 있을 수도 있고, 오늘 소개 드릴 선형 모델 구현을 통한 Training이 있을 수 있습니다. 

 

 

 

선형 모델이란?

 

: 선형 모델은, 일정한 규칙의 식을 가지고 있는 식이라고 생각하시면 됩니다. 그 식을 유추하고, 분석하여 도출하기 위해서는, 소위 말하는 Data가 필요합니다. 이 Data를 다시 세분화 하면, 입력값과 출력값이라고 쉽게 말할 수 있습니다. 가장 간단한 선형모델은, 우리가 중, 고등학교 때 배웠던, 방정식 식을 생각하시면 됩니다. 

 

 : y = ax + b (예)

 

- 위의 식에서, 입력 값은 x, 출력값은 y로 가지고, a, b를 도출하는 것입니다. 정말 간단한 것 처럼 보이지만, 이 부분을 여러가지 경우의 수로 계산하는 과정이 사람의 손으로 하기에는 너무나도 많은 시간과 에너지가 들어갑니다. 그런데, 이 부분을, 컴퓨터에 수행을 시키고, 최적의 a, b를 출력하여, 그 모델을 가지고, 원하는 수행을 하는 것입니다. 

 

 

선형 회귀 모델 (Linear Regression) 구현 - Analystical Solution

 

: 위에서 설명드린 내용을 기반으로, 선형 모델 중에 하나인 "선형 회귀 모델 (Linear Regression)" 을 어떻게 분석하고, 모델링을 도출 하는지에 대해서, 설명 드리도록 하겠습니다. 모델링 구현 방식 중에, Analystical Solution을 이용하도록 하겠습니다.

 

- 기본 수식은 아래와 같습니다. 

  1) 기본 모델링 수식 : y = ax + b 

  2) 새로운 모델링 구현 수식 : y(new) = X'P (P 는 새로운 parameter)

  3) Error 율 측정 식 : Error = (y - y(new))**2 (**2 <- "2" 제곱) 

  4) 모델링 구현을 위한 Method : Analystical Solution

 

- 쉬운 이해를 돕기 위해서 아래와 같이 예제 코드를 통해서 설명 드리도록 하겠습니다. 아래 Code는 선형 모델을 도출하기 위한 Library와 위에서 말씀 드린 기존에 가지고 있어야 할 입력 값과 그 입력 값에 따른 출력 값입니다.  

 

 

==============================================================================

 

# 기본적으로 선언할 라이브러리는 아래와 같습니다. 

import numpy as np                               # 모든 수학적인 수식을 구현하기 위한 라이브러리
from matplotlib import pyplot as plt     # 그래프를 구현하기 위한 라이브러리
import matplotlib.pyplot as plt

# 선형 모델링을 위해서, 아래와 같이 임의 입력값과 그 입력 값에 따른 출력 값을 선언해 줌.


test_resource1 = np.array([[5, 6],[5.3, 6.2],[5.8, 7],[6, 7.3],[6.3, 7.4],[7, 8],[7.9, 9],[8.8, 9.1],
                                             [8.9, 9.2],[9.2, 10.6],[9.5, 10.9],[10, 11.9],[10.8, 12.1],[11.5, 14],[12, 15.3]])

# 기존 데이터의 분포를 표에 나타내줌

plt.figure(1)
plt.scatter(test_resource1[:, 0], test_resource1[:, 1])
plt.title("Test Data named test_resource1")
plt.xlabel("x")
plt.ylabel("y")
plt.show()

 

==============================================================================

 

- 위 코드를 실행 시켜 보면 아래와 같은 그래프를 보실 수 있습니다. 즉, X 축에는 입력 값이, Y 축에는 그 입력값에 따른 출력값이 표현이 되고 있습니다. 점선을 통해서 표현하였습니다. 위 코드에서 점선으로 표현하는 코드는 아래와 같습니다. 

 

plt.scatter(test_resource1[:, 0], test_resource1[:, 1])

 

 

- 그럼 위의 Data를 가지고 선형 모델링을 수행해보도록 하겠습니다. 일단 처음 모델링하는 작업은 제가 임의의 Parameter를 가지고 출력값을 뽑아 보도록 하겠습니다. 즉, 수계산이나 대충 Parameter가 이 정도면 되겠지라는 느낌으로 구현해보도록 하겠습니다. 

 

==============================================================================

 

# 첫번째 열과 두번 째 열을 test_resource1 로 부터 분리
# 첫번째 열에 대해서, 분리하여, (필요한 행 x 1) 형태로 구현, "-1"은 필요한 대로 만들어라는 의미임.
test_data1 = test_resource1[:,0].reshape(-1,1)

# 두 번째 열에 대해서, 분리하여, (필요한 행 x 1) 형태로 구현, "-1"은 필요한 대로 만들어라는 의미임.
test_data2 = test_resource1[:,1].reshape(-1,1)

# 첫번째 열에 대해서, 분리하여, (필요한 행 x 1) 형태로 구현한 Data를 출력
print('test_data1 의 Data 값은 :\n', test_data1,'\n')

# 첫번째 열에 대해서, 분리하여, (필요한 행 x 1) 형태로 구현한 Data를 출력
print('test_data2 의 Data 값은 : \n',test_data2,'\n')

# 임의의 모델링을 만들어서, 값을 구현시켜 봄.
Test_Pre1 = 1.5*test_data1-1
Test_Pre2 = 1.8*test_data1-2

# 임의의 모델링을 만든 것을 Graph에 뿌려주기 위해서, 아래와 같이 코드를 구현함.
plt.figure(2)
plt.scatter(test_data1, test_data2, label='Given Data')
plt.plot(test_data1,Test_Pre1, label='Test_Pre1')
plt.plot(test_data1,Test_Pre2, label='Test_Pre2')
plt.legend(loc='upper left')
plt.title("First Test Parameter Verification")
plt.xlabel("x_axis")
plt.ylabel("y_axis")
plt.show()



========================================================================

 

- 위 코드를 실행해보면 아래와 같은 결과 값을 보실 수 있습니다. 즉, 주어진 Data(Given Data)와 거리차가 나는 것을 확인 하실 수 있습니다. 이 부분은, 여러가지 추측으로 하면 차이가 많이 나는 것을 보여 드리기 위해서 세팅한 사항입니다. 그럼 추가적으로 Analystical Solution을 이용하여 모델링을 도출해보도록 하겠습니다. 

 

 

 

Analystical Solution을 통해 도출하는 Code는 아래와 같습니다. 간단하게 말씀 드리면, 새로운 모델링 구현 수식 [ y(new) = X'P ] 의 X' 를 구해서, Error 율 측정 식 [ Error = (y - y(new))**2 (**2 <- "2" 제곱) ] 을 구현하는 과정이라고 생각하시면 됩니다.  

 

========================================================================

 

# Y = ax + b 식에서, Y = X'P로 구현하여, Parameter 식을 구현하려고 식을 변환함.



# Parameter를 구하기 위해서, X 값(test_data1)을 Modification 함, 첫번째 열에 "1" 을 나열하여, Insert 함.

    axis= 1 (열 방향), 0(행 방향)

x_data_mod = np.insert(test_data1, 0, 1, axis=1)



print(x_data_mod)      # X' 값이 잘 들어갔는지에 대해서 확인함. 
print(x_data_mod.T)   # x_data_mod.T 의 의미는 x_data_mod를 열과 행을 바꿔졌다라고 이해하시면 됨.


# Y = ax + b 식에서, Y = X'P로 구현하여, Parameter 식을 구현하려고, Analytical solution을 이용함.



# "Error = (y - y(new))**2" 를 미분하면, P(new) = X'T * X * X'T * Y 가 되고, 이 부분을 계산하는 Code는 아래와

 같습니다.   

Parameter _new= np.linalg.inv(x_data_mod.T.dot(x_data_mod)).dot(x_data_mod.T).dot(test_data2)
print(Parameter _new)  # 이건 그냥 제가 Parameter 
Parameter _new_a = Paramenter_new[1,0]
Parameter_new_b = Paramenter_new[0,0]



# 입력값에 따른, 출력값을 보여주는 새로운 모델링 식입니다. 

y_new_analytical = Paramenter_new_a*test_data1 + Paramenter_new_b

# 검토를 마친 Parameter를 이용한 모델을 이용하여, 실제 데이터를 입력하여, 출력되는 값을 확인 할수 있음.

plt.figure(2)
plt.scatter(test_data1, test_data2, label='data')
plt.plot(test_data1, y_new_analytical, 'r--', label='predict_analytical')
plt.legend(loc='upper left')
plt.title("Linear model, Analytical solution")
plt.xlabel("x")
plt.ylabel("y")
plt.show()

 

===================================================================

 

- 위 코드를 수행을 시켜 보면 아래와 같은 결과 값을 도출 할 수 있습니다. 즉 주어진 Data(Given Data)와 거의 비슷한 경향을 보이는 것을 확인 하실 수 있습니다. 즉 이런 모델링을 구현하게 되면, 입력 값에 따른, 결과 값을 추측을 할 수 있다는 것입니다. 그렇게 되면, 어떤 결과가 나올지를 예측이 가능하므로, 추가적으로 필요한 사항을 미리 구현하거나, 예측이 가능한 것입니다. 

 

 

이상입니다. 지금까지 머신러닝의 한 부분인, 선형 모델링  Analystical Solution  대해서 포스팅을 작성하였습니다. 요즘 핫한 내용인 머신 러닝(Machine Learning) 구현을 위해 구현해야 되는 모델이라서 그런가 공부하는 자료는 많았던 거 같습니다. 

 

정말 설명은 간단한 거 같은데, 식을 이해하는 게 좀 힘든 거 같습니다. 비전공자한테는 수학적인 지식이 먼저 습득하지 않으면 위 사항을 쉽게 이해하지는 못할 거 같습니다. 간단한 행렬곱, 선형대수학 등의 지식 습득도 동반이 되야 된다라고 생각합니다. 요즘에는 하나 하나 배우면서 느끼는 건데, 정말 이런 모델링이 있으면, 입력값에 따라 출력값을 예측할 수 있겠구나라는 생각에, 저도 모르게, 먼가 대단한 것을 한 거 같은 느낌이 들더라구요. 정말 아무것도 아닌 한 걸음만 갔을 뿐인데, 이런 느낌이 드는데, 이것을 개발하고, 현재 기술에 적용하시는 분들은 정말 대단하다고 생각합니다. 저도 그분들과 어깨를 나란히 할 날을 상상하며, 더 열심히 공부하도록 하겠습니다. 제 포스팅을 읽으시는 분들도, 같이 공부하고 같이 성장하시죠! 

 

제 Posting이 조금이나마 정보 전달에 도움이 되셨길 빌며, 되셨다면, 구독, 댓글, 공감 3종 세트 부탁 드립니다. 감사합니다. 

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

728x90

댓글