새소식

반응형
AI/ML*DL 시작하기

선형회귀 Python으로 구현하기

  • -
반응형

앞서 배운 선형회귀 분석을 Python으로 구현해보고자 합니다.

 

먼저 테스트할 데이터가 필요합니다.  

x,y 데이터 셋을 아래처럼 정의하겠습니다.

import tensorflow as tf

x_data = [1.,2.,3.,4.]
y_data = [1.,3.,5.,7.]

x와 y 데이터를 좌표에 찍어서 보면 데이터가 선형(linear)을 이루는것을 알 수 가 있습니다. 

 

이제 이 데이터 셋에 가장 적합한 선을 찾을 수 있도록 해보겠습니다. 

 

H(x) = w*x라는 임의의  가설(Hypothesis)을 세우도록 하겠습니다.

 

Python과 TensorFlow를 이용하여 아래처럼 작성해보겠습니다.

W = tf.Variable(tf.random_uniform([1],-1.0,1.0))
b = tf.Variable(tf.random_uniform([1],-1.0,1.0))

X = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)

hypothesis = W*X+b
cost = tf.reduce_mean(tf.square(hypothesis-Y))

머신러닝, 딥러닝이라는 학문에서 러닝(Learning)이란 부분이 여기서 적용이 됩니다. 

임의의 가설에서 학습을 통해 데이터 셋에 맞는 최적의 가설을 찾아내는 것이죠.

 

여기서 저희는 Cost함수를 사용하게 됩니다. 

이전에 사용했던 이미지 인데요, 학습전에는 H(x) = W*x+b에서 임의의 값을 입력하게되어 시작하게 됩니다.

예를 들면 H(x) = 3*x +1 인거죠, 하지만 여기서 저희 데이터셋은 파란색 선이라면 H(x) = 1*x에 가까워 져야 데이터셋에 최적화된 선형회귀 모델이 됩니다. 

 

Cost함수의 경우 실제 데이터와 예측하는 데이터의 차이 값을 나타냅니다. 

 예측값이 실제값과 차이가 없다면 실제값과 값다는 의미가 되며, Cost함수가 0에 가까울수록 예측률이 높다고 생각하시면 됩니다. 

 보통 학습을 진행할 수록 이 Cost값은 낮아지게 됩니다. 

 

TensorFlow의 경우 여러가지 Cost함수를 제공합니다. 먼저 GradientDescentOptimizer 함수를 사용하여 학습을 진행해보도록 하곘습니다. 총 2000번의 학습을 통해 어떤 W,b값이 나오는지 확인해보록 하겠습니다.

rate = tf.Variable(0.1)
optimizer = tf.train.GradientDescentOptimizer(rate)
train = optimizer.minimize(cost)

init = tf.initialize_all_variables()
with tf.Session() as sess:
    sess.run(init)
    for step in range(2001):
        #sess.run(train)
        sess.run(train,feed_dict={X:x_data, Y:y_data})
        if step %20 ==0:
            print(step+sess.run(cost,feed_dict={X:x_data,Y:y_data}),sess.run(W),sess.run(b))
    print(sess.run(hypothesis, feed_dict = {X:[10,20,55]}))

 

위 코드까지 작성이 완료되었다면 실행을 해볼까요?

 

학습이 진행될 수록 Cost값이 감소가 되는게 보이시나요? 

W값은 2 , b의 값은 0에 가깝게 나오게 됩니다. 

 

22.111652374267578 [3.1893992] [1.5368582]
20.05100181698799 [1.8125607] [0.5527702]
40.01511909533292 [1.8976654] [0.30087692]
60.004482163116336 [1.9442809] [0.16382086]
80.00132876553107 [1.9696622] [0.08919688]
100.00039391830796 [1.9834818] [0.04856573]
.
.
.
440.00000000000045 [1.9999995] [1.5916712e-06]
460.00000000000017 [1.9999998] [8.644946e-07]
480.0000000000001 [1.9999999] [6.022341e-07]
500.0000000000001 [1.9999999] [4.830249e-07]
520.0 [1.9999999] [2.5652744e-07]
540.0 [2.] [1.2539724e-07]
560.0 [2.] [1.13476304e-07]
580.0 [2.] [1.13476304e-07]
600.0 [2.] [1.13476304e-07]
620.0 [2.] [1.13476304e-07]
640.0 [2.] [1.13476304e-07]
660.0 [2.] [1.13476304e-07]
680.0 [2.] [1.13476304e-07]
.
.
.
1840.0 [2.] [1.13476304e-07]
1860.0 [2.] [1.13476304e-07]
1880.0 [2.] [1.13476304e-07]
1900.0 [2.] [1.13476304e-07]
1920.0 [2.] [1.13476304e-07]
1940.0 [2.] [1.13476304e-07]
1960.0 [2.] [1.13476304e-07]
1980.0 [2.] [1.13476304e-07]
2000.0 [2.] [1.13476304e-07]
[ 20.  40. 110.]

최적의 가설은 H(x)=2*x라고 나오게 되는거죠

그래서 마지막에 x값에 10,20,55를 각각입력하게되면 선형회귀모델의 예측값은 20,40,110이 나오게 됩니다.

다음 글에는 오늘 간단하게 짚고 넘어간 부분에 대해 조금더 자세하게 볼수있도록 하겠습니다.

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.