Multivariate Time Series Regression
이성주 (c) 2018
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 inlinefrom deepy.timeseries import time_step_seq주중 미국 대사관 북경 대기오염 측정 자료
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))
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]yarray([ 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()
y_pred_train = model.predict(X_train)train_score = r2_score(y_train, y_pred_train)
train_score0.90750741054958128y_pred_test = model.predict(X_test)test_score = r2_score(y_test, y_pred_test)
test_score0.93237214897655485train_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)
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()
y_pred_train = model.predict(X_train)train_score = r2_score(y_train, y_pred_train)
train_score0.89374200516925206y_pred_test = model.predict(X_test)test_score = r2_score(y_test, y_pred_test)
test_score0.92195847670870434train_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)
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()
y_pred_train = model.predict(X_train)train_score = r2_score(y_train, y_pred_train)
train_score0.89880641374582737y_pred_test = model.predict(X_test)test_score = r2_score(y_test, y_pred_test)
test_score0.92762303407350521train_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)