参考How to Use the TimeseriesGenerator for Time Series Forecasting in Keras
时间序列
监督学习时间序列的问题
如何应用TimeseriesGenrator
Keras 提供了TimeseriesGenrator 时间序列生成器,它可以用来自动把单序列或者多序列集转换为监督学习问题。
- 定义一个时间序列生成器
你可以创建一个Sequence class 类实例,来定义自己的输入和输出。它可以用来迭代你的输入和输出序列。
一旦这个时间序列生成器被定义,它就可以用来训练神经网络模型。 - 用 fit_generaor()函数来训练模型
- how to use
from numpy import array
from keras.preprocessing.sequence import TimeseriesGenerator
# define dataset
series = array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# define generator
n_input = 2
generator = TimeseriesGenerator(series, series, length=n_input, batch_size=1)
# number of samples
print('Samples: %d' % len(generator))
# print each sample
for i in range(len(generator)):
x, y = generator[i]
print('%s => %s' % (x, y))
length=2,batch_size=1
Samples: 8
[[1 2]] => [3]
[[2 3]] => [4]
[[3 4]] => [5]
[[4 5]] => [6]
[[5 6]] => [7]
[[6 7]] => [8]
[[7 8]] => [9]
[[8 9]] => [10]
x,y=generator[0]
print(y.shape)
print(x.shape)
(1,)
(1, 2)
length=2,batch_size=2
Samples: 4
[[1 2]
[2 3]] => [3 4]
[[3 4]
[4 5]] => [5 6]
[[5 6]
[6 7]] => [7 8]
[[7 8]
[8 9]] => [ 9 10]
x,y=generator[0]
print(y.shape)
print(x.shape)
(2,)
(2, 2)
length=3,batch_size=2
Samples: 4
[[1 2 3]
[2 3 4]] => [4 5]
[[3 4 5]
[4 5 6]] => [6 7]
[[5 6 7]
[6 7 8]] => [8 9]
[[7 8 9]] => [10]
x,y=generator[0]
print(y.shape)
print(x.shape)
(2,)
(2, 3)
- 实例
from numpy import array
from keras.models import Sequential
from keras.layers import Dense
from keras.preprocessing.sequence import TimeseriesGenerator
# define dataset
series = array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# define generator
n_input = 2
generator = TimeseriesGenerator(series, series, length=n_input, batch_size=8)
# define model
model = Sequential()
model.add(Dense(100, activation='relu', input_dim=n_input))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
# fit model
model.fit_generator(generator, steps_per_epoch=1, epochs=200, verbose=1)
# make a one step prediction out of sample
x_input = array([9, 10]).reshape((1, n_input))
yhat = model.predict(x_input, verbose=0)
print(yhat)
输出
- 升级
我们也可以用RNN训练,例如LSTM。
LSTM 期望的数据类型是[samples,timesteps,features],然而时间序列生成器目前为止的形状是[smaples,features]
我们可以这样reshape
n_features = 1
series = series.reshape((len(series), n_features))
# univariate one step problem with lstm
from numpy import array
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.preprocessing.sequence import TimeseriesGenerator
# define dataset
series = array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# reshape to [10, 1]
n_features = 1
series = series.reshape((len(series), n_features))
# define generator
n_input = 2
generator = TimeseriesGenerator(series, series, length=n_input, batch_size=8)
# define model
model = Sequential()
model.add(LSTM(100, activation='relu', input_shape=(n_input, n_features)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
# fit model
model.fit_generator(generator, steps_per_epoch=1, epochs=500, verbose=0)
# make a one step prediction out of sample
x_input = array([9, 10]).reshape((1, n_input, n_features))
yhat = model.predict(x_input, verbose=0)
print(yhat)