使用Keras进行(自动)预测的填充时间序列



i有3个时间序列,A,B和C,由30个时间步骤定义。我想构建一个LSTM,该LSTM作为输入,从时间步骤1到30的A,B的值从时间步骤1到时间步骤10,请预测其余20个时间步的C值。换句话说,我必须构建一个LSTM,该LSTM处理不同大小的序列输入(30和10)。我的想法是(例如使用0s)输入时间序列C,以便我可以拥有3个相同大小的序列并使用标准LSTM。

A1, A2, A3, ... A28, A29, A30 -->
B1, B2, B3, ... B28, B29, B30 -->  LSTM --> C11, C12, ..., C30
C1, C2, C3, ... 0,   0,   0   -->

从技术上讲,这将起作用,但是,从概念的角度来看,这是正确的吗?LSTM是否足够聪明,可以忘记填充?

可能有各种架构可以解决此问题,但是由于您听起来像您有固定的30+30+10 = 70输入大小,因此建议使用一个标准的feedforward网络,该网络采用70输入功能,具有一个或多个密集连接的隐藏层,并输出与要预测的C缺失值相对应的20值。

Keras中,这可能看起来像:

model = Sequential()
model.add(Dense(500, input_dim=70))
model.add(Activation('relu'))
model.add(Dense(300))
model.add(Activation('relu'))
model.add(Dense(20))
model.add(Activation('linear'))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])

如果您在训练期间有梯度问题,请尝试在ReLU之后添加BatchNormalization层,如果您要过度拟合尝试减少隐藏层的数量和/或在ReLUBatchNorm之后添加Dropout

特别是对于这个相对较小的,更重要的是固定输入大小,无需使用诸如LSTM之类的序列模型。它们更难使用,并且通常只有在您的输入不具固定尺寸时才值得。

如果您发现自己确实需要建模本地时间功能的体系结构,则可以尝试使用30x3输入形状的CC_13使用1D卷积来建模本地时间依赖性。在这种情况下,您可以按照您的建议为零pad C

编辑:@tituspullo在聊天中提到,他尝试了此 CNN的示例,以用于多个输出时间表预测。

最新更新