我正在使用 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 文档的示例:
考虑形状为
x
的 Numpy 数据数组(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))
更新(2021 年 5 月): 根据 François Cholle 的更新建议,最好使用更有意义或信息量更大的值(而不是使用零)来屏蔽缺失值。该值可以通过数据本身计算(例如平均值、中位数等)或预测。