我有如下的每日时间序列数据。
CashIn CashOut
Date
2016-01-01 0.0 6500.0
2016-01-02 0.0 23110.0
2016-01-03 0.0 7070.0
2016-01-04 0.0 18520.0
2016-01-05 20840.0 22200.0
.
.
.
2019-03-25 59880.0 25500.0
2019-03-26 49270.0 17860.0
2019-03-27 45160.0 48600.0
2019-03-28 39480.0 22840.0
2019-03-29 70260.0 25950.0
2019-03-30 19250.0 24350.0
2019-03-31 46870.0 14400.0
我的总数据大小为1186。我想使用LSTM预测2019-04-01至2019-04-30之间的CashIn和CashOut值。
我写了一个如下的批处理计算器。
def get_batches(arr, batch_size, seq_length):
batch_size_total = batch_size * seq_length
n_batches = len(arr)//batch_size_total
arr = arr[:n_batches * batch_size_total]
arr = arr.reshape((batch_size, -1))
for n in range(0, arr.shape[1], seq_length):
x = arr[:, n:n+seq_length]
y = np.zeros_like(x)
try:
y[:, :-1], y[:, -1] = x[:, 1:], arr[:, n+seq_length]
except IndexError:
y[:, :-1], y[:, -1] = x[:, 1:], arr[:, 0]
yield x, y
我试图通过使用get_batches函数将此数据集划分为具有30个序列长度的批处理,因为我有每日的时间序列,并且希望预测接下来的30天。
batches = get_batches(np.array(data_cashIn), 40, 30)
如果我在get_bathces函数中将39而不是40写入参数,那么我将丢失最近的16个每日数据,但我不想丢失这些数据。
如何正确执行此操作?
答案 0 :(得分:1)
我认为您总会得到一个无效的数字。因为这不是最佳做法。我建议您使用DataLoader
,它可以轻松地为您加载批次(and here's how you can have a custom dataset fed to the dataloder)。通过将batch_size
赋予Dataloader
,它将把您的数据集划分为batch_size
的最大可能批次,最后一个批次为<=batch_size
。
关于LSTM
,请使用batch_first=True
,并将批次做成(batch, seq, feature)
的形状。这样一来,您就不必担心给出特定大小的问题了,input_size
必须等于feature
。