Tensorflow 具有缺失值的多元LSTM

Tensorflow 具有缺失值的多元LSTM,tensorflow,neural-network,keras,lstm,missing-data,Tensorflow,Neural Network,Keras,Lstm,Missing Data,我正在研究一个使用LSTM的时间序列预测问题。 输入包含几个特性,因此我使用多元LSTM。 问题是缺少一些值,例如: Feature 1 Feature 2 ... Feature n 1 2 4 nan 2 5 8 10 3 8 8 5 4 nan 7

我正在研究一个使用LSTM的时间序列预测问题。 输入包含几个特性,因此我使用多元LSTM。 问题是缺少一些值,例如:

    Feature 1     Feature 2  ...  Feature n
 1    2               4             nan
 2    5               8             10
 3    8               8              5
 4    nan             7              7
 5    6              nan            12
与插值缺失值不同,这可能会在结果中引入偏差,因为有时在同一特征上有许多连续的时间戳缺失值,我想知道是否有方法让LSTM使用缺失值进行学习,例如,使用遮罩层或类似的东西?有人能给我解释一下什么是处理这个问题的最佳方法吗?
我使用的是Tensorflow和Keras。

正如François Chollet(Keras的创建者)在年所建议的,处理缺失值的一种方法是将它们替换为零:

一般来说,使用神经网络,输入缺失值是安全的 0,条件是0已经不是有意义的值。这个 网络将从暴露于数据中学习值0的含义 缺少数据,将开始忽略该值。请注意,如果您 预期测试数据中缺少值,但网络经过训练 在没有任何缺失值的数据上,网络将无法学习 忽略缺少的值!在这种情况下,你应该人为地 生成缺少条目的培训样本:复制一些培训 多次采样,并删除一些您期望的功能 可能在测试数据中丢失

因此,考虑到数据中没有使用零,您可以将零分配给
NaN
元素(您可以将数据标准化为一个范围,例如[1,2],然后将零分配给
NaN
元素;或者,您可以将范围[0,1]中的所有值标准化,然后使用-1代替零来替换
NaN
元素。)

另一种替代方法是在Keras中使用层。你给它一个掩码值,比如说0,它会删除所有特性都等于掩码值的任何时间步(即行)。但是,以下所有层都应支持掩蔽,并且您还需要预处理数据,并将掩蔽值分配给包含一个或多个
NaN
功能的时间步的所有功能。来自Keras文件的示例:

考虑一个Numpy数据数组
x
,其形状
(样本、时间步、特征)
, 要馈送到LSTM层。您想屏蔽时间步#3 以及#5,因为您缺少这些时间步的数据。你可以:

  • 设置
    x[:,3,:]=0。
    x[:,5,:]=0。

  • LSTM
    层之前插入一个值为0的遮罩层。:



更新(2021年5月):根据François Cholle的最新建议,最好使用更有意义或信息性的值(而不是零)来掩盖缺失的值。此值可以计算(例如,平均值、中值等)或根据数据本身进行预测。

谢谢您的回答。关于掩蔽解决方案,您是否也可以对随后的填充过程进行评论?我想,在屏蔽nan值之后,需要通过填充来通知他们吗?如果是这样的话,如何通知lstm?例如,我已经发布了我的问题。在该书的最新版本中,Chollet不再建议使用任意值(如0)。相反,他建议输入一个更有意义的值(例如平均值、中位数或基于预测)。@Nocibanbi非常感谢更新。我只是把它添加到了答案中。
model = Sequential()
model.add(Masking(mask_value=0., input_shape=(timesteps, features)))
model.add(LSTM(32))