缺少值的多元LSTM

时间:2018-09-29 16:13:42

标签: 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              7
 5    6              nan            12

不是插值缺失值,而是在结果中引入偏差,因为有时同一功能上有很多连续的时间戳记有缺失值,所以我想知道是否有一种方法可以让LSTM学习缺少值,例如使用遮罩层之类的东西?有人可以向我解释解决这个问题的最佳方法是什么? 我正在使用Tensorflow和Keras。

1 个答案:

答案 0 :(得分:13)

正如his book中的FrançoisChollet(Keras的创建者)所建议的那样,处理缺失值的一种方法是将它们替换为零:

  

通常,使用神经网络可以安全地输入缺少的值,例如   0,但条件是0尚未是有意义的值。的   网络将从接触数据中得知值0表示   缺少数据,将开始忽略该值。请注意,如果您   期望测试数据中缺少值,但是网络已经过培训   在没有任何缺失值的数据上,网络将不会学会   忽略缺失值!在这种情况下,您应该人为地   生成缺少条目的训练样本:复制一些训练   多次采样,并删除一些您期望的功能   测试数据中很可能会丢失。

因此,考虑到数据中未使用零,您可以为NaN元素分配零(您可以将数据规范化为一个范围,例如[1,2],然后为{{1 }}元素;或者,您也可以将所有值规范化为[0,1]范围,然后使用-1而不是零来替换NaN元素。)

另一种替代方法是在Keras中使用Masking层。您给它设置一个掩码值,例如0,它将删除所有其特征均等于掩码值的任何时间步(即行)。但是,以下所有图层均应支持屏蔽,并且您还需要预处理数据并将屏蔽值分配给一个或多个NaN特征的时间步的所有特征。来自Keras文档的示例:

  

考虑形状为NaN的Numpy数据数组x,   送入LSTM层。您想掩盖时间步长#3   和#5,因为您缺乏这些时间步长的数据。您可以:

     
      
  • 设置(samples, timesteps,features)x[:, 3, :] = 0.

  •   
  • x[:, 5, :] = 0.层之前插入mask_value=0.的Masking层:

  •   
     

LSTM