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

Chr*_*ryb 5 python machine-learning time-series keras tensorflow

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

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

图。1

图2 cell_x, cell_y, cell_z 基于大小 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'])
Run Code Online (Sandbox Code Playgroud)

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

cof*_*nky 2

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

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

在更一般的层面上,我想知道顺序神经网络是否是正确的方法。时间序列计量经济学及相关领域有许多经过考验的方法。它们有不同的名称,包括结构断裂变化点或参数稳定性检测。如果您想确定新数据点是否属于不同的体系,那么您可能会发现一些异常/离群值检测技术很有用。为了找到适合您的特定设置的合适的统计测试(旨在找到发生中断时的时间指数),您可能需要深入研究实际文献,因为其中只有少数可以轻松获得。开源包(即“很少”,占所有资源的一小部分)。我知道 R 包中有一些可用的选项(clickclick),并且我确信 Python 中也存在类似的选项,尽管我对 Python 中的统计包不是很熟悉,所以我无法链接到任何即使它们确实存在。

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