Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Multivariate Time Series Regression

이성주 (c) 2018

seongjoo@codebasic.io

import os.path
from datetime import datetime

import numpy as np
import pandas as pd
from pandas import Series, DataFrame

from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.metrics import r2_score
from sklearn.model_selection import train_test_split

from keras.models import load_model
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM

import matplotlib.pyplot as plt
%matplotlib inline
from deepy.timeseries import time_step_seq

주중 미국 대사관 북경 대기오염 측정 자료

Beijing PM2.5 Data Set (UCI-ML)

data = pd.read_csv(
    '../data/uci-ml/beijing-pm25.csv',
    index_col=0,
    parse_dates=[['year', 'month', 'daxgy', 'hour']],
    date_parser=lambda dt_str: datetime.strptime(dt_str, '%Y %m %d %H')
)

data.index.name = 'datetime'
time_index = data.index
data = data.drop(columns='No')
data[:5]
Loading...

누락된 값 처리

data = data.fillna(data['pm2.5'].mean())
data.shape
(43824, 8)
axes = data.plot(subplots=True, figsize=(10, 10))
<Figure size 720x720 with 7 Axes>
x1t1,x2t1,...,xnt1ytx^{t-1}_1, x^{t-1}_2, ... , x^{t-1}_n \rightarrow y^{t}

One Hot Encoding

data = pd.get_dummies(data)
data[:5]
Loading...

스케일 조정

scaler = MinMaxScaler()
data = scaler.fit_transform(data)

시계열 데이터를 지도학습의 입력으로 사용하기 위한 형상 형성

X: ..., X(t-1), X(t)
Y: X(t+1), X(t+2), ...

X, Y = time_step_seq(data, look_back=0, look_forward=1)
X.shape
(43823, 1, 11)
Y.shape
(43823, 1, 11)
y = Y[:, 0, 0]
y
array([ 0.09920847, 0.09920847, 0.09920847, ..., 0.01006036, 0.00804829, 0.01207243])

Train/Test

X_train, X_test, y_train, y_test = train_test_split(X, y, shuffle=False)
X_train.shape
(32867, 1, 11)
DataFrame(X_train[:, -1, :])[:3]
Loading...

모델 구성

model_filepath = '../outputs/mv-rnn-ts1.h5'
train_history_filepath = '../outputs/train-history-mv-rnn-ts1.csv'
time_steps = X.shape[1]
data_dim = X_train.shape[-1]
if os.path.exists(model_filepath):
    model = load_model(model_filepath)
else:    
    model = Sequential()
    model.add(LSTM(50, input_shape=(time_steps, data_dim)))
    model.add(Dense(1))
    model.compile(loss='mae', optimizer='adam')
    # train
    history = model.fit(
        X_train, y_train, epochs=50, batch_size=72, shuffle=False, validation_split=0.2)
    # save model
    model.save(model_filepath)
    train_result = DataFrame(history.history)
    # save train results
    train_result.to_csv(train_history_filepath, encoding='utf-8')
Train on 26293 samples, validate on 6574 samples
Epoch 1/50
26293/26293 [==============================] - 2s 61us/step - loss: 0.0379 - val_loss: 0.0934
Epoch 2/50
26293/26293 [==============================] - 1s 57us/step - loss: 0.0190 - val_loss: 0.0489
Epoch 3/50
26293/26293 [==============================] - 1s 57us/step - loss: 0.0148 - val_loss: 0.0352
Epoch 4/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0139 - val_loss: 0.0247
Epoch 5/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0136 - val_loss: 0.0202
Epoch 6/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0134 - val_loss: 0.0188
Epoch 7/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0134 - val_loss: 0.0195
Epoch 8/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0134 - val_loss: 0.0173
Epoch 9/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0134 - val_loss: 0.0177
Epoch 10/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0134 - val_loss: 0.0174
Epoch 11/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0133 - val_loss: 0.0161
Epoch 12/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0133 - val_loss: 0.0174
Epoch 13/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0133 - val_loss: 0.0192
Epoch 14/50
26293/26293 [==============================] - 2s 58us/step - loss: 0.0134 - val_loss: 0.0154
Epoch 15/50
26293/26293 [==============================] - 2s 63us/step - loss: 0.0133 - val_loss: 0.0155
Epoch 16/50
26293/26293 [==============================] - 2s 58us/step - loss: 0.0132 - val_loss: 0.0166
Epoch 17/50
26293/26293 [==============================] - 2s 59us/step - loss: 0.0133 - val_loss: 0.0165
Epoch 18/50
26293/26293 [==============================] - 2s 58us/step - loss: 0.0132 - val_loss: 0.0171
Epoch 19/50
26293/26293 [==============================] - 2s 58us/step - loss: 0.0132 - val_loss: 0.0163
Epoch 20/50
26293/26293 [==============================] - 1s 57us/step - loss: 0.0132 - val_loss: 0.0170
Epoch 21/50
26293/26293 [==============================] - 2s 59us/step - loss: 0.0134 - val_loss: 0.0169
Epoch 22/50
26293/26293 [==============================] - 2s 61us/step - loss: 0.0133 - val_loss: 0.0146
Epoch 23/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0131 - val_loss: 0.0148
Epoch 24/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0132 - val_loss: 0.0158
Epoch 25/50
26293/26293 [==============================] - 2s 58us/step - loss: 0.0132 - val_loss: 0.0166
Epoch 26/50
26293/26293 [==============================] - 2s 58us/step - loss: 0.0132 - val_loss: 0.0175
Epoch 27/50
26293/26293 [==============================] - 2s 63us/step - loss: 0.0132 - val_loss: 0.0148
Epoch 28/50
26293/26293 [==============================] - 2s 58us/step - loss: 0.0132 - val_loss: 0.0153
Epoch 29/50
26293/26293 [==============================] - 2s 58us/step - loss: 0.0132 - val_loss: 0.0149
Epoch 30/50
26293/26293 [==============================] - 2s 59us/step - loss: 0.0131 - val_loss: 0.0173
Epoch 31/50
26293/26293 [==============================] - 2s 58us/step - loss: 0.0132 - val_loss: 0.0162
Epoch 32/50
26293/26293 [==============================] - 2s 58us/step - loss: 0.0131 - val_loss: 0.0169
Epoch 33/50
26293/26293 [==============================] - 2s 58us/step - loss: 0.0132 - val_loss: 0.0176
Epoch 34/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0132 - val_loss: 0.0172
Epoch 35/50
26293/26293 [==============================] - 2s 58us/step - loss: 0.0132 - val_loss: 0.0173
Epoch 36/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0131 - val_loss: 0.0153
Epoch 37/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0131 - val_loss: 0.0162
Epoch 38/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0131 - val_loss: 0.0158
Epoch 39/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0132 - val_loss: 0.0161
Epoch 40/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0132 - val_loss: 0.0166
Epoch 41/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0132 - val_loss: 0.0164
Epoch 42/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0131 - val_loss: 0.0153
Epoch 43/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0130 - val_loss: 0.0161
Epoch 44/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0131 - val_loss: 0.0157
Epoch 45/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0131 - val_loss: 0.0166
Epoch 46/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0131 - val_loss: 0.0159
Epoch 47/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0131 - val_loss: 0.0161
Epoch 48/50
26293/26293 [==============================] - 1s 56us/step - loss: 0.0131 - val_loss: 0.0157
Epoch 49/50
26293/26293 [==============================] - 1s 57us/step - loss: 0.0131 - val_loss: 0.0161
Epoch 50/50
26293/26293 [==============================] - 2s 57us/step - loss: 0.0131 - val_loss: 0.0156
if os.path.exists(train_history_filepath):
    train_result = pd.read_csv(train_history_filepath)
train_result[['loss', 'val_loss']].plot()
<Figure size 432x288 with 1 Axes>
y_pred_train = model.predict(X_train)
train_score = r2_score(y_train, y_pred_train)
train_score
0.90750741054958128
y_pred_test = model.predict(X_test)
test_score = r2_score(y_test, y_pred_test)
test_score
0.93237214897655485
train_size = len(X_train)
xs_train = np.arange(train_size)
xs_test = np.arange(train_size, len(y))
plt.plot(y)
plt.plot(xs_train, y_pred_train)
plt.plot(xs_test, y_pred_test)
<Figure size 432x288 with 1 Axes>

1Stacked LSTM

model_filepath = '../outputs/mv-rnn-stacked-ts1.h5'
train_history_filepath = '../outputs/train-history-mv-rnn-stacked-ts1.csv'
if os.path.exists(model_filepath):
    model = load_model(model_filepath)
else:    
    model = Sequential()
    model.add(LSTM(50, return_sequences=True, input_shape=(time_steps, data_dim)))
    model.add(LSTM(50))
    model.add(Dense(1))
    model.compile(loss='mae', optimizer='adam')
    # train
    history = model.fit(
        X_train, y_train, epochs=50, batch_size=72, shuffle=False, validation_split=0.2)
    # save model
    model.save(model_filepath)
    train_result = DataFrame(history.history)
    # save train results
    train_result.to_csv(train_history_filepath, encoding='utf-8')
Train on 26293 samples, validate on 6574 samples
Epoch 1/50
26293/26293 [==============================] - 3s 112us/step - loss: 0.0412 - val_loss: 0.0540
Epoch 2/50
26293/26293 [==============================] - 3s 99us/step - loss: 0.0149 - val_loss: 0.0257
Epoch 3/50
26293/26293 [==============================] - 3s 101us/step - loss: 0.0139 - val_loss: 0.0208
Epoch 4/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0138 - val_loss: 0.0197
Epoch 5/50
26293/26293 [==============================] - 3s 99us/step - loss: 0.0136 - val_loss: 0.0179
Epoch 6/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0135 - val_loss: 0.0178
Epoch 7/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0134 - val_loss: 0.0153
Epoch 8/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0134 - val_loss: 0.0149
Epoch 9/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0136 - val_loss: 0.0153
Epoch 10/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0134 - val_loss: 0.0151
Epoch 11/50
26293/26293 [==============================] - 3s 101us/step - loss: 0.0133 - val_loss: 0.0157
Epoch 12/50
26293/26293 [==============================] - 3s 101us/step - loss: 0.0133 - val_loss: 0.0160
Epoch 13/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0136 - val_loss: 0.0159
Epoch 14/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0133 - val_loss: 0.0158
Epoch 15/50
26293/26293 [==============================] - 3s 101us/step - loss: 0.0133 - val_loss: 0.0173
Epoch 16/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0132 - val_loss: 0.0159
Epoch 17/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0133 - val_loss: 0.0171
Epoch 18/50
26293/26293 [==============================] - 3s 102us/step - loss: 0.0133 - val_loss: 0.0164
Epoch 19/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0133 - val_loss: 0.0170
Epoch 20/50
26293/26293 [==============================] - 3s 99us/step - loss: 0.0133 - val_loss: 0.0170
Epoch 21/50
26293/26293 [==============================] - 3s 101us/step - loss: 0.0133 - val_loss: 0.0160
Epoch 22/50
26293/26293 [==============================] - 3s 99us/step - loss: 0.0131 - val_loss: 0.0162
Epoch 23/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0132 - val_loss: 0.0174
Epoch 24/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0132 - val_loss: 0.0168
Epoch 25/50
26293/26293 [==============================] - 3s 99us/step - loss: 0.0133 - val_loss: 0.0171
Epoch 26/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0134 - val_loss: 0.0177
Epoch 27/50
26293/26293 [==============================] - 3s 101us/step - loss: 0.0134 - val_loss: 0.0172
Epoch 28/50
26293/26293 [==============================] - 3s 99us/step - loss: 0.0133 - val_loss: 0.0169
Epoch 29/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0134 - val_loss: 0.0176
Epoch 30/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0133 - val_loss: 0.0179
Epoch 31/50
26293/26293 [==============================] - 3s 102us/step - loss: 0.0134 - val_loss: 0.0175
Epoch 32/50
26293/26293 [==============================] - 3s 102us/step - loss: 0.0133 - val_loss: 0.0179
Epoch 33/50
26293/26293 [==============================] - 3s 104us/step - loss: 0.0133 - val_loss: 0.0170
Epoch 34/50
26293/26293 [==============================] - 3s 101us/step - loss: 0.0133 - val_loss: 0.0166
Epoch 35/50
26293/26293 [==============================] - 3s 102us/step - loss: 0.0133 - val_loss: 0.0177
Epoch 36/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0133 - val_loss: 0.0173
Epoch 37/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0133 - val_loss: 0.0180
Epoch 38/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0133 - val_loss: 0.0170
Epoch 39/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0133 - val_loss: 0.0173
Epoch 40/50
26293/26293 [==============================] - 3s 101us/step - loss: 0.0133 - val_loss: 0.0172
Epoch 41/50
26293/26293 [==============================] - 3s 105us/step - loss: 0.0133 - val_loss: 0.0169
Epoch 42/50
26293/26293 [==============================] - 3s 101us/step - loss: 0.0133 - val_loss: 0.0173
Epoch 43/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0133 - val_loss: 0.0173
Epoch 44/50
26293/26293 [==============================] - 3s 101us/step - loss: 0.0132 - val_loss: 0.0177
Epoch 45/50
26293/26293 [==============================] - 3s 105us/step - loss: 0.0133 - val_loss: 0.0189
Epoch 46/50
26293/26293 [==============================] - 3s 102us/step - loss: 0.0132 - val_loss: 0.0180
Epoch 47/50
26293/26293 [==============================] - 3s 105us/step - loss: 0.0133 - val_loss: 0.0182
Epoch 48/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0132 - val_loss: 0.0195
Epoch 49/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0132 - val_loss: 0.0191
Epoch 50/50
26293/26293 [==============================] - 3s 100us/step - loss: 0.0133 - val_loss: 0.0179
if os.path.exists(train_history_filepath):
    train_result = pd.read_csv(train_history_filepath)
train_result[['loss', 'val_loss']].plot()
<Figure size 432x288 with 1 Axes>
y_pred_train = model.predict(X_train)
train_score = r2_score(y_train, y_pred_train)
train_score
0.89374200516925206
y_pred_test = model.predict(X_test)
test_score = r2_score(y_test, y_pred_test)
test_score
0.92195847670870434
train_size = len(X_train)
xs_train = np.arange(train_size)
xs_test = np.arange(train_size, len(y))
plt.plot(y)
plt.plot(xs_train, y_pred_train)
plt.plot(xs_test, y_pred_test)
<Figure size 432x288 with 1 Axes>

2Multi Lag Prediction

..., x(t-1), x(t) --> y(t+1)

X, Y = time_step_seq(data, look_back=1, look_forward=1)
X.shape
(43822, 2, 11)
Y.shape
(43822, 1, 11)
y = Y[:, 0, 0]

Train/Test

X_train, X_test, y_train, y_test = train_test_split(X, y, shuffle=False)
X_train.shape
(32866, 2, 11)

모델 구성

model_filepath = '../outputs/mv-rnn-input_2_ouput_1.h5'
train_history_filepath = '../outputs/train-history-mv-rnn-input_2_output_1.csv'
time_steps = X.shape[1]
data_dim = X.shape[-1]
if os.path.exists(model_filepath):
    model = load_model(model_filepath)
else:    
    model = Sequential()
    model.add(LSTM(50, input_shape=(time_steps, data_dim)))
    model.add(Dense(1))
    model.compile(loss='mae', optimizer='adam')
    # train
    history = model.fit(
        X_train, y_train, epochs=50, batch_size=72, shuffle=False, validation_split=0.2)
    # save model
    model.save(model_filepath)
    train_result = DataFrame(history.history)
    # save train results
    train_result.to_csv(train_history_filepath, encoding='utf-8')
Train on 26292 samples, validate on 6574 samples
Epoch 1/50
26292/26292 [==============================] - 2s 90us/step - loss: 0.0322 - val_loss: 0.0564
Epoch 2/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0176 - val_loss: 0.0243
Epoch 3/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0160 - val_loss: 0.0197
Epoch 4/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0157 - val_loss: 0.0181
Epoch 5/50
26292/26292 [==============================] - 2s 81us/step - loss: 0.0152 - val_loss: 0.0193
Epoch 6/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0148 - val_loss: 0.0175
Epoch 7/50
26292/26292 [==============================] - 2s 79us/step - loss: 0.0142 - val_loss: 0.0163
Epoch 8/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0136 - val_loss: 0.0149
Epoch 9/50
26292/26292 [==============================] - 2s 79us/step - loss: 0.0135 - val_loss: 0.0142
Epoch 10/50
26292/26292 [==============================] - 2s 79us/step - loss: 0.0135 - val_loss: 0.0141
Epoch 11/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0134 - val_loss: 0.0142
Epoch 12/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0133 - val_loss: 0.0139
Epoch 13/50
26292/26292 [==============================] - 2s 79us/step - loss: 0.0135 - val_loss: 0.0141
Epoch 14/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0133 - val_loss: 0.0142
Epoch 15/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0133 - val_loss: 0.0148
Epoch 16/50
26292/26292 [==============================] - 2s 81us/step - loss: 0.0134 - val_loss: 0.0157
Epoch 17/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0133 - val_loss: 0.0161
Epoch 18/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0131 - val_loss: 0.0145
Epoch 19/50
26292/26292 [==============================] - 2s 81us/step - loss: 0.0130 - val_loss: 0.0149
Epoch 20/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0132 - val_loss: 0.0148
Epoch 21/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0130 - val_loss: 0.0149
Epoch 22/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0130 - val_loss: 0.0143
Epoch 23/50
26292/26292 [==============================] - 2s 79us/step - loss: 0.0130 - val_loss: 0.0148
Epoch 24/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0130 - val_loss: 0.0143
Epoch 25/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0131 - val_loss: 0.0145
Epoch 26/50
26292/26292 [==============================] - 2s 81us/step - loss: 0.0130 - val_loss: 0.0148
Epoch 27/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0130 - val_loss: 0.0144
Epoch 28/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0130 - val_loss: 0.0148
Epoch 29/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0130 - val_loss: 0.0148
Epoch 30/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0130 - val_loss: 0.0148
Epoch 31/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0130 - val_loss: 0.0149
Epoch 32/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0129 - val_loss: 0.0148
Epoch 33/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0129 - val_loss: 0.0160
Epoch 34/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0130 - val_loss: 0.0151
Epoch 35/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0129 - val_loss: 0.0158
Epoch 36/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0130 - val_loss: 0.0149
Epoch 37/50
26292/26292 [==============================] - 2s 79us/step - loss: 0.0130 - val_loss: 0.0154
Epoch 38/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0129 - val_loss: 0.0160
Epoch 39/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0129 - val_loss: 0.0156
Epoch 40/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0129 - val_loss: 0.0159
Epoch 41/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0129 - val_loss: 0.0171
Epoch 42/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0130 - val_loss: 0.0159
Epoch 43/50
26292/26292 [==============================] - 2s 81us/step - loss: 0.0129 - val_loss: 0.0176
Epoch 44/50
26292/26292 [==============================] - 2s 81us/step - loss: 0.0129 - val_loss: 0.0173
Epoch 45/50
26292/26292 [==============================] - 2s 82us/step - loss: 0.0129 - val_loss: 0.0171
Epoch 46/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0129 - val_loss: 0.0167
Epoch 47/50
26292/26292 [==============================] - 2s 81us/step - loss: 0.0128 - val_loss: 0.0168
Epoch 48/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0129 - val_loss: 0.0167
Epoch 49/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0129 - val_loss: 0.0167
Epoch 50/50
26292/26292 [==============================] - 2s 80us/step - loss: 0.0129 - val_loss: 0.0169
if os.path.exists(train_history_filepath):
    train_result = pd.read_csv(train_history_filepath)
train_result[['loss', 'val_loss']].plot()
<Figure size 432x288 with 1 Axes>
y_pred_train = model.predict(X_train)
train_score = r2_score(y_train, y_pred_train)
train_score
0.89880641374582737
y_pred_test = model.predict(X_test)
test_score = r2_score(y_test, y_pred_test)
test_score
0.92762303407350521
train_size = len(X_train)
xs_train = np.arange(train_size)
xs_test = np.arange(train_size, len(y))
plt.plot(y)
plt.plot(xs_train, y_pred_train)
plt.plot(xs_test, y_pred_test)
<Figure size 432x288 with 1 Axes>