본문 바로가기
DeepLearning Framework & Coding/Tensorflow 1.X

[코드로 이해하는 딥러닝 5] - 다중선형회귀(Multiple Linear Regression)

by 노마드공학자 2020. 12. 18.

[코드로 이해하는 딥러닝 0] - 글연재에 앞서 https://limitsinx.tistory.com/27

[코드로 이해하는 딥러닝 1] - Tensorflow 시작 https://limitsinx.tistory.com/28 

[코드로 이해하는 딥러닝 2] - Tensorflow 변수선언 https://limitsinx.tistory.com/29

[코드로 이해하는 딥러닝 3] - Tensorflow placeholder변수 https://limitsinx.tistory.com/30

[코드로 이해하는 딥러닝 4] - 선형회귀(Linear Regression) https://limitsinx.tistory.com/31

 

※이 전글에서 정리한 코드/문법은 재설명하지 않으므로, 참고부탁드립니다

 

[코드 전문]

이 전글에서는 (1,1), (2,2)를 지나는 직선을 "선형회귀(Linear Regression)"을 통해

구하는 방법에 대해 정리해보았습니다.

 

다중선형회귀(Multiple Linear Regression)은 선형회귀와 동일한데, 2차원에서 N차원으로 늘려보는 차이 뿐입니다.

 

(1,1) (2,2)를 지나는 Y=X라는 x,y좌표 2차원상의 직선을 구해보았다면,

이번에는 (1,2,3,4),(10,5,6,11)을 지나는 직선을 찾아보는것입니다. (4차원)

 

수식 또한, y= W1*x1 + W2*x2 + W3*x3 + b로, 기존의 Y=Wx + b보다 변수의 갯수가 늘어나게 되겠죠!

 

이게 끝입니다. 

복잡한 수학적 공식을 통한 최적화, 원하는 결과값 찾기는 컴퓨터가 알아서 다 해주니까요 :)

 

이번 문제는, 

 

"그래서 회귀(Regression)을 왜하는건데? , Weighting과 bias가 뭔데?"

 

에 대한 답변으로, 실생활 예시를 통해 정리해보겠습니다.

 

현재 우리는 민호,동수,진호,경진,미희 총 5명의 데이터를 가지고 있습니다.

 

그들 각각의 국어/수학/영어 점수가 있으며, 이를 통해 어떠한 보정을 통해 얻어낸 최종 Score가 있는데요

 

이때 현준이가 표와 같은 국영수 점수를 받았을때 최종 Score는 무엇일까요??

 

가지고 있는 학습데이터를 통해 y= W1*x1 + W2*x2 + W3*x3 + b 의 W1, W2, W3 , b를 모두 찾아내고

 

현준이의 국영수 점수를 수식에 대입하면 최종 Score가 나오게됩니다.

 

그렇게 하자면, 우린 W1 ,W2, W3, b를 알아야하죠!

 

이것을 Gradient Descent , Cost optimize를 통해 얻어 내는것이 머신러닝입니다!

참고 : [코드로 이해하는 딥러닝 4] - 선형회귀(Linear Regression) https://limitsinx.tistory.com/31

 

[코드 분석-1]

x1_data는 국어점수,

x2_data는 수학점수,

x3_data는 영어점수

 

W1,W2,W3,b 변수를 선언해주었고, x1~x3,y는 placeholder로 저장

Hypothesis(y추정값)= W1*x1 + W2*x2 + W3*x3 + b

 

※이 전글에서 정리한 코드/문법은 재설명하지 않으므로, 참고부탁드립니다

 

[코드 분석-2]

cost로 내가 추정한 값(Hypothesis)와 실제값(y)의 차이를 제곱하여 수식을 만들어주고,

 

cost function은 아래로 볼록한 이차함수가 되므로

 

미분했을때 0이 나오는 지점을 cost=0(최소) 찾아가며 W1,W2,W3,b를 하나씩 바꾸어가는 코드입니다.

 

해당 코드는 2001번 학습하도록 프로그래밍 했습니다.

 

이 부분의 Weighting과 bias값이 어떻게 나오는지 보기위해 코드를 아래와 같이 살짝 바꾸어보았습니다.

 

[코드 분석-2-1]

 

[결과값(2000번 학습)]

2000번 학습한 결과

W1 = 1.4955114

W2 = 1.0251813

W3 = -0.4571079

b= -3.3745909가 얻어졌습니다.

 

이를통해 유추해본 현준이의 Score는 약 194점이네요

 

 

 

Summary

 

5명의 국어 영어 수학 점수를 통해/ 다른 한명의 최종점수를 예측하는 방법에 대해 정리해보았습니다.

 

이것을 머신러닝 용어로 표현해보면, "5개의 training data로 3개의 feature에 대한 hypothesis를 정리하여

 

test set의 점수를 예측해본다" 라고 할 수 있습니다.

 

개인적으로, 회귀(Regression)는 머신러닝은 아직 아니고, "수치해석에서 왜 머신러닝으로 나아가게 되었는가?" 에 대한 교두보 역할을 할 수 있는 부분이라 생각합니다.

 

즉, 이부분을 잘 이해해야 앞으로 머신러닝이 돌아가는 방법에 대해 충분히 이해할 수 있다고 생각합니다.

 

[코드 공유]

import tensorflow.compat.v1 as tf

import numpy as np

tf.disable_v2_behavior()

 

x1_data = [73.93.89.96.73.]

x2_data = [80.88.91.98.66.]

x3_data = [75.93.90.100.70.]

y_data = [152.185.180.196.142.]

 

x1 = tf.placeholder(tf.float32)

x2 = tf.placeholder(tf.float32)

x3 = tf.placeholder(tf.float32)

Y = tf.placeholder(tf.float32)

 

w1 = tf.Variable(tf.random_normal([1]), name = 'weight1')

w2 = tf.Variable(tf.random_normal([1]), name = 'weight2')

w3 = tf.Variable(tf.random_normal([1]), name = 'weight3')

b = tf.Variable(tf.random_normal([1]),name = 'bias')

hypothesis = x1 * w1 + x2 * w2 + x3 * w3 + b

 

cost = tf.reduce_mean(tf.square(hypothesis - Y))

optimizer = tf.train.GradientDescentOptimizer(learning_rate=1e-5)

train = optimizer.minimize(cost)

 

sess = tf.Session()

sess.run(tf.global_variables_initializer())

for step in range(2001) : 

    cost_val, hy_val, _ = sess.run([cost, hypothesis, train],

    feed_dict = { x1 : x1_data, x2 : x2_data, x3 : x3_data, Y : y_data})

    if step % 1000 == 0 :

        print(step, "Cost : ",cost_val,"\nPrediction:\n",hy_val, 

        "\nWeight,bias :\n",sess.run(w1),sess.run(w2),sess.run(w3),sess.run(b))



 

 

댓글