【问题标题】:Anomalies have similar error values to normal data异常具有与正常数据相似的误差值
【发布时间】:2020-10-09 01:12:36
【问题描述】:

我有惯性测量单元 (IMU) 数据,我正在为其构建异常检测自动编码器神经网络。我有大约 5k 个训练样本,其中 10% 用于验证。我还有大约 50 个(尽管我可以制作更多)样本来测试异常检测。我的数据集有 12 个 IMU 特征。我训练了大约 10,000 个 epoch,在训练期间我获得了大约 0.004 的重构均方误差 (MSE)。训练后,我对测试数据进行 MSE 计算,得到的值与训练数据中的值非常相似(0.003),我不知道为什么!

我通过从整体数据(不是 X_train 的一部分)中切分 50 个样本并将其中一个特征更改为全零来制作我的测试集。我还尝试向其中一项功能添加噪音以及将多个功能设为零。

np.random.seed(404)
np.random.shuffle(all_imu_data)

norm_imu_data = all_imu_data[:len_slice]
anom_imu_data = all_imu_data[len_slice:]
anom_imu_data[:,6] = 0

scaler = MinMaxScaler()
norm_data = scaler.fit_transform(norm_imu_data)
anom_data = scaler.transform(anom_imu_data)
X_train = pd.DataFrame(norm_data)
X_test = pd.DataFrame(anom_data)

我尝试了许多不同的网络大小,包括隐藏层的数量和隐藏节点/层的数量。例如,我展示了一个类似 [12-7-4-7-12] 的拓扑:

input_dim = num_features

input_layer = Input(shape=(input_dim, ))
encoder = Dense(int(7), activation="tanh", activity_regularizer=regularizers.l1(10e-5))(input_layer)
encoder = Dense(int(4), activation="tanh")(encoder)
decoder = Dense(int(7), activation="tanh")(encoder)
decoder = Dense(int(input_dim), activation="tanh")(decoder)

autoencoder = Model(inputs=input_layer, outputs=decoder)
autoencoder.compile(optimizer='adam', loss='mse', metrics=['mse'])
history = autoencoder.fit(X_train, X_train,
                    epochs=nb_epoch,
                    batch_size=batch_size,
                    shuffle=True,
                    validation_split=0.1,
                    verbose=1,
                    callbacks=[checkpointer, tensorboard]).history
pred_train = autoencoder.predict(X_train)
pred_test = autoencoder.predict(X_test)
mse_train = np.mean(np.power(X_train - pred_train, 2), axis=1)
mse_test = np.mean(np.power(X_test - pred_test, 2), axis=1)
print('MSE mean() - X_train:', np.mean(mse_train))
print('MSE mean() - X_test:', np.mean(mse_test))

执行此操作后,我得到的 MSE 平均数为 0.004 的 Train 和 0.003 的 Test。因此,我无法为异常数据选择一个好的阈值,因为有很多正常点的 MSE 分数高于“异常”数据。 关于为什么这个网络无法检测到这些异常有什么想法吗?

【问题讨论】:

  • 推荐绘制每个实例的异常分数/重建损失/MSE的分布,按异常分组,而不是按异常分组。这将显示是否可以选择一个阈值来分隔两者
  • 另外,您有一个包含 50 个时间步长和 11 个特征的时间序列。但是,您的自动编码器是完全连接的类型,它对时间依赖性建模的能力非常差。我建议尝试卷积和/或循环自动编码器。
  • 您是否绘制了 50x12 输入(作为 2d 图像)?实际上有什么模式可以让网络学习吗?
  • IMU 数据是什么,你在寻找什么样的异常?
  • @jonnor 我已经在直方图中绘制了两者的 MSE 分布,并且没有可以选择阈值的点;它们的正常和异常具有非常相似的分布。我不是想捕捉时间依赖性。我将在不久的将来测试 LSTM,但在这个阶段,FC AE 仍应捕获模式。我还没有绘制 50x12 的图像,但我认为我无法破译模式。这就是AE的用途!如果我能找到一个模式,我会构建一个经典的异常值检测器。这是飞机 IMU。寻找可能导致失败的问题。

标签: keras neural-network autoencoder anomaly-detection


【解决方案1】:

这是完全正常的。您在整个数据的子样本上训练您的自动编码器。因此,也有异常会污染您的训练数据。自动编码器的目的是找到原始数据的完美重建,包括异常。这是一个非常强大的工具,所以如果你在训练数据中显示异常,它会很容易地重建它们。

您需要使用另一种异常检测算法(例如隔离森林)删除 5% 的异常数据,并对这部分数据进行二次抽样(没有异常值)。

之后,您可以轻松找到异常值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 2018-05-23
    相关资源
    最近更新 更多