时间序列生成器(TimeseriesGenerator)

参考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)
  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值