我正在研究一个使用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文件的示例:
考虑一个NUMPI数据数组<代码>代码> >代码> >(样本、时间步长、特征),将其输入到LSTM层。您想要屏蔽时间步3和5,因为您缺少这些时间步的数据。你可以:
>
设置
x[:,3,:]=0。
和x[:,5,:]=0。
在
:LSTM
层之前插入一个值为0的遮罩层。
model = Sequential()
model.add(Masking(mask_value=0., input_shape=(timesteps, features)))
model.add(LSTM(32))
更新(2021年5月):根据弗朗索瓦·乔勒(François Cholle)的最新建议,最好使用更有意义或信息量更大的值(而不是零)来掩盖缺失的值。该值可以计算(例如,平均值、中值等)或根据数据本身进行预测。
问题内容: 我想在Java中实现具有多个值的哈希表,即 并且将返回2倍的值。 我怎样才能做到这一点? 问题答案: 您可以改用Multimap。它在列表中为一个键保留多个值。在commons- collection 和Guava中有实现。 这类似于使用值是列表的Hashmap,但是不必显式创建列表。 自己动手做的同一示例如下所示: 请注意,您可以将Multimap用作构建器,并对其调用asMap以返
问题内容: 我有一个表,带有2个重要列DocEntry,WebId 样本数据就像 现在我们可以在这里注意到,在WebId列中缺少S004。我们如何通过查询找到这些缺失的数字。 进一步说明: 如果网站ID之间缺少任何数字,则Web ID应按升序排列,例如S001,S002,S003,S004,S005。我没有任何单独的表格来输入可能的条目,因为这是不切实际的。我必须逐月查找丢失的数字,以每个月的开始
我试图使用Laravel构建一个(稍微复杂的)订阅服务。 订阅类型为:20份早餐的早餐订阅,在注册后30天内使用。 例如,如果用户在4月1日注册早餐订阅,他可以选择任何20天,直到4月30日。 我制作了以下表格和相应的模型: 用户模型和表 订阅表和型号 订阅用户透视(?)带有软删除的表 我已经用belongsToMany关系更新了相应的模型 用户: 订阅模式 我需要帮助解决的问题1。数据库/模型结
主要内容:为什么会存在缺失值?,什么是稀疏数据?,缺失值处理,检查缺失值,缺失数据计算,清理并填充缺失值,删除缺失值在一些数据分析业务中,数据缺失是我们经常遇见的问题,缺失值会导致数据质量的下降,从而影响模型预测的准确性,这对于机器学习和数据挖掘影响尤为严重。因此妥善的处理缺失值能够使模型预测更为准确和有效。 为什么会存在缺失值? 前面章节的示例中,我们遇到过很多 NaN 值,关于缺失值您可能会有很多疑问,数据为什么会丢失数据呢,又是从什么时候丢失的呢?通过下面场景,您会得到答案。 其实在很多时
下面我有一些代码。这段代码是一个基本的push/pop堆栈类,我将其创建为一个模板,以使某人能够推送/pop堆栈。我有一个家庭作业,我现在要做的是创建一个具有多个值的堆栈。 所以我希望能够创建一个堆栈,它基本上可以发送三个整数,我也可以推/弹出这些整数。我在寻找的是关于这应该如何工作的理论,我不想让别人帮我做作业。 情况是,我们正在处理部件。因此,用户将输入序列号(int)、制造日期(int)和l
Spring能做那样的事吗?当它只映射一件事时,我让它很容易工作。例如: @RequestMapping(“Hello-World”) 工作并将匹配/hello-world.do,/anything/hello-world.do,但我的问题是,如果hello-world位于/blog路径中,我将只匹配hello-world,并且每当我使用类似: 这看起来应该可以工作(这是我唯一的请求映射),但是: