首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异常数据具有与正常数据相似的误差值

异常数据具有与正常数据相似的误差值
EN

Stack Overflow用户
提问于 2020-06-19 04:46:18
回答 1查看 93关注 0票数 0

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

我从总体数据(不是X_train的一部分)中切下50个样本,并将其中一个特征更改为全零,从而生成我的测试集。我还尝试向其中一个特征添加噪声,并将多个特征设为零。

代码语言:javascript
复制
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的拓扑

代码语言:javascript
复制
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,测试的MSE平均值为0.003。因此,我不能为异常数据选择一个好的阈值,因为有很多正常点的MSE得分高于“异常”数据。对于为什么这个网络无法检测到这些异常,您有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2021-02-17 19:48:22

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

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

在此之后,您可以很容易地找到您的异常值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62459127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档