使用LSTM和keras进行时间序列预测的分类变量

9
我有一个LSTM模型(keras),它将过去6个变量的20个值作为输入,并预测其中3个变量未来4个值的情况。换句话说,我有6个时间序列,正在尝试使用它们的20个过去值来预测它们的未来值。基本代码如下:
past_time_steps = 6
future_time_steps = 4
inputs = Input(shape=(20,past_time_steps))
m = LSTM(hid, return_sequences=True)(inputs)
m = Dropout(0.5)(m)
m = LSTM(hid)(m)
m = Dropout(0.5)(m)
outputA = Dense(future_time_steps, activation='linear', W_constraint=nonneg())(m)
outputB = Dense(future_time_steps, activation='linear', W_constraint=nonneg())(m)
outputC = Dense(future_time_steps, activation='linear', W_constraint=nonneg())(m)
m = Model(inputs=[inputs], outputs=[outputA, outputB, outputC])
m.compile(optimizer='adam', loss='mae')
m.fit(x,[y1,y2, y2])

所以,输入是一个形状为(500,20,6)的numpy矩阵,其中500表示样本数量(例如训练时间序列)。
现在,我有新的数据可用,因此对于每个时间序列,我都有一个分类变量(可以取6个值:0,1,2,3,4,5)。如何将此信息添加到模型中?我可以添加另一层来使用此变量吗?是否应该在时间序列的开头/结尾填充此变量,以便我可以得到一个形状为(500,21,6)的输入矩阵?
2个回答

1

对分类变量进行一位有效编码,并将其与其他时间数据一样进行预处理。这些新数据不会影响您的时间步长,只会影响变量数量。


如果有一些观测数据跨越了2年,而另外一些只有2周,你会如何进行编码?你需要将它们跨越2年进行编码...这将导致非常稀疏的数据...如果您能详细解释一下您的答案,那就太好了。 - Areza

1

这个帖子可能会对你有兴趣:向时间序列模型LSTM添加特征

你基本上有三种可能的方法:

让我们以来自两个不同城市(巴黎和旧金山)的天气数据为例。你想根据历史数据预测下一个温度。但同时,你期望天气会因城市而异。你可以选择以下任一方式:

  • 将辅助特征与时间序列数据组合在一起,放在开头或结尾(丑陋!)。
  • 将辅助特征与RNN层的输出串联起来。这是一种后处理RNN的调整方式,因为RNN层不会看到这些辅助信息。
  • 或者只需使用条件的学习表示(例如巴黎或旧金山)初始化RNN状态。

我编写了一个库来处理辅助输入的条件。它抽象了所有复杂性,并被设计成尽可能用户友好:

https://github.com/philipperemy/cond_rnn/

实现使用tensorflow (>=1.13.1)和Keras。
希望能有所帮助!

你能详细说明一下你的答案与分类变量有什么关系吗? - Areza
1
据我理解,这里重要的不是分类变量,而是如何将一个不依赖于时间的外生变量馈送到 LSTM 模型中。 - Philippe Remy
如果我对预测早期发病感兴趣,并且我有许多非时间序列变量,例如在不同时间点出现在医疗记录中的病情,那么这个实现是否允许我在LSTM中“随着事件发生”编码这些事件,即LSTM会认识到高胆固醇,紧接着高血压和胸痛表明心脏病发作?还是这个实现会将他们的整个病史合并到最后一层,而不考虑事件的顺序? - brucezepplin
@brucezepplin 任何“标准”的RNN都会在时间轴上展开时间序列,以产生一个向量H(n),然后将其传递到下一层。初始状态H(0)通常是一个由0组成的向量。使用CondRNN时,任何外部条件(不依赖于时间)都可以用于以比0向量更智能的方式初始化状态H(0)。当您训练CondRNN时,除了像往常一样传递时间序列X之外,还要传递条件向量C。 - Philippe Remy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接