使用多个不同长度和多个特征的时间序列时,如何为 LSTM 准备数据?
How to prepare data for LSTM when using multiple time series of different lengths and multiple features?
我有一个来自多个用户 (nUsers) 的数据集。每个用户在时间上随机采样(每个用户的 nSamples 是非常数)。每个样本都有许多特征 (nFeatures)。
例如:
n 个用户 = 3 ---> 3 个用户
nSamples = [32, 52, 21] ---> 第一个用户被采样了 32 次,第二个用户被采样了 52 次等等
nFeatures = 10 ---> 每个样本的特征数量不变。
我希望 LSTM 根据当前特征和同一用户的先前预测生成当前预测。
我可以使用 LSTM 层在 Keras 中做到这一点吗?
我有 2 个问题:
- 每个用户的数据有一个不同的时间序列。我该如何合并?
- 我如何处理将之前的预测添加到当前时间特征中 space 以进行当前预测?
感谢您的帮助!
听起来每个用户都是一个序列,因此,用户可能是您问题的"batch size"。所以一开始,nExamples = nUsers
。
如果我正确理解你的问题(预测下一个元素),你应该定义最大长度 "looking back"。例如,假设您可以通过查看前 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).
然后你将不得不"pad"序列来填补空白。
例如,您可以用零特征填充序列的开头,例如:
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 对 "variable length sequences" 的支持。您仍然使用固定大小的数组,但在内部它会(?)丢弃零值。
我有一个来自多个用户 (nUsers) 的数据集。每个用户在时间上随机采样(每个用户的 nSamples 是非常数)。每个样本都有许多特征 (nFeatures)。 例如:
n 个用户 = 3 ---> 3 个用户
nSamples = [32, 52, 21] ---> 第一个用户被采样了 32 次,第二个用户被采样了 52 次等等
nFeatures = 10 ---> 每个样本的特征数量不变。
我希望 LSTM 根据当前特征和同一用户的先前预测生成当前预测。 我可以使用 LSTM 层在 Keras 中做到这一点吗? 我有 2 个问题:
- 每个用户的数据有一个不同的时间序列。我该如何合并?
- 我如何处理将之前的预测添加到当前时间特征中 space 以进行当前预测?
感谢您的帮助!
听起来每个用户都是一个序列,因此,用户可能是您问题的"batch size"。所以一开始,nExamples = nUsers
。
如果我正确理解你的问题(预测下一个元素),你应该定义最大长度 "looking back"。例如,假设您可以通过查看前 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).
然后你将不得不"pad"序列来填补空白。
例如,您可以用零特征填充序列的开头,例如:
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 对 "variable length sequences" 的支持。您仍然使用固定大小的数组,但在内部它会(?)丢弃零值。