Autenocoder 和异常检测任务

数据挖掘 时间序列 自动编码器 异常检测 过拟合 matplotlib
2022-03-15 02:51:29

我正在尝试为异常检测任务创建一个自动编码器,但我注意到即使它在训练集上表现得非常好,它也会开始停止重新创建一半的测试集。我尝试了 10 多个模型(LSTM、ConvAE、ConvLSTM),但它们都无法在同一点重建时间序列。

这些是在训练集上的表现。蓝色部分是原始时间序列,红色部分是 AE 重建的时间序列。

在此处输入图像描述

这些是在训练集上的表现。我不明白为什么所有模型从那时起停止执行。这是否意味着那部分有异常?

在此处输入图像描述

编辑:我正在用有关我的数据集和代码的一些详细信息来更新问题:我有一个包含 30 个设备的数据集,每个设备都有大约 9000 个值。数据集也是结构化的:

device1   device2   device3   ....   device30
 0.20      0.35      0.12              0.56
 1.20      2.10      5.75              0.16
 3.20      9.21      1.94              5.12
 5.20      4.32      0.42              9.56
 ....      ....      ....              ....
 7.20      6.21      0.20              -9.56

由于我遵循本指南,我开始创建一个序列方法来为 Conv1D 层准备数据:

TIME_STEPS = 10
# Generated training sequences for use in the model.
def create_sequences(values, time_steps=TIME_STEPS):
    output = []
    for i in range(len(values) - time_steps):
        output.append(values[i: (i + time_steps)])
    return np.stack(output)

这是我创建序列和规范化数据集的地方:

# split the train/val/test set
n_features = dataset_sequences.shape[1]
X_train = dataset_sequences[0:3000, :]
X_val = dataset_sequences[3000:6000, :]
X_test = dataset_sequences[6000:9000, :]

# normalize the data
train_mean = X_train.mean()
train_std = X_train.std()
X_train = (X_train - train_mean) / train_std
X_val = (X_val - train_mean) / train_std
X_test = (X_test - train_mean) / train_std

然后,我将形状为 (3000, 10, 30) 的 X_train 提供给我的 Conv1D 自动编码器:

model = tf.keras.Sequential(
    [
        tf.keras.layers.Input(shape=(X_train.shape[1], X_train.shape[2])),
        tf.keras.layers.Conv1D(
            filters=64, kernel_size=5, padding="same", strides=1, activation="relu"),
        tf.keras.layers.Dropout(rate=0.2),
        tf.keras.layers.Conv1D(
            filters=32, kernel_size=5, padding="same", strides=1, activation="relu"),
        tf.keras.layers.MaxPooling1D(pool_size=2),
        tf.keras.layers.Conv1DTranspose(
            filters=32, kernel_size=5, padding="same", strides=1, activation="relu"),
        tf.keras.layers.Dropout(rate=0.2),
        tf.keras.layers.Conv1DTranspose(
            filters=64, kernel_size=5, padding="same", strides=1, activation="relu"),
        tf.keras.layers.UpSampling1D(size=2),
        tf.keras.layers.Conv1DTranspose(filters=30, kernel_size=5, padding="same"),
    ]
)
2个回答

查看您的图形,当您的模型开始预测 0 时,系列行为似乎发生了变化。由于您在多个模型中遇到了相同的问题,我会说这是一个数据问题。

  • 你检查过这些值吗?
  • 尝试绘制 1 期回报?
  • 尝试跳过验证集中有效的部分并直接从模型开始失败时进行预测 - 甚至在 X_test[1200:] 或 X_test[2000:] 之后

我的代码中没有错误,相反,我发现当您处理异常检测任务时,您得到的重建与原始重建不同,那么您只是在数据集中发现了异常。