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

15
我有一个包含多个用户数据的数据集(nUsers)。每个用户在不同时间随机采样(每个用户的nSamples数量不同)。每个采样点具有若干特征(nFeatures)。例如:

nUsers = 3 ---> 3 名用户

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

nFeatures = 10 ---> 每个采样点都有10个特征。

我希望LSTM能够根据当前特征和相同用户之前的预测结果产生当前预测。 我可以在Keras中使用LSTM层来实现吗? 我有两个问题:

  1. 每个用户具有不同的时间序列,如何处理?
  2. 如何将之前的预测结果添加到当前时间特征空间中以进行当前预测?

谢谢您的帮助!


https://dev59.com/7loU5IYBdhLWcg3w5pua#62570576 - Marco Cerliani
1个回答

9

从您的问题描述来看,每个用户都是一个序列,因此用户可能是您问题中的“批处理大小”。因此,首先 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

这里是一段关于IT技术的翻译内容: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

或者(我不确定这是否有效,我从未测试过),在结尾处填充零值并使用掩蔽层,这是Keras用于“可变长度序列”的功能。您仍然使用固定大小的数组,但在内部它会丢弃零值。

我有一个类似的问题,多个不同长度的时间序列;每个序列都属于一个进程号。但是所有进程都在同一时间内,我不需要使用进程信息。有什么办法可以处理吗? 我也在这方面提出了一个问题:https://stackoverflow.com/questions/55587697/how-to-train-keras-lstm-with-multiple-multivariate-time-series-data - Anakin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接