具有缺失值的多变量LSTM

Mar*_*ico 14 missing-data neural-network lstm keras tensorflow

我正在使用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
Run Code Online (Sandbox Code Playgroud)

而不是插入缺失值,这可能会在结果中引入偏差,因为有时在同一个特征上有很多连续的时间戳和缺失值,我想知道是否有办法让LSTM学习缺失值,例如,使用掩蔽层或类似的东西?有人可以向我解释一下处理这个问题的最佳方法是什么?我正在使用Tensorflow和Keras.

tod*_*day 21

正如FrançoisChollet(Keras的创造者)在他的书中所建议的,处理缺失值的一种方法是用零替换它们:

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

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

另一种替代方法是Masking在Keras中使用一个层.你给它一个掩码值,比如说0,它会丢弃任何时间步(即行),其所有特征都等于掩码值.但是,以下所有图层都应支持屏蔽,您还需要预处理数据并将屏蔽值分配给包含一个或多个要素的时间步长的所有要素NaN.来自Keras doc的示例:

考虑一个Numpy x形状的数据数组(samples, timesteps,features),以供给LSTM层.您希望屏蔽时间步长#3和#5,因为您缺少这些时间步的数据.您可以:

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

  • 在图层mask_value=0.之前插入一个蒙版LSTM图层:

model = Sequential()
model.add(Masking(mask_value=0., input_shape=(timesteps, features)))
model.add(LSTM(32))
Run Code Online (Sandbox Code Playgroud)