我正在使用LSTM处理一个时间序列预测问题。输入包含几个特征,所以我使用了Multivariate 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。
2条答案
按热度按时间vvppvyoh1#
正如François Chollet(Keras的创建者)在his book中所建议的那样,处理缺失值的一种方法是将它们替换为零:
一般来说,在神经网络中,输入缺失值为0是安全的,条件是0不是有意义的值。网络将从暴露于数据中学习到值0意味着缺失数据,并将开始忽略该值。请注意,如果您期望测试数据中有缺失值,但网络是在没有任何缺失值的数据上训练的,在这种情况下,您应该人为地生成缺失条目的训练样本:多次复制一些训练样本,并删除一些您预计可能在测试数据中缺失的特征。
因此,考虑到数据中没有使用零,您可以将零分配给
NaN
元素(您可以将数据规范化为一个范围,例如[1,2],然后将零分配给NaN
元素;或者,您可以将所有值规范化为范围[0,1],然后使用-1而不是零来替换NaN
元素。另一种替代方法是在Keras中使用
Masking
层。您给予它一个掩码值,比如0,它将删除任何时间步长(即行),其中所有特征都等于掩码值。然而,以下所有图层都应支持遮罩,并且您还需要预先处理您的数据并将掩码值分配给时间步长的所有特征,其中包括一个或多个NaN
特征。Keras文档中的示例:考虑一个形状为
(samples, timesteps,features)
的Numpy数据数组x
,它将被馈送到LSTM层。你想屏蔽时间步#3和#5,因为你缺少这些时间步的数据。你可以:x[:, 3, :] = 0.
和x[:, 5, :] = 0.
LSTM
层之前插入mask_value=0.
的掩蔽层:字符串
**更新(2021年5月):**根据François Cholle的更新建议,使用更有意义或信息量更大的值(而不是使用零)来掩蔽缺失值可能更好。该值可以计算(例如平均值,中位数等)或从数据本身预测。
ha5z0ras2#
在我看来,处理缺失数据的方法取决于数据集的性质。从经济学的Angular 来看,变量可以大致分为两类:存量和流量。在处理存量变量时,建议使用指数函数来处理缺失值。
经济变量通常分为存量和流量两类。存量变量表示在特定时间点测量的数量,而流量变量表示在一段时间内测量的数量。在存量变量的上下文中,值随时间增加,如公式v_t = v_(t-1)+ I_t所示。因此,当遇到此类情景中的缺失值时,采用指数函数被认为更有效。