从特征向量进行异常检测的自动编码器

数据挖掘 喀拉斯 异常检测 自动编码器 生物信息学
2021-09-27 04:00:57

我正在尝试使用自动编码器(如此处所述https://blog.keras.io/building-autoencoders-in-keras.html#)进行异常检测。我正在使用 ~1700 特征向量(而不是示例中使用的图像),每个向量描述不同的蛋白质相互作用。我有一个“正常”类别的交互,我在上面训练 AE,然后我给它提供新的向量并使用重建错误来检测异常交互。

调整我的阈值使我得到 0.95 的真阳性率,我得到 0.15 的假阳性率,这是相当高的。当我在正常和异常向量上训练 xgboost(在训练和测试中使用两种类型的交互)时,我能够获得 0.98 ** 的精度。

这是否意味着我的模型(或者实际上是我使用 AE 的方法)无效,或者这可能是我在训练异常检测器而不是 2 类别分类器(即我的情况下为 xgboost)时所希望的最好的?我应该如何进行?

** 当然,这只是一个健全性检查,不能作为解决方案。我需要该模型来检测可能与我目前拥有的非常不同的异常 - 因此我需要在正常交互集上对其进行训练,并将异常留给单独进行测试。

2个回答

这是否意味着我的模型(或者实际上我使用 AE 的方法)无效

这要看情况。自动编码器是一个相当广泛的领域,有很多超参数可以调整,宽度,深度,损失函数,优化器,epochs。

我应该如何进行?

从我的直觉来看,我会说您没有足够的数据来正确训练 AE。请记住,MNIST 数据库包含 50,000 张图像。而且您需要足够的方差才能不过度拟合您的训练数据。至少根据我的经验,基于树的方法更容易训练。如果您喜欢坚持异常检测部分,我建议您这样做,因为您不知道您将面临什么异常,请尝试隔离森林算法。但是对于一个可靠的建议,我需要知道您的数据的外观。

顺便说一句,在这种情况下使用的一个很好的指标是 ROC 分数,它基本上告诉您模型正确分类新数据点的可能性有多大。查看链接以获得视觉解释ROC 解释

所以基线是,尝试不太复杂的方法,直到你确定它们还不够。

从 sklearn.preprocessing 添加 StandardScaler 在一定程度上改善了结果,就像(在这种情况下)使网络更深一样。