具有缺失值的多元 LSTM

问题描述 投票:0回答:2

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

tensorflow neural-network keras lstm missing-data
2个回答
57
投票

正如 François Chollet(Keras 的创建者)在他的书中所建议的,处理缺失值的一种方法是将其替换为零:

一般来说,对于神经网络,输入缺失值是安全的 0,条件是 0 还不是一个有意义的值。这 网络将从暴露的数据中了解到值 0 的含义 丢失数据并将开始忽略该值。请注意,如果您是 预计测试数据中存在缺失值,但网络已经过训练 对于没有任何缺失值的数据,网络不会学会 忽略缺失值!在这种情况下,你应该人为地 生成缺少条目的训练样本:复制一些训练 多次采样,并删除一些您期望的功能 测试数据中可能会丢失。

因此,考虑到数据中未使用零,您可以将零分配给

NaN

 元素(您可以将数据标准化为一个范围,例如 [1,2],然后将零分配给 
NaN
 元素;或者,您可以将所有值标准化为 [0,1] 范围内,然后使用 -1 而不是零来替换 
NaN
 元素。)

另一种替代方法是在 Keras 中使用

Masking

 层。你给它一个掩码值,比如 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 的更新建议,最好使用更有意义或信息量更大的值(而不是使用零)来屏蔽缺失值。该值可以通过数据本身计算(例如平均值、中位数等)或预测。


0
投票
在我看来,这取决于数据的种类。从经济学的角度来看,变量分为存量和流量。对于库存,最好通过指数函数来填补缺失值

© www.soinside.com 2019 - 2024. All rights reserved.