稀疏时间序列数据的 RNN

机器算法验证 时间序列 神经网络 循环神经网络 不均匀间隔时间序列
2022-03-28 11:41:23

我有看起来像这样的时间序列数据:

    Series 1                         Series 2
    ╔══════╦════════╦════════╗       ╔══════╦════════╦════════╦════════╗
    ║ Time ║ Value1 ║ Value2 ║       ║ Time ║ Value1 ║ Value2 ║ Value3 ║
    ╠══════╬════════╬════════╣       ╠══════╬════════╬════════╬════════╣
    ║ 3:30 ║ 10     ║ 100    ║       ║ 3:32 ║ 12     ║ 56     ║ 34     ║
    ║ 3:31 ║ 11     ║ 50     ║       ║ 3:33 ║ 15     ║ 200    ║ 89     ║
    ║ 3:36 ║ 12     ║ 80     ║       ║ 3:35 ║ 15     ║ 90     ║ 66     ║
    ║ 3:50 ║ 11     ║ 80     ║       ║ 3:38 ║ 13     ║ 85     ║ 45     ║
    ║ 3:50 ║ 12     ║ 60     ║       ║ 3:45 ║ 14     ║ 65     ║ 121    ║
    ╚══════╩════════╩════════╝       ╚══════╩════════╩════════╩════════╝

重要的特点是

  • 数据并非每分钟都存在。
  • 每分钟可以进行多次观察。

我想使用 RNN 根据直到那一刻之前的系列 1 和系列 2 的观察来预测系列 1 的下一次观察(并特别使用 keras)。问题是在我发现的所有 RNN 中,数据点之间的时间间隔是恒定的。例如,在预测句子中下一个字符的 RNN 中,一次输入 20 个字符的数据,其中字符之间的“时间间隔”是恒定的。

那么我怎样才能使它适应我拥有的数据呢?我的选择似乎是:

  • 填写每分钟的数据,如果在一分钟内出现多个观察值,则取平均值。然后我可以使用像字符预测 RNN 的输入这样的数据。上述数据将变为

    Series 1
    ╔══════╦════════╦════════╗
    ║ Time ║ Value1 ║ Value2 ║
    ╠══════╬════════╬════════╣
    ║ 3:30 ║ 10     ║ 100    ║
    ║ 3:31 ║ 11     ║ 50     ║
    ║ 3:32 ║ 11     ║ 50     ║
    ║ 3:33 ║ 11     ║ 50     ║
    ║ 3:34 ║ 11     ║ 50     ║
    ║ 3:35 ║ 11     ║ 50     ║
    ║ 3:36 ║ 12     ║ 80     ║
    ║ 3:37 ║ 12     ║ 80     ║
    ║ ...  ║        ║        ║
    ║ 3:50 ║ 11.5   ║ 70     ║
    ╚══════╩════════╩════════╝
    
  • 这种方式确实不太理想,因为在一分钟内发生多次观察的事实中包含了相当多的信息。它还会大大增加数据大小和训练时间。

  • 将“时间”变量连同“自上次观察以来的时间”变量一起输入到 RNN 中。我还必须将这两个系列合并为一个,以及一个标志(1 或 2,作为单热编码),指示它来自两个系列中的哪一个。然后我可以一次只提供 20 个(或任何数量)观察的数据,而不是一次 20 分钟。我不确定这是否会很好地工作,而且我在互联网上找不到类似的东西。这是一种有效的方法吗?
1个回答

这在一定程度上取决于在点之间进行插值以填充缺失数据点是否有意义,即点之间是否存在高度相关性,或者它们在每分钟读数时是否完全随机。如果它们是相关的,那么用均匀的时间间隔填充它们可能是要走的路。如果这些值是随机的并且彼此独立,那么这将不起作用。

第二种方法(可能)不起作用,一个问题是时间本身并不会真正直接影响值,因此您的 RNN 中将有一个没有预测能力的输入。这往往会产生糟糕的结果。另一个大问题是让你的 RNN 在未来产生时间点;ANN 通常不会产生超出观察到的输入数据范围的值。

如果插值方法不适用于您的时间序列数据,我可能会建议以较粗的频率重新采样,例如每 5 或 10 秒一次,并在每个间隔(或如果需要平均)处获取最近的点。它会减少一些信息,但会避免在没有意义的地方进行潜在的插值。

简而言之,这是一个重要的问题,据我所知,没有标准或通用的方法来处理可变时间增量的问题,但希望这些是一些有用的想法。