728x90

Linear Regression이란 ?


 

 Linear Regression(선형 회귀)는 우리가 찾아낼 수 있는 가장 직관적이고 간단한 모델인 선(line)을 이용하여 데이터들이 최대한 선에 가까운지 회귀하면서 분석하는 방법을 Linear Regression(선형 회귀)라고 한다.

 

 

이러한 선형 회귀 함수는 1차 함수의 형태로 아래의 꼴로 표현이 된다

H(x) = wx + b

 

여기서 데이터 들이 1차함수 꼴로 되어있는 H(x)와 학습 과정에서 얼마나 다른지 Loss를 구해야하는데 이때 알아야하는 것이 우리가 흔히 말하는 손실 함수 linear regression cost function (loss function)에 대해서 알아야 됩니다.

 

이 손실 함수는 아래의 식과 같은 꼴로 선형 회귀 방식에서 사용을 하며, 제곱의 형태를 취해서 차이가 양수나 음수일때를 구분하지 않아도 계산이 가능하게 하는것을 목표로 한다.

(H(x) - y)^2

 

이런 방식은 평균 제곱 오차(mean squared error) 즉, Tensorflow나 Pytorch와 같은 딥러닝 프레임 워크 코딩에서 많이 보이는 MSE 방식이다.

 

위의 설명을 종합하여 Linear Regression(선형 회귀)의 최종목표는 모든 데이터로부터 나타나는 오차의 평균을 최소화할 수 있는 최적의 기울기(Weight)와 절편(Bias)을 찾는것을 목표로 한다.

 

Linear Regression 구현


이제 간단한 Linear Regression을 Tensorflow 환경에서 구현 해봅시다.

데이터세트인 x가 1,2,3 y가 1,2,3이라는 값을 가진다고 가정하고 Linear Regression 코드를 구현해보면 아래와 같습니다.

 

 

그래프로 표현되어진 데이터 세트

 

import tensorflow as tf

x_train = [1,2,3]
y_train = [1,2,3]

w = tf.Variable(tf.random.normal([1]), name='weight')
b = tf.Variable(tf.random.normal([1]), name='bias')

hypothesis = x_train * w + b

 

위의 코드를 설명하자면 먼저 학습 데이터 세트를 선언하고 1차함수를 만들기 위해 w와 b를 선언해주는데 tf.random.normal([1])을 이용하여 값이 1개로 이루어진 1차원 랜덤 배열 값을 선언한 후 w는 weight(가중치) b는 bias로 설정한 후 그 값을 Variable 이라는 텐서를 메모리에 저장하는 변수에 저장하는 코드이다.

 

여기서 Variable은 명시적으로 초기화되어야 하며, 학습뒤에 디스크에 저장하고 필요할 때 다시 불러오는 것이 가능한 변수이며, 모델을 학습 시킬 때 파라미터(매개 변수) 업데이트와 유지를 위해 변수를 사용하는 용도이다.

 

#cost/loss function 
cost = tf.reduce_mean(tf.square(hypothesis - y_train))
#Minimize
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost)

위의 코드는 cost(loss) 함수를 선언해줘서 오차율을 구하는 cost와 optimizer를 이용해서 값을 minimize해주는 train을 선언해주는 부분이다.

 

#그래프가 구성될수 있도록 세션을 선언
sess = tf.Session()
#variable을 사용할 수 있도록 해주는 작업
sess.run(tf.global_variables_initializer())

for step in range(2001):
    sess.run(train)
    if step % 20 == 0:
        print(step, sess.run(cost), sess.run(w), sess.run(b))

위의 코드는 그래프가 텐서플로우에 구성될 수 있도록 세션을 구성하고 선언한 세션을 구동할 수 있도록 variable를 tf.global_variables_initializer()를 통해 사용가능하게 한 후 총 2000번의 step을 통해 학습을 진행하면 아래와 같은 결과를 얻을 수 있습니다.

 

0~2000 step 결과

step이 증가 될수록 오류율(loss)은 감소되었고 기울기는 1에 가까이 수렴해지고 bias는 0에 수렴해지는 결과를 얻을 수 있습니다.

 

 

Linear Regression을 palceholder로 구현해보기


 

tf.placeholder같은 경우는 데이터 세트가 필요한 상황에 값을 넣는 것이 가능하다는 장점을 가지고 있습니다.

placeholder의 코드는 아래와 같습니다.

 

import tensorflow as tf

x_placehold = tf.placeholder(tf.float32, shape=[None])
y_placehold = tf.placeholder(tf.float32, shape=[None])

w_placehold = tf.Variable(tf.random.normal([1]), name='weight')
b_placehold = tf.Variable(tf.random.normal([1]), name='bias')

hypothesis_placehold = x_placehold * w_placehold + b_placehold

cost_placehold = tf.reduce_mean(tf.square(hypothesis_placehold - y_placehold))

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train_placehold = optimizer.minimize(cost_placehold)

#그래프가 구성될수 있도록 세션을 선언
sess_placehold = tf.Session()
#variable을 사용할 수 있도록 해주는 작업
sess_placehold.run(tf.global_variables_initializer())

for step in range(2001):
    cost_val, w_val, b_val, _ = sess_placehold.run([cost, w, b, train],
                feed_dict={x_placehold: [1,2,3,4,5], y_placehold: [2.1,3.1,4.1,5.1,6.1]})
    if step % 20 == 0:
        print(step, cost_val, w_val, b_val)

placeholder 방식은 위의 x와 y값을 직접 먼저 지정하는 방식과는 다르게 하나의 프레임워크를 구현해놓은 상태에서 step을 진행할 때 직접 넣는 방식으로 되어있습니다. 그래서 상황에 맞춰서 값을 대입하게만 해놓는다면 수고를 덜을수 있다는 장점이 있습니다.

 

1~2000 placeholder 방식 결과

아까와 같이 오류율은 0에 수렴해가고 있고, 기울기는 1, bias는 0에 수렴해가는 것을 위의 결과를 통해 알 수 있습니다.

 

아래의 실습 코드는 텐서플로위 1.15버전에서 진행되었습니다. 진행이 안되시면 텐서플로우 버전을 확인하시면 됩니다.

728x90

+ Recent posts