时间序列 LSTM 的特征提取



我想将时间序列输入 LSTM 以执行预测。 假设我有 10000 个样本。现在,为了将时间序列输入我的 LSTM,我将其重塑为(样本、时间步长、特征(。就我而言,我使用 timestep=50 来创建子序列并执行 t+1 的预测。所以我最终得到了x.shape=(9950,50,1).目前为止,一切都好。

我的模型

model= Sequential()
model.add(LSTM(50,return_sequences=True,input_shape=(50,1)))
model.add(Dense(out_dim, activation = 'sigmoid'))
model.compile(loss='mse', optimizer='adam')

现在我想创建人工特征,例如,我想使用信号的fft作为特征。我怎样才能把它输入到我的 LSTM 中?仅计算 fft,将其附加到数据帧并一起重塑是否合法,以便我最终得到(9950,50,2)

问题基本上是:

  1. 如何将人工创建的特征输入到 LSTM 中?
  2. 滚动统计或相关功能的方式相同?

提前致谢

您从输入数据计算的任何额外特征都只是另一个特征,因此:

  1. 你把它喂给它就像系列的另一个功能一样,input_shape=(50, 1+extra_features),你必须在传递给模型之前将它们连接起来。所以是的,输入形状现在将是(9950, 50, 2).
  2. 是的,您可以预先计算该特征,例如移动平均线,然后将其与原始输入连接起来。

您还可以编写自定义层来计算模型中的这些特征,但模型每次都会对其进行计算。如果您先验地计算它,优点是您可以保存/缓存它。

如果您有非时间序列功能,现在您需要转到函数式 API 并有多个输入:1 个是时间序列,另一个不是:

series_in = Input(shape=(50, 2))
other_in = Input(shape(extra_features,)) # not a timeseries just a vector
# An example graph
lstm_out = LSTM(128)(series_in)
merged = concatenate([lstm_out, other_in])
out = Dense(out_dim, activation='sigmoid')(merged)
model = Model([series_in, other_in], out)
model.compile(...)

在这种情况下,我们有 2 个模型输入,可以随时使用辅助功能。在示例中,我在最终的 Dense 层之前合并,以帮助预测以及使用 LSTM 提取的时间序列特征。

最新更新