안경잡이개발자

728x90
반응형

다변인 선형회귀를 활용한 배추 가격 예측 AI 개발하기 3강 - 다변인 선형회귀 모델 개발하기

나동빈


  이번 시간에는 지난 시간에 수집한 데이터를 이용하여 다변인 선형회귀로 학습 모델을 만들어 볼 것입니다.


※ 데이터 준비하기 ※


  가장 먼저 지난 시간에 정제해 놓은 학습 데이터를 준비합니다.



※ 다변인 선형회귀 ※


  다변인 선형회귀는 모델에 영향을 미치는 변인이 여러 개 일 때 사용하는 모델입니다. 현재 우리의 데이터에서는 변인이 '평균 온도', '최저 온도', '최고 온도', '강수량'이므로 이 모든 변인이 '가격'에 영향을 미친다고 감안해야 합니다. 따라서 가중치(Weight)을 고려했을 때 다음과 같은 수식을 세울 수 있습니다.


  H(x1, x2, x3, x4) = x1w1 + x2w2 + x3w3 + x4w4


  이는 행렬의 곱을 이용하면 다음과 같이 간단하게 표현할 수 있습니다.


  H(X) = XW


  이를 소스코드에 그대로 옮기면 됩니다. 다만 학습의 보폭(Step)을 적절히 선택해야 안정적으로 학습이 가능할 것입니다. 저는 학습률을 0.000005로 설정하여 되도록 짧은 시간에 정확한 결과가 나오도록 구현해보았습니다.


※ 파이썬 소스코드 ※


  파이썬에서 텐서플로우(Tensorflow) 라이브러리를 활용해 다변인 선형회귀 모델을 구현합니다.


import tensorflow as tf

import numpy as np

from pandas.io.parsers import read_csv


model = tf.global_variables_initializer();


data = read_csv('price data.csv', sep=',')


xy = np.array(data, dtype=np.float32)


# 4개의 변인을 입력을 받습니다.

x_data = xy[:, 1:-1]


# 가격 값을 입력 받습니다.

y_data = xy[:, [-1]]


# 플레이스 홀더를 설정합니다.

X = tf.placeholder(tf.float32, shape=[None, 4])

Y = tf.placeholder(tf.float32, shape=[None, 1])


W = tf.Variable(tf.random_normal([4, 1]), name="weight")

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


# 가설을 설정합니다.

hypothesis = tf.matmul(X, W) + b


# 비용 함수를 설정합니다.

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


# 최적화 함수를 설정합니다.

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

train = optimizer.minimize(cost)


# 세션을 생성합니다.

sess = tf.Session()


# 글로벌 변수를 초기화합니다.

sess.run(tf.global_variables_initializer())


# 학습을 수행합니다.

for step in range(100001):

    cost_, hypo_, _ = sess.run([cost, hypothesis, train], feed_dict={X: x_data, Y: y_data})

    if step % 500 == 0:

        print("#", step, " 손실 비용: ", cost_)

        print("- 배추 가격: ", hypo_[0])


# 학습된 모델을 저장합니다.

saver = tf.train.Saver()

save_path = saver.save(sess, "./saved.cpkt")

print('학습된 모델을 저장했습니다.')



※ 저장된 모델 확인하기 ※


  이제 위 소스코드를 실행하면 됩니다. 결과적으로 향후 사용자가 날씨 정보를 입력했을 때 배추 가격을 바로 보여줄 수 있도록 학습 모델이 파일 형태로 저장된 것을 확인할 수 있습니다.




728x90
반응형

Comment +2

  • chunccc1004 2020.02.29 22:22

    학습시키는 부분에서
    cost_, hypo_, _=sess.run([cost, hypothesis, train], feed_dict={X:x_data, Y:y_data})은 뭘 의미하는거에요??

  • 2020.06.03 16:11

    비밀댓글입니다