用于捕获多种模式的 LSTM

数据挖掘 时间序列 喀拉斯 rnn
2022-02-17 13:21:13

我正在尝试使用 LSTM 来预测用户的日常使用情况我有大量用户使用(比如说)90 天的数据。根据业务知识(和初步分析),我们知道用户大致分为不同的类别。例如,每日用户几乎每天都会有非零使用量,每周用户每 7 天会有一到两天的非零使用量,而每月用户每 30 天会有几天的非零使用量。

示例数据,其中每一列是从 10 月 1 日开始的一天,每一行是一个用户的数据。(每个用户的使用“周期”可能从任何一天开始)。

User 1: 10,  8, 10,  9, 0, 0, 11, ...
User 2:  0,  0,  0, 20, 0, 0,  0,  0,  0, 18,  0,  0,  0, ...
User 3: 40,  0,  0,  0, .....

其中用户 1 可能是“每日”用户,用户 2 是“每周”用户,用户 3 是每月用户。

我的第一个问题是,单个 LSTM/深度学习模型能否捕获这些不同类型的模式?目标是预测个人用户的每日使用情况(基于过去 90 天的未来几天)。

目前我正在使用一个非常简单的 LSTM(在 Keras 中):

model = Sequential()
model.add(LSTM(1, input_shape=(90, 1), unroll=True))
model.compile(optimizer='rmsprop', loss='mse')

为了帮助模型“捕捉”不同用户可能具有不同使用水平的事实,我添加了每个用户的平均使用量(非零值)作为每行的第一个数据点。每个用户的其余 90 个数据点仍如上表所示。

我的第二个问题是我是否真的需要添加这些值的平均值来“帮助”模型?

问题是即使在 100 个 epoch 之后,错误仍然保持不变。最后我可以改变什么来使它工作?

提前致谢。

1个回答

建模是一个你发明假设然后试图拒绝它们的过程。如果没有看到您的数据,就无法保证其中任何一个都会走得更远。但这里有一些想法。

  1. 每天90天的观察似乎太少了,无论你使用什么模型,这都不会带来太大的信心。

1.1 如果您将每个用户视为一个连续观察,是的,您的数据集对于像 RNN 这样的模型来说已经足够了。但是问问自己这个问题,是否有用户是独特的和不同的,你不知道他们与其他用户有何不同。

  1. 您似乎一开始就相信存在三种类型的用户。我建议不要。让数据告诉你有多少种类型。并且出于预测未来使用的目的,您并不关心这种类型的信息。

  2. 如果您认为用户行为在时间上独立且具有横截面依赖性,则循环神经网络是一个不错的选择。否则,像 ARIMA 这样的时间序列模型可能会做得更好,并且需要更少的资源来拟合。

  3. 最后,如果要对数据进行归一化,应通过将每行减去行均值并除以行标准差来实现。通过添加平均值作为第一个观察值,你会混淆神经网络,它还不够聪明,无法以不同的方式处理这个数据点。除非用户之间存在巨大差异,否则我会在没有标准化的情况下开始,拟合模型,找出某种样本外 MSE,然后对标准化数据重复。

编辑:如果你没有一个好的分割参数,就没有理由在这组数据上训练多个 RNN。