머신러닝

1-10 Multi Variables Linear Regression 할아버지 시계 입찰가 연습 예제

coding art 2018. 2. 21. 20:01
728x90

머신 러닝 분야의 regression  예제들은 통계학과 밀접한 관계가 있으며 아래의 인터넷 주소

http://www.statsci.org/data/multiple.html 에서 참조할 수 있는
할아버지 시계 입찰 사례이다. 아래의 인터넷 주소를 참조하여 data 파일을 다운하여 사용하기로 한다.

http://www.statsci.org/data/general/auction.html

 

상태가 좋은 골동품 할아버지 시계의 시카고 경매 시장 입찰가는 골동품의 연수와 경쟁하는 경매자 수의 영향을 받아 결정된다.

 즉 할아버지 시계 경매 입찰가는 학습을 위한 2개의 데이터로 구성되는 입력 값에 대한 학습을 위한 출력 데이터로 볼 수 있다.

1개의 출력 값에 대해 2개의 입력 데이터가 필요하므로 다변수(Multi Variables) 예제로 볼 수 있다.

할아버지 시계의 제작년도가 오래 될수록 골동품의 가치 상승효과가 있으며 아울러 입찰자 수가 많음에 따라 입찰 가격이 상승하게 된다. 시장에서의 신품 할아버지 시계의 가격은 300∼400 달러 선임을 참조하자.

할아버지 시계 나이(Age)를 x1 입찰자 수를 x2 실제 입찰 가격을 y 라하고 표의 데이터를 분석하자.

이 자료로부터 다음과 같이 학습을 위한 입력 데이터와 출력 데이타를 준비한다.

x1_data = [127,115,127]
x2_data = [13,12,7]
y_data = [1235,1080,845]

학습을 시작하기 위해서 w1, w2 및 b 값을 난수로 초기화하여 시작 한다. 하지만 계산의 반복성 즉 시뮬레이션을 되풀이 할 경우에도 동일한 결과를 얻기 위해서 난수 생성을 위한 seed를 항상 동일하게 설정하면 좋을 듯하다.
   tf.set_random_seed(777)

이 seed  숫자를 변경하게 되면 Gradient Decent 계산 결과 값들이 크게 변화될 수도 있으므로 주의하기 바란다.

이 3가지 데이터를 처리하기 위해서 실수형 placeholder를 사용하기로 한다.
hypothesis는 X*W + b 는 다음과 같이 설정한다.
 
w1 과 w2 및 b 는 각각 random_normal([1]) 형태의 난수로 두기로 한다.

cost  함수는 (hypothesis-y)를 제곱하여 합친 후 평균을 취하도록 한다.
leraning_rate = 0.00005로 두고 학습을 4000 회 시킨 후 결과 스텝 수, cost 값, hypothesis 값을 400 회마다 출력해 보자.


cost는 500 가까이 값을 가질 때까지 빨리 수렴하지만 그 이상에서는 수렴 속도가 아주 느려진다. 아울러 leraning_rate = 0.00005 이상에서는 발산해버리므로 주의하기 바란다. 주어진 출력 값에 대한 hypothesis 값 수치계산의 오차는 2.5% 이내이다.

1235:1204(97.5%) 1080:1103(102%)  845:856(101%)

다변수 회귀분석에 의해 결정한 weight들을 사용하여 1235달러 할아버지 시계 값을 예측해보면 2.5% 의 오차를 가지는 1204 달러로 예상된다는 뜻이다.

 

 

multi_variableㄴ_linear_reg_clock_01.py

 

# multi_variables_linear_reg_clock_01.py

 

import tensorflow as tf

 

x1_data = [127, 115, 127]

x2_data = [13, 12, 7]

y_data = [1235, 1080, 845]

 

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

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

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

 

hypothesis = x1_data * W1 + x2_data * W2 + b

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

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.00005)

train = optimizer.minimize(cost)

 

sess = tf.Session()

sess.run(tf.global_variables_initializer())

 

 

for step in range(4001):

    sess.run(train)

    if step % 400 == 0:

        #print(step, sess.run(cost), sess.run(hypothesis), sess.run(W1), sess.run(W1), sess.run(b))

        print(step, sess.run(cost), sess.run(hypothesis))