时间序列分类:LSTM模型之处理变序列长度输入

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了时间序列分类:LSTM模型之处理变序列长度输入相关的知识,希望对你有一定的参考价值。

参考技术A 摘自: https://datascience.stackexchange.com/questions/48796/how-to-feed-lstm-with-different-input-array-sizes

The easiest way is to use  Padding and Masking .

There are three general ways to handle variable-length sequences:

(1)Padding and masking,

(2)Batch size = 1,

(3)Batch size > 1, with equi-length samples in each batch.

In this approach, we pad the shorter sequences with a special value to be masked (skipped) later. For example, suppose each timestamp has dimension 2, and -10 is the special value, then

will be converted to

This way, all sequences would have the same length. Then, we use a  Masking  layer that skips those special timestamps like they don't exist. A complete example is given at the end.

For cases (2) and (3) you need to set the seq_len of LSTM to None, e.g.

this way LSTM accepts batches with different lengths; although samples inside each batch must be the same length. Then, you need to feed a  custom batch generator  to  model.fit_generator  (instead of  model.fit ).

I have provided a complete example for simple case (2) (batch size = 1) at the end. Based on this example and the link, you should be able to build a generator for case (3) (batch size > 1). Specifically, we either (a) return batch_size sequences with the same length, or (b) select sequences with almost the same length, and pad the shorter ones the same as case (1), and use a Masking layer before LSTM layer to ignore the padded timestamps, e.g.

where first dimension of input_shape in Masking is again None to allow batches with different lengths.

Here is the code for cases (1) and (2):

Note that if we pad without masking, padded value will be regarded as actual value, thus, it becomes noise in data. For example, a padded temperature sequence [20, 21, 22, -10, -10] will be the same as a sensor report with two noisy (wrong) measurements at the end. Model may learn to ignore this noise completely or at least partially, but it is reasonable to clean the data first, i.e. use a mask.

用于序列二进制分类的 Keras LSTM 模型

【中文标题】用于序列二进制分类的 Keras LSTM 模型【英文标题】:Keras LSTM model for binary classification with sequences 【发布时间】:2018-10-01 07:27:39 【问题描述】:

我目前正在做一个更大的项目。 目标是自动找到时间序列中的分割点,将序列分割为基本模式。

我有很多时间序列形式的训练数据,具有不同长度和在有用位置手动记录的分割点。 基本上,我有xyz 位置以及这些点在长度为 2、25 和 50(dist2dist25dist50)的中心窗口上的距离。我还将房间划分为 3D 网格,并找出位置所在的单元格(cell_xcell_ycell_z)。我认为这可能很有用,因为基本操作更有可能在一两个单元格中。

cell_x, cell_y, cell_z 基于size 50。垂直的红线是训练数据的分割点。

现在我想知道时间序列中的每个点是否是分割点。

在我看来,这些功能已经足够开始了,但我认为我的 Keras 模型不正确,因为在 0 的时间序列索引处,结果总是且只有 1。它基本上是一个基于过去和未来值的二元分类问题。这就是我尝试使用 LSTM 解决它的原因。它看起来像这样:

model = Sequential()

model.add(LSTM(20, input_shape = (None, input_dim), return_sequences = True))
model.add(Dropout(0.5))
model.add(LSTM(20))
model.add(Dropout(0.5))
model.add(Dense(1, activation = 'sigmoid'))

model.compile(loss='binary_crossentropy',
            optimizer='adam',
            metrics=['accuracy'])

因为我处于整个机器学习主题的最开始,并且材料的质量有点压倒性,所以我在这里寻求一些帮助。我知道还有很多其他的事情(错误的训练数据、错误的特征、错误的参数……)会导致这个结果,但我想知道如何正确地为这个问题建立一个 Keras 模型。我已经找到了很多 Keras 示例,但我不确定它们是否适合问题。

【问题讨论】:

我有点不知道你期望什么样的输出。 对不起,我想知道该系列的每个点是否是分割点。 你能上传你的 I/O 数据吗? 一条记录的特征和标签:gist.github.com/chryb/2b3312b0ab640a1f28c8cb2d3dbbd86e | is_keyframe 列表示每个索引的标签。基于 *** 问题,我将以下数据转换为正确的 LSTM 输入格式:gist.github.com/chryb/3de34ba44488012bf79ff4c51a2a43ae 也许Data Science 论坛上的一个问题可能会给你一个快速的答案。 【参考方案1】:

评论太长了,所以我将其发布为答案:

首先,原则上,您可以将数据输入Keras 的 LSTM,并希望网络学会如何发现您所谓的分割点。有了足够的(标记的)数据,这似乎是一个有趣的项目,即使不平衡的类可能是一个问题(这肯定可以使用权重、重采样技术或类似技术来解决)!我相信所有这些都已经在各种 cmet 中说过了。如果您并不真正关心时间维度,您可能还想尝试查看其他网络架构的性能。

在更一般的层面上,我想知道顺序神经网络是否是解决此问题的正确方法。在时间序列计量经济学和相关领域中,有许多久经考验的方法。它们有各种名称,从structural break、change point 或参数稳定性检测。如果您想确定新数据点是否属于不同的制度,那么您可能会发现一些异常/异常值检测技术很有用。要找到适合您的特定设置的合适统计测试(旨在查找发生中断时的时间索引),您可能需要深入研究actual literature,因为其中只有少数是现成的在开源包中(即“很少”作为所有东西的一小部分)。我知道 R 包中有一些可用的选项(click,click),我确信 Python 中存在类似的东西,虽然我对 Python 中的统计包不是很熟悉,所以我可以t 链接到任何,即使它们确实存在。

如果您正在寻找一种易于访问的高级开源解决方案,有些人会发现 facebook's prophet 很有趣,它允许您对时间序列进行建模,并且其中包括自动检测 change points 等功能.我不确定您标记的分割点在多大程度上可以输入模型以帮助学习这些点,但一个好的起点可能是查看自动检测到的点是否与您的标记点相似。

【讨论】:

以上是关于时间序列分类:LSTM模型之处理变序列长度输入的主要内容,如果未能解决你的问题,请参考以下文章

用于序列二进制分类的 Keras LSTM 模型

中文文本分类之TextRNN

在 keras 中使用 CNN-LSTM 模型进行序列到序列分类

predict_classes 返回 LSTM 分类模型的冲突形状

基于LSTM+FCN处理多变量时间序列问题记录

LSTM 时间序列分类