5.4.1. Keras로 분석한 선형 회귀

텐서플로우 단원에서 설명 드렸던 선형회귀를 케라스로 구현해 보겠습니다. 선형 회귀에 대한 이론적인 설명은 이전 단원을 참고해 주십시요. 여기에서는 그냥 케라스가 이렇게 간단하구나 정도만 확인 하시면 됩니다.

아래 예제는 몸무게, 나이, 혈중 지방함량에 대한 케라스 분석입니다. 이 예제는 https://pinkwink.kr/1082?category=580892 를 참조했습니다.

먼저 다룰려는 데이터는

X09.TXT

입니다. 그 내용은

먼저 필요한 모듈을 import하고, 데이터도 numpy를 이용해서 그냥 읽습니다.

 import tensorflow as tf
 import numpy as np
 import matplotlib.pyplot as plt
 import keras
 from keras.models import Sequential
 from keras.layers.core import Dense
 from keras.optimizers import RMSprop
 from mpl_toolkits.mplot3d import Axes3D

 raw_data = np.genfromtxt('x09.txt', skip_header=36)

 xs = np.array(raw_data[:,2], dtype=np.float32)
 ys = np.array(raw_data[:,3], dtype=np.float32)
 zs = np.array(raw_data[:,4], dtype=np.float32)

 #====   입력 데이터를 보기위한 테스트 코드  =====
 fig = plt.figure(figsize=(12,12))
 ax = fig.add_subplot(111, projection='3d')
 ax.scatter(xs, ys, zs)
 ax.set_xlabel('Weight')
 ax.set_ylabel('Age')
 ax.set_zlabel('Blood fat')
 ax.view_init(15, 15)

 plt.show()

어떤 데이터 인지 궁급하여 한번 그려보았습니다. 다음과 같은 3차 그래프가 만들어 졌습니다.

텐서플로우를 사용하여 알아내고 싶은건 위의 데이터를 하나의 직선으로 표현하려는 것입니다. 일단 읽은 데이터를 변환하고 placeholder로 X, Y도 선언해 둡니다.

전체 코드를 보면 다음과 같습니다.

 import tensorflow as tf
 import numpy as np
 import matplotlib.pyplot as plt
 import keras
 from keras.models import Sequential
 from keras.layers.core import Dense
 from keras.optimizers import RMSprop
 from mpl_toolkits.mplot3d import Axes3D

 raw_data = np.genfromtxt('x09.txt', skip_header=36)

 xs = np.array(raw_data[:,2], dtype=np.float32)
 ys = np.array(raw_data[:,3], dtype=np.float32)
 zs = np.array(raw_data[:,4], dtype=np.float32)

 x_data = np.array(raw_data[:,2:4], dtype=np.float32)
 y_data = np.array(raw_data[:,4], dtype=np.float32)
 y_data = y_data.reshape((25,1))

 rmsprop = RMSprop(lr=0.01)
 model = Sequential()
 model.add(Dense(1,input_shape=(2,)))
 model.compile(loss='mse',optimizer=rmsprop)
 model.summary()

 hist = model.fit(x_data, y_data, epochs=1000)

 print(hist.history.keys())



print("100Kg 40세 혈중지방함량치=",model.predict(np.array([100,40]).reshape(1,2)))
print("60Kg 25세 혈중지방함량치=",model.predict(np.array([60,25]).reshape(1,2)))

 W_, b_ = model.get_weights()

 x = np.linspace(20, 100, 50).reshape(50,1)
 y = np.linspace(10, 70, 50).reshape(50,1)

 X = np.concatenate((x,y), axis=1)
 Z = np.matmul(X, W_) + b_

 fig = plt.figure(figsize=(12,12))
 ax = fig.add_subplot(111, projection='3d')
 ax.scatter(x, y, Z)
 ax.scatter(xs, ys, zs)
 ax.set_xlabel('Weight')
 ax.set_ylabel('Age')
 ax.set_zlabel('Blood fat')
 ax.view_init(15, 15)

 plt.show()
_________________________________________________________________
Layer (type)                 Output Shape              Param #  
=================================================================
dense_1 (Dense)              (None, 1)                 3         
=================================================================
Total params: 3
Trainable params: 3
Non-trainable params: 0
100Kg 40세 혈중지방함량치= [[350.53384]]
60Kg 25세 혈중지방함량치= [[219.5949]]

Last updated