使用神经网络检测异常

数据挖掘 张量流 喀拉斯 异常检测
2021-10-14 02:20:41

我有一个每天生成的大型多维数据集。

与前几天相比,什么是检测任何“异常”的好方法?这是一个可以用神经网络解决的合适问题吗?

任何建议表示赞赏。

附加信息:没有示例,因此该方法应自行检测异常

4个回答

从问题的表述来看,我假设没有任何异常(即标签)的“例子”。有了这个假设,一种可行的方法是使用自动编码器:神经网络接收您的数据作为输入,并经过训练以输出相同的数据。这个想法是训练允许网络以潜在变量的形式学习输入数据分布的表示。

有一种称为去噪自动编码器的自动编码器,它使用原始数据的损坏版本作为输入和未损坏的原始数据作为输出进行训练这提供了一个可以从输入中去除噪声(即数据损坏)的网络。

您可以使用每日数据训练去噪自动编码器。然后将其用于新的每日数据;这样,您就拥有了原始的每日数据和这些相同数据的未损坏版本然后,您可以比较两者以检测显着差异。

这里的关键是您选择的显着差异定义。您可以计算欧几里得距离并假设如果它超过某个任意阈值,则说明您有异常。另一个重要因素是您引入的腐败类型;它们应尽可能接近合理的异常。

另一种选择是使用生成对抗网络训练的副产品是一个鉴别器网络,它将正常的日常数据与异常数据区分开来。

我认为这在很大程度上取决于您的数据的性质(分类/连续)。我会先从简单的方法开始。我想到了那些:

  • 您可以通过使用分位数或任何统计测试来比较每个变量的分布,以查看它们是否存在显着差异
  • 您还可以计算每个标签/类别的出现次数并进行比较
  • 我也会尝试使用任何距离测量。例如,您可以计算马氏距离并寻找大的变化
  • 或者一些非常简单的东西——只是新旧数据之间的绝对差异,设置一个阈值,超过阈值的所有内容都会被报告
  • 您还可以使用一些多维技术——如相关矩阵、主成分、聚类等,并寻找变化

如果这些都不合适,那么就有专门用于异常检测的整个统计/机器学习模型分支。SVM、t-SNE、隔离森林、对等组分析断点分析、时间序列(您可以在其中寻找趋势之外的异常值)。

这些方法的优点是它们有点像白盒,所以你可以判断为什么某人是异常值。如果这不是您想要的,其他人建议的 ANN 方法也可以。

我正在尝试解决类似的问题。您的数据集是否包含文本和数字特征的混合?如果是这样,检测异常的复杂性会增加(我不知道是什么因素)。如果您的数据集是统一的,例如仅包含数值,您可能会使用仍然需要标记数据集的 RNN,但它可以检测类似模式的时间序列(因为您提到与前一天的值进行比较)

使用自动编码器(无需使用“损坏的数据”进行训练的“去噪自动编码器”)执行此操作的一种简单方法是训练自动编码器,然后检查输入中没有很好解码的行的 RMSE(那些自动编码器很难重建)。根据某种定义,数据将代表异常(当然,这将是流量高峰之类的情况)。