向导,向导。
我有时间序列数据,包括世俗的日子。
我尝试预测明天的等级,范围是0到100。
并且我认为这个等级取决于3个与时间序列无关的特征。
每一天都是一个单位并有一个等级,但是每个单位(天)具有不同长度的时间序列数据。
因为每天都有很多数据长度,所以我每天滚动窗口,大小为1080,步幅为180。
因此,我尝试将其转换为(单位(样本)数,窗口数,窗口大小,功能)。
终于得到(450,#window(not fixed),1080,3)。
450天,每天具有相同长度的窗口(1080)和功能(3),但是窗口数不同。
我本来是零填充的,但听说可以使用输入长度不同的dynamic(?)LSTM。
问题在于Keras LSTM的输入形状必须为3维。
所以我很困惑如何使这种形状适合LSTM模型。
我的目标是,当我在LSTM模型中放一个新的形状(窗口号,1080、3)的形状时,我希望它可以预测等级。
您能给我任何建议吗? 谢谢。
答案 0 :(得分:1)
不幸的是,您的问题的答案是没有。
Keras中LSTM层的输入形状必须为(batch_size, timesteps, features)
。没有第四维。
但是,就像您似乎在使用滑动窗口方法一样,我可以告诉您,通常的方法是在批处理维度中包含(窗口数)。在您的情况下,这意味着您的输入形状将变为(450 * #window, 1080, 3)
。
然后,为了进行预测,您只需要使用一天的最后一个窗口,就不能使用一整天。
请注意,这通常是滑动窗口方法的一个巨大限制。如果一个好的预测需要一整天的数据,而不是当天的一个窗口,那么这种方法就行不通了。
您仍然可以尝试使用不同的窗口大小进行播放。如果不起作用,我建议您放弃这种方法,直接使用一天的数据,而不要先将其划分为多个窗口。因此,(450, #(data of a day), 3)
将成为您的输入形状。您所听到的是正确的:timestep
轴上的长度可以变化。为此,您必须在第一层声明input_shape=(None, 3)
。
唯一的缺点是您不能将所有数据作为一个numpy数组放在一起,因为numpy不能使用不同的大小。换句话说,您需要450个形状为(450, #(data of a day), 3)
的numpy数组,而不是一个形状为(1, #(data of a day), 3)
的numpy数组,其中#(data of a day)
可以每次都不同。不幸的是,model.fit()
不能用于此目的,因为它期望训练数据是一个单个的numpy数组。相反,您可以使用model.fit_generator
并向其传递一个生成器,该生成器在每次调用时产生这450个小数组中的一个。请查看docs,以获取有关如何使用此功能的示例。请注意,由于batch_size=1
,您的训练可能会变慢。
如果结果是一个问题,则Keras中的LSTM层支持屏蔽。为此,只需将Masking
层用作模型中的第一个层,然后声明一个要屏蔽的值(通常为0.0
,但可以是任何数字)。然后,您可以创建形状为(batch_size, #max_day_data, 3)
的输入张量,其中必须对所有少于#max_day_data
数据的日期用将要屏蔽的值进行右填充。
为进一步阅读,我强烈建议在LSTM上使用this answer。也许这会启发您尝试使用其他方法。如果一天中有太多数据不适合您的内存,则尤其可以使用stateful
。