当使用不同长度和多个特征的多个时间序列时,如何为LSTM准备数据?

时间:2017-07-10 13:11:24

标签: python keras lstm data-science

我有一些来自多个用户(nUsers)的数据集。每个用户随机抽样(每个用户的非常数nSamples)。每个样本都有许多功能(nFeatures)。 例如:

nUsers = 3 ---> 3位用户

nSamples = [32,52,21] --->第一个用户被采样32次第二个用户被采样52次等。

nFeatures = 10 --->每个样本的特征数量恒定。

我希望LSTM根据当前功能和同一用户之前的预测产生当前预测。 我可以使用LSTM层在Keras中做到这一点吗? 我有两个问题: 1.数据对每个用户都有不同的时间序列。我该怎么办呢? 2.如何处理将先前的预测添加到当前时间特征空间以进行当前预测?

感谢您的帮助!

1 个答案:

答案 0 :(得分:6)

听起来每个用户都是一个序列,因此,用户可能是"批量大小"为你的问题。首先,nExamples = nUsers

如果我正确理解你的问题(预测下一个元素),你应该定义一个最大长度"回顾"。假设您可以预测下一个元素,例如查看前面的7个元素(而不是查看整个序列)。

为此,您应该像这样分开您的数据:

example 1: x[0] = [s0, s1, s2, ..., s6] | y[0] = s7   
example 2: x[1] = [s1, s2, s3, ..., s7] | y[1] = s8

其中sn是具有10个要素的示例。 通常,如果您混用用户并不重要。为所有用户创建这些小段并将所有内容放在一起。

这将导致形状像

的数组
x.shape -> (BatchSize, 7, 10) -> (BatchSize, 7 step sequences, 10 features)   
y.shape -> (BatchSize, 10)

也许你并不意味着预测下一组功能,而只是预测某些功能。在这种情况下,只需将y替换为您想要的值。如果您只需要一个结果,那么可能会导致y.shape -> (BatchSize,)

现在,如果你确实需要整个序列来预测(而不是前面的n个元素),那么你必须定义最大长度并填充序列。

假设您的最长序列(如您的示例中)为52.然后:

x.shape -> (Users, 52, 10).    

然后你必须"垫"填补空白的序列。
例如,您可以使用零功能填充序列的开头,例如:

x[0] = [s0, s1, s2, ......., s51] -> user with the longest sequence    
x[1] = [0 , 0 , s0, s1, ..., s49] -> user with a shorter sequence

或者(我不确定这是否有效,我从未测试过),用零值填充结尾并使用Masking Layer,这是Keras所拥有的"可变长度序列&#34 ;。您仍然使用固定大小的数组,但在内部它会(?)丢弃零值。