【问题标题】:LSTM Autoencoder for Anomaly detection in time series, correct way to fit model用于时间序列异常检测的 LSTM 自动编码器,适合模型的正确方法
【发布时间】:2020-11-23 06:46:29
【问题描述】:

我正在尝试找到使用 LSTM 自动编码器在互联网上定义时间序列数据异常的正确示例,并查看了很多示例,其中 LSTM 自动编码器模型配有标签,这些标签是特征序列的未来时间步长(如对于使用 LSTM 进行通常的时间序列预测),但我认为,这种模型应该使用与特征序列(之前的时间步长)序列相同的标签进行训练。

此搜索在谷歌中的第一个链接例如 - https://towardsdatascience.com/time-series-of-price-anomaly-detection-with-lstm-11a12ba4f6d9

1.该函数定义了获取标签的方式(y特征)

def create_sequences(X, **y**, time_steps=TIME_STEPS):
    Xs, ys = [], []
    for i in range(len(X)-time_steps):
        Xs.append(X.iloc[i:(i+time_steps)].values)
        ys.append(y.iloc**[i+time_steps]**)
    
    return np.array(Xs), np.array(ys)

X_train, **y_train** = create_sequences(train[['Close']], train['Close'])
X_test, y_test = create_sequences(test[['Close']], test['Close'])

2.模型拟合如下

history = model.fit(X_train, **y_train**, epochs=100, batch_size=32, validation_split=0.1,
                    callbacks=[keras.callbacks.EarlyStopping(monitor='val_loss', patience=3, mode='min')], shuffle=False)

您能否在指向datascience.com/ 的链接中评论自动编码器的实现方式? 是否应该按照以下方式拟合正确的方法或模型?

model.fit(X_train,X_train)

提前致谢!

【问题讨论】:

  • 我在这里看不到问题。您完全按照此处提供的代码towardsdatascience.com/…。培训按照作者在帖子中的详细说明进行。那么,您是否在寻求帮助以了解其工作原理?
  • 我认为按照文章所示拟合 Autoencoder 模型的方法是错误的。我在不同的来源(Kaggle、面向数据科学等)中看到了很多这样的例子。在我看来,应该拟合模型,因为我注意到 model.fit(X_train,X_train)。我的问题:模型在文章中的拟合方式是否正确?
  • 自动编码器的工作(顾名思义)是重新生成输入。您的输入是 X_train,并且您正在尝试生成 X_train。我不明白为什么 fit 声明不正确。使用自动编码器的异常检测是尝试重新生成输入,然后比较输入和生成的输出之间的残差损失的行为。损失越多,异常得分越高。
  • 文章中的模型配备了 y_train,它是未来 t+1 时间戳的标签,我不明白您为什么将这种方式标记为尝试生成 X_train 或重新生成输入?在我看来,它试图预测未来的标签,不是吗?

标签: keras time-series lstm anomaly-detection


【解决方案1】:

这是时间序列自动编码器。如果你想预测未来,它就是这样。自动编码器/机器学习模型拟合对于不同的问题及其解决方案是不同的。您无法针对所有问题训练和拟合一个模型/工作流程。时间序列/时间流逝可以是我们已经收集的时间段数据和预测,也可以是收集的数据和未来的预测。两者的构造不同。就像地下地球的时间序列数据不同,天气预报也不同。一种模型不能同时适用。

【讨论】:

  • 感谢您的回答。您能否就这篇文章回答一下,是否有经过正确训练的自动编码器?
  • 这对于这个特意构建的模型是正确的。这是财务预测。您在时间序列未来预测自动编码器和基于图像匹配问题的自动编码器或其他简单模型拟合之间被困/困惑。
  • 我可以看到如下示例 1) kaggle.com/dimitreoliveira/… 2) mdeditor.tw/pl/2u3q 3) rickyhan.com/jekyll/update/2017/09/14/autoencoders.html 作者正在训练 LSTM-autoencoder 用于时间序列数据中的异常检测(不是图像匹配问题),使用只需输入表示(输入序列)作为标签。您能否评论一下是否描述了其他案例,或者他们以这种方式犯了错误的训练模型?
  • 我的回答和上面一样。
【解决方案2】:

根据定义,自动编码器是任何试图复制其输入的模型,与架构类型(LSTM、CNN、...)无关。

以这种方式构建它是一项无监督的任务,因此培训将是:model.fit(X_train,X_train)

现在,她在您链接的文章中所做的是为 LSTM 自动编码器使用通用架构,但应用于时间序列预测:

model.add(LSTM(128, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(RepeatVector(X_train.shape[1]))
model.add(LSTM(128, return_sequences=True))
model.add(TimeDistributed(Dense(X_train.shape[2])))

她正在以某种方式对数据进行预处理以获得 X_train = [x(t-seq)....x(t)] 和 y_train = x(t+1)

for i in range(len(X)-time_steps):
        Xs.append(X.iloc[i:(i+time_steps)].values)
        ys.append(y.iloc[i+time_steps])

因此,模型本身并不会重现它输入的输入,但这并不意味着它不是一个有效的实现,因为它产生了有价值的预测。

【讨论】:

    猜你喜欢
    • 2021-01-07
    • 1970-01-01
    • 2018-10-01
    • 2020-03-19
    • 2021-07-18
    • 2018-07-16
    • 2022-01-22
    • 2020-08-27
    • 1970-01-01
    相关资源
    最近更新 更多