我正在使用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。
答案 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