【问题标题】:Multivariate LSTM with missing values具有缺失值的多元 LSTM
【发布时间】:2018-09-29 16:13:42
【问题描述】:

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


    【解决方案1】:

    正如 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. 的遮罩层:

    model = Sequential()
    model.add(Masking(mask_value=0., input_shape=(timesteps, features)))
    model.add(LSTM(32))
    

    更新(2021 年 5 月):根据 François Cholle 的更新建议,使用更有意义或信息量更大的值(而不是使用零)来掩盖缺失值可能会更好。该值可以通过数据本身计算(例如平均值、中位数等)或预测。

    【讨论】:

    • 感谢您的回答。关于掩蔽解决方案,您能否也评论一下随后的填充过程?我假设,在掩盖 nan 值之后,需要通过填充通知他们吗?如果是这样,例如如何通知 lstm。
    • 我已经发布了我的问题。 stats.stackexchange.com/questions/445254/…
    • 在那本书的最新版本中,Chollet 不再建议使用任意值(如 0)。相反,他建议估算一个更有意义的值(例如平均值、中位数或基于预测)。
    • @nocibambi 非常感谢您的更新。我刚刚将其添加到答案中。
    • @today You should artificially generate training samples with missing entries: copy some training samples several times, and drop some of the features that you expect are likely to be missing in the test data. 我对那部分的理解感到困惑。这是否意味着我们将在数据集中创建重复项,其中一个可能的重复项是具有一些缺失值的那个?如果是这样,它不会对现在有重复条目的某些时间戳产生偏见吗?
    猜你喜欢
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 2018-11-25
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多