异常检测:使用什么算法?


10

背景信息:我正在开发一个分析临床数据的系统,以过滤掉可能是错别字的难以置信的数据。

到目前为止,我做了什么:

为了量化真实性,到目前为止,我的尝试是对数据进行归一化,然后根据点p与集合D中已知数据点的距离(=训练集合)计算点p的真实性值:

plausibility(p)=qDGauss(distance(p,q))

通过这种量化,我可以选择一个阈值,将合理的数据与不可信的数据分开。我正在使用python / numpy。

我的问题:

  1. 该算法无法检测独立的维度。理想情况下,我可以将关于记录的所有信息放入算法中,让它自己发现维度X不会影响记录的合理性。
  2. 该算法不适用于布尔值或选择输入等离散值。它们可以映射到连续值上,但是与Select 3相比,Select 1与Select 2更接近Select 2是违反直觉的。

题:

我应该为该任务寻找哪种算法?似乎有很多选择,包括基于最近邻居,基于聚类和统计方法。另外,我很难找到有关这种复杂性异常检测的论文。

任何建议都受到高度赞赏。

[编辑]示例:

假设数据由一个人的身高,一个人的体重和时间戳组成-因此它是3D数据。体重和身高是相关的,但时间戳是完全独立的。如果仅考虑欧几里德距离,则必须选择一个小的阈值以适合我的大多数交叉验证数据。理想情况下,该算法将只忽略时间戳记维度,因为确定记录是否合理是无关紧要的,因为时间戳记与任何其他维度都不相关。任何时间戳都是合理的。

另一方面,可以组成一些示例,其中时间戳确实很重要。例如,特征X的值Y在某个日期之前而不是某个日期之后测量时可能是合理的。


请参阅我对stats.stackexchange.com/questions/97946/changepoints-in-r的答复,因为它可以解决这个令人烦恼的问题。
IrishStat 2014年

stats.stackexchange.com/questions/213是否会是您正在寻找的东西?
ub

我怀疑您是否可以为布尔值工作。
阿克萨卡(Aksakal)

@whuber我不确定,它似乎没有涵盖如何忽略无关的尺寸。
乔治2014年

1
顺便说一句,我也正在努力为我描述的方法找到形式。如果我知道正式用语,也将对我的研究有所帮助。也许该算法有一个变种,至少解决了独立/不相关的维度问题。
乔治2014年

Answers:


7

异常检测的典型公式是找到非异常数据的特征中的每个特征的均值和方差,如果是具有分量的那些特征的向量,则将特征组合的概率定义为mxxip(x)

p(x)=i=1mp(xi;μi,σi2)

每个是高斯分布的:X Ñ μ σ 2 xixiN(μi,σi2)

每当时发生异常p(x)<ϵ

每个的分布实际上不一定是正态的,但最好至少类似于正态分布。但是您使用的功能是任意的;它们可以直接从原始数据获取或进行计算,因此,例如,如果您认为使用更好地建模了特征则将特征设置为而不是。xixiloglog(xi)xi

如果您采用这似乎与您已经在做的事情非常相似。q=μ

确定ϵ

该算法适合否定示例(非异常)。但是是由交叉验证集确定的,通常被选择为提供最佳分数的值ϵF1

F1=2PrecisionRecallPrecision+Recall

但是要计算F1,您需要知道什么是异常,什么不是。当系统预测异常并且它实际上是异常时,则为真阳性,而预测异常却不是实际值,则为假阳性。因此,除非您有这些知识,否则您可能不得不依靠猜测。

相关特征的问题

尽管如果特征是相关的,则上述具有缺点。如果是这样,则上述计算可能无法将某些东西标记为实际存在的异常。解决此问题的方法是对特征使用多元高斯,其中是协方差矩阵。mΣ

p(x)=1(2π)m2(detΣ)1/2e12(xμ)TΣ1(xμ)

寻找也是一样,这种方法也有一个缺点,那就是必须计算的逆数。因此,至少必须有与特征数量一样多的样本,并且如果特征数量很大,则该过程将需要大量计算,并且您必须再次保护线性相关特征。请记住这些注意事项,但这对您来说似乎不是问题。ϵΣ


我已经尝试过这种方法,包括多元高斯分布。确实,与此方法无关的功能并不是什么大问题。我发现这种方法不适用于复杂模型。例如,如果我有一个特征为F1,F2的2D数据集,而碰巧是大约F2 = F1 ^ 3,则多元高斯分布只会在数据周围绘制一个椭圆,并对数据进行非常粗略的建模。这就是为什么我选择问题中所述的方法(其中没有一个q但有多个qs)的原因。
乔治2014年

那么,有没有办法采用多元高斯方法并将其应用于捕获更复杂的数据模型?例如,在这种情况下,混合模型可以为我提供帮助吗?我已经阅读了一些有关研究的内容,但是还没有完全了解如何应用它们。
乔治2014年

@Georg Hmm我想知道您的问题是否不是复杂模型的问题,而是复杂数据和过于简单的模型。或换句话说,不合适。在上述情况下,如果不使用使用会发生什么情况?可以从数据中获取特征,也可以计算特征。(F1,F2)(F1,F21/3)
waTeim 2014年

是的,不合适是我的意思。是的,那行得通,但是我想让算法自动检测到它。我无法手动修改功能,在任何情况下都可以使用。
乔治2014年

这是一个示例:这两个图显示了高度(x轴)和重量(y轴)的数据(对不起,德语字幕;))。第一张图显示了多元高斯方法的结果,第二张图显示了问题中描述的方法。在这两种情况下,都选择阈值以使97%的CV数据被认为是合理的。第二种方法能够更好地捕获数据的复杂性。1:dl.dropboxusercontent.com/u/26034024/anomaly/gauss.png 2:dl.dropboxusercontent.com/u/26034024/anomaly/distance.png
Georg,

3

我几乎完成了解决这些问题所需的项目,并且如果有人遇到相同的问题,我想分享我的解决方案。

首先,我描述的方法与内核密度估计非常相似。因此,很高兴进行研究...

独立功能

可以通过测量其相关系数来滤除独立特征。我按对比较了所有功能并测量了相关性。然后,我将每个特征的最大绝对相关系数作为缩放因子。这样,将彼此不相关的特征乘以接近0的值,因此它们对欧几里得距离(aka)可忽略不计。||x1x2||distance(x1,x2)

请注意:相关系数只能测量线性相关。有关详细信息,请参见链接的Wiki页面。如果数据中的相关性可以线性近似,则可以正常工作。如果没有,您应该看看本文的最后一页,看看是否可以使用它们的相关性度量来得出比例因子。

离散值

我仅将描述的算法用于连续值。离散值用于过滤训练集。因此,如果我有一个人的身高和体重,并且知道她是女性,那么我只会查看其他女性的样本以检查异常。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.