使用 LSTM 和 keras 进行时间序列预测的分类变量
Posted
技术标签:
【中文标题】使用 LSTM 和 keras 进行时间序列预测的分类变量【英文标题】:Categorical variable for time series prediction with LSTM and keras 【发布时间】:2018-09-04 23:30:51 【问题描述】:我有一个 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)
的输入矩阵吗?
【问题讨论】:
【参考方案1】:One_hot_encode 分类变量并以与其他时间数据相同的方式对其进行预处理。您的时间步不受此新数据的影响。受影响的只是变量的数量。
【讨论】:
如果说几个 obs,你将如何编码。是通过 2 年的观察和其他一些 2 周的观察吗?你在 2 年内对它们进行编码......它会非常稀疏......如果你详细说明你的答案会很棒【参考方案2】:您可能会对此主题感兴趣:Adding Features To Time Series Model LSTM。
你基本上有3种可能的方式:
让我们以两个不同城市的天气数据为例:巴黎和旧金山。您想根据历史数据预测下一个温度。但与此同时,您预计天气会根据城市而变化。您可以:
在开始或结束时将辅助特征与时间序列数据结合起来(丑陋!)。 将辅助特征与 RNN 层的输出连接起来。这是某种后期 RNN 调整,因为 RNN 层不会看到这些辅助信息。 或者只是用学习到的条件表示来初始化 RNN 状态(例如,巴黎或旧金山)。我写了一个库来调节辅助输入。它抽象了所有的复杂性,并被设计为尽可能用户友好:
https://github.com/philipperemy/cond_rnn/
实现在 tensorflow (>=1.13.1) 和 Keras 中。
希望对你有帮助!
【讨论】:
您能否详细说明您的答案与分类变量的关系? 据我了解,这里重要的不是分类变量,而是如何将不依赖于时间的外生变量提供给 LSTM 模型。 所以如果我对预测早发疾病感兴趣,并且我有许多非时间序列变量,例如在不同时间点出现在医疗记录中的情况,那么这个实现是否允许我对这些进行编码LSTM 中的事件“发生时”,即 LSTM 认识到高胆固醇,在他们的记录中紧随高血压和胸痛表明心脏病发作?或者这个实现是否需要他们的整个病史,而不考虑事件的顺序并与最后一层合并?以上是关于使用 LSTM 和 keras 进行时间序列预测的分类变量的主要内容,如果未能解决你的问题,请参考以下文章