Keras

시계열 수치입력 예측모델 레시피(다층퍼셉트론 신경망 모델)

이부일 2018. 1. 2. 16:25

# 1. 사용할 패키지 불러오기

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from keras.utils import np_utils
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, LSTM, Dropout
%matplotlib inline



# 2. 함수 만들기
def create_dataset(signal_data, look_back = 1):
dataX, dataY = [], []
for i in range(len(signal_data) - look_back):
        dataX.append(signal_data[i:(i + look_back), 0])
        dataY.append(signal_data[(i + look_back), 0])

return np.array(dataX), np.array(dataY)

look_back = 40



# 3. 데이터 핸들링
signal_data = np.cos(np.arange(1600)*(20*np.pi/1000))[:, None]


# 3.1 데이터 전처리
scaler = MinMaxScaler(feature_range = (0, 1))
signal_data = scaler.fit_transform(signal_data)


# 3.2 데이터 분리
train = signal_data[0:800]
val = signal_data[800:1200]
test = signal_data[1200:]


# 3.3 데이터 생성
x_train, y_train = create_dataset(train, look_back)
x_val, y_val = create_dataset(val, look_back)
x_test, y_test = create_dataset(val, look_back)


# 3.4 데이터 전처리
x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))
x_val = np.reshape(x_val, (x_val.shape[0], x_val.shape[1], 1))
x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1))

x_train = np.squeeze(x_train)
x_val = np.squeeze(x_val)
x_test = np.squeeze(x_test)



# 4. 모델 구성하기
model = Sequential()
model.add(Dense(32, input_dim = 40, activation = "relu"))
model.add(Dropout(0.3))
for i in range(2):
        model.add(Dense(32, activation = "relu"))
        model.add(Dropout(0.3))
model.add(Dense(1))



# 5. 모델 학습과정 설정하기
model.compile(loss='mean_squared_error', optimizer='adagrad')



# 6. 모델 학습시키기 
hist = model.fit(x_train, y_train, epochs=200, batch_size=32, validation_data=(x_val, y_val))



# 7. 학습과정 살펴보기
plt.plot(hist.history["loss"])
plt.plot(hist.history["val_loss"])
plt.ylim(0.0, 0.15)
plt.ylabel("loss")
plt.xlabel("epoch")
plt.legend(["train", "val"], loc = "upper left")
plt.show()

자동 대체 텍스트를 사용할 수 없습니다.



# 8. 모델 평가하기
trainScore = model.evaluate(x_train, y_train, verbose = 0)
print("Train Score : ", trainScore)

valScore = model.evaluate(x_val, y_val, verbose = 0)
print("Validation Score : ", valScore)

testScore = model.evaluate(x_test, y_test, verbose = 0)
print("Test Score : ", testScore)

자동 대체 텍스트를 사용할 수 없습니다.



# 9. 모델 사용하기
look_ahead = 250
xhat = x_test[0, None]
predictions = np.zeros((look_ahead, 1))

for i in range(look_ahead):
        prediction = model.predict(xhat, batch_size = 32)
        predictions[i] = prediction
        xhat = np.hstack([xhat[:, 1:], prediction])


plt.figure(figsize = (12, 5))
plt.plot(np.arange(look_ahead), predictions, "red", label = "prediction")
plt.plot(np.arange(look_ahead), y_test[:look_ahead], label = "prediction")
plt.legend()
plt.show()

자동 대체 텍스트를 사용할 수 없습니다.



[출처] 블록과 함께하는 파이썬 딥러닝 케라스, 김태영 지음, DigitalBooks, p253~260