如何处理 LSTM 模型中的一些时间序列?

how dealing with some time series in LSTM model?

我是keras的新用户,我想轻松了解如何构建lstm模型。

在我的数据中,我有很多用户,有很多序列,如下:

user 1 :
         X            Labels
    sequence 1   [ 0, 1 , 0, 1]
    sequence 2   [ 0, 1 , 0, 1]
    sequence 3   [ 0, 1 , 0, 1
    sequence 4          ?

user 2 :
        X             labels
    sequence 1   [ 0, 1 , 0, 1]
    sequence 2   [ 0, 1 , 0, 1]
    sequence 3          ?

每个用户都有序列系列,但必须是相同长度的系列。每个系列对应一个多标签系列。 我的目标是预测每个用户的下一个序列的标签,同时考虑最后一个序列(作为时间序列)。

当我只使用一个用户时,我成功了。事实上,我做了一个 lstm 输入 (批量大小、时间步长、特征)其中批量大小等于 1,因为我有一个用户,时间步长等于序列数,特征等于序列长度。

model_rnn = Sequential()
model_rnn.add(LSTM(20, return_sequences=True, input_shape=(None, 20)))
model_rnn.add(TimeDistributedDense(nb_classes)) 
model_rnn.add(Activation("sigmoid"))
optimizer = RMSprop(lr=0.01,decay=1e-6)
model_rnn.compile(loss='binary_crossentropy', optimizer=optimizer)
X_train = X_train.reshape((1,50,20))
y_train = y_train.reshape((1,50,109))
model_rnn.fit(X_train,y_train, batch_size=1, epochs=200)

我有两个问题: 当我拟合模型时,shuffle=False 重要吗?
当我定义 LSTM 时,是否应该将有状态选项设置为 True?

我已经为一个用户获得了不错的表现。我想对所有用户使用相同的方法。但我不知道如何为所有用户构建输入。

比如我想学习老用户的序列,预测他的下一个序列, 我会被迫为每个用户训练 LSTM 吗?或者我可以在一个 LSTM 中学习每个用户的时间序列序列? 特别是如果我使用一个 LSTM 并且我想预测一个用户的下一个序列,模型如何预测好句子,就像它不知道训练数据上的这个旧序列一样。

请注意,重要的是要考虑序列用户在它们之间是独立的。

感谢您的帮助

当我拟合模型时,shuffle=False 是否重要?

不,这并不重要,除非您将有状态设置为 True。请在下面查看下一个问题的答案。


定义 LSTM 时是否应该将有状态选项设置为 True?

LSTM 具有单元格,因此根据定义是有状态的(与 Keras 中使用的有状态含义不同)。 Fabien Chollet 给出了状态性的定义:

stateful: Boolean (default False). If True, the last state for each sample at index i in a batch will be used as initial state for the sample of index i in the following batch.

因此,如果您在 Keras 中将 LSTM 设置为无状态,则单元状态会在每个序列处重置。设置有状态模式后,所有状态都会传播到下一批。这意味着位于索引 i 的样本的状态 X_{i} 将用于下一批样本 X_{i+bs} 的计算,其中 bs 是批量大小(无改组)。

请注意,默认情况下,Keras 会打乱(排列)样本 X,并且 X_{i} 和 X_{i+1} 之间的依赖关系会丢失。因此,如果将 stateful 选项设置为 True,请确保设置 shuffle=False.


我想学习旧用户序列并预测他的下一个序列,我会被迫为每个用户训练一个LSTM吗?或者我可以在ONE LSTM中学习每个用户的时间序列序列?

我相信,你需要一个 LSTM,因为它对一个用户来说效果很好。您可以像为一个用户所做的那样,将所有用户的所有序列视为您的训练数据。