在多元数据中识别异常值的最佳方法是什么?


94

假设我有一组包含至少三个变量的多变量数据。如何找到异常值?成对散点图将不起作用,因为离群值可能存在于3维中,而不是任何二维子空间中的离群值。

我不是在考虑回归问题,而是真正的多元数据。因此,涉及稳健回归或计算杠杆的答案无济于事。

一种可能是计算主成分分数,并在前两个分数的双变量散点图中寻找离群值。这样可以保证工作吗?有更好的方法吗?


3
如果散点图矩阵无法捕获,则可以尝试3D散点图。当然,这无法应用于4D,但是您可以随时间创建第4维并制作电影。:)
Shane 2010年

那(分层)聚类分析呢?
安德烈(Andrej)2010年

11
色相第五位,色彩强度第六位,点大小第七位,我们可以去了;-)

Answers:


26

看看mvoutlier软件包,它依赖于有序的稳健的马哈拉诺比斯距离,如@drknexus所建议。


4
我个人不相信这个套餐!我认为这只是科学的声音。这种类型的理论对于模拟数据非常有用,而对于实际数据则只是pffff。我确实使用了这个包来检测异常值:-)可悲的是,我检测到的数据中有一半是异常值:-D有趣的是人们只是发布了一些数据(我不知道该怎么称呼)。如果您有任何意见,我将很高兴见到。我们有许多类型的离群值,但我们是否应该简单地将其从数据中删除?我相信不是。
学习者2015年

1
您能解释一下何时以及为什么这样吗?
eric_kernfeld

19

我认为罗宾·吉拉德(Robin Girard)的答案在3维甚至4维上都可以很好地工作,但是维的诅咒将阻止它在此范围之外的工作。但是,他的建议使我想到了一种相关的方法,该方法是将交叉验证的内核密度估计应用于前三个主成分评分。然后,仍然可以很好地处理非常高维的数据集。

总之,对于i = 1到n

  1. 计算从没有Xi的数据集获得的前三个主成分得分的密度估计。
  2. 计算步骤1中估计的密度的Xi的似然度。将其称为Li。

结束于

对Li进行排序(对于i = 1,..,n),离群值是那些似然度低于某个阈值的离群值。我不确定什么门槛会很好-我会把这个留给任何为此撰写论文的人!一种可能性是对log(Li)值进行箱线图绘制,并查看在负端检测到哪些异常值。


感谢您提供此答案(应该做评论?)正如我已经提到的,如果您进行参数化结构假设,那么对Rich答案的High维的评论不是问题(即使1000个也可以)。
罗宾吉拉德

@rob“我不确定什么是一个很好的阈值”,这就是我提到的多重测试过程的目的....但是我完全同意必须填写所有内容,并且我非常喜欢其中的异常检测。离群值检测!谁想写论文:)?
罗宾吉拉德

4
(-1)令人不安的是,这个问题的公认答案既没有用处(例如,过于模糊和没有实施),也没有科学上的正确性(就算没有错,据我所知,它甚至没有被提及相关的文献)。
user603 2012年

6
(-1)这似乎是错误的答案-此方法将不会检测到异常值!可以轻松想象一下PCA在2D平面上投影的点状3D煎饼状云,以及一个离该平面较远的离群点,但其投影恰好在投影云的中间,因此“核密度”为尽管这是一个离群值,但2D平面中的点仍会很高。
科彻德2013年

1
我认为PCA在这里会有问题。PCA是一种近似值,其中考虑了对方差的主要贡献。但是,这里的目的是找到异常值 -它们不是“落入裂缝之间”吗?
Omry Atia

18

您可以在(1)中找到各种方法的教学摘要。

对于此处列出的各种方法的一些近期数值比较,可以检查 (2)(3)

有许多较旧的(且较不详尽)的数值比较,通常在书籍中找到。例如,您会在(4)的第142-143页上找到一个。

请注意,这里讨论的所有方法都有一个开源R实现,主要是通过rrcov 包实现的。

  • (1)P.Rousseeuw和M.Hubert(2013)多元定位和分散的高故障估计器。
  • (2)休伯特(M. Hubert),鲁西约(P.Rousseeuw),瓦基里(K.Vakili)(2013)。鲁棒协方差估计量的形状偏差:一项实证研究。统计文件。
  • (3)K.Vakili和E.Schmitt(2014)。使用FastPCS查找多元离群值。计算统计和数据分析。
  • (4)Maronna RA,Martin RD和Yohai VJ(2006)。稳健的统计数据:理论与方法。纽约威利。

我不推荐基于模拟数据的论文,我相信前两篇论文都是基于模拟数据的。我正在处理真实数据,很少能在数据中找到那些模拟的强异常值。我个人从来没有发现具有非常强的异常值的数据集。如果您知道任何真实数据,请随时分享
学习者2015年

嗨,尼莫:谢谢你的评论。实际上,事实证明,对于这些模型中的许多(并非全部)模型,实际上都知道了异常值的最坏配置,而这些正是人们通常会从中模拟并评估这些模型的配置。也许您可以将其表达为一个问题?我很乐意指出一些参考!
user603

1
我已经问了一个一般性问题。您可以在这里找到我的帖子stats.stackexchange.com/questions/139645/…–
学习者

13

我会做某种“留下一个测试算法”(n是数据数量):

对于i = 1到n

  1. Xi
  2. XiLi

结束于

Li

如果n足够大,这将起作用...您还可以使用“离开k策略”,当您有“异常值”组时可能会更加放松...


如果您不知道自己有多少离群值,即N-1点由于包含离群值而仍然有偏差,那么该如何处理呢?
本杰明·班尼尔

1
如果n足够大而离群数很小,则此偏差可以忽略不计。如果存在大量离群值,那就不是离群值了,正如我提到的,您可以使用请假k策略...(在这种情况下,您必须找出一个策略来避免跟踪所有可能如果您不了解k,则可以尝试k的许多值,并保持最大的相关性。
罗宾吉拉德

1
这是一个不错的主意,但如果我正确理解它,似乎可以扩大“离群值”的概念,以在数据集中包含与其他数据集相距较远的任何值。例如,在批次{-110 [1] -90,0,90 [1] 110}(由43个整数组成)中,您的过程不会将0(这是这些数字的中位数!)标识为唯一的“异常值” “?
ub

@whuber好问题!在没有结构假设的情况下,零可能会被删除。但是,您可以假设分布是单峰的,并据此计算密度。在这种情况下,结构假设(单峰性)将有助于该过程将零视为“正常”值。最后,您认为这很正常,因为您的脑中有这种“结构假设” :)?
罗宾吉拉德

3
LiLi

12

您可以在最小体积边界椭球的支持点中找到“异常值”的候选对象。(1970年代的大量论文中发明了高效地找到这些点的精确算法的精确算法,因为该问题与实验设计中的问题密切相关。)


12

我看到的新颖方法是IT Jolliffe主成分分析。您可以对数据运行PCA(注意:PCA本身可以是一个非常有用的数据探索工具),但是您不必查看前几个主要组件(PC),而是绘制后几个PC。这些PC是变量之间的线性关系,并具有最小的方差。因此,它们可以检测数据中的“精确”或接近精确的多元关系。

最后PC的PC得分图将显示通过单独查看每个变量不容易检测到的异常值。一个例子是身高和体重-有些身高“高于平均水平”和“身高低于平均水平”的人将通过身高和体重的最后PC来检测(假设它们之间呈正相关),即使他们的身高和体重没有“极端”(例如180cm和60kg的人)。


11

我没有看到有人提到影响功能。我首先在Gnanadesikan的多元书中看到了这个想法。

在一个维度上,离群值是非常大或非常小的值。在多变量分析中,这是从大量数据中删除的观察结果。但是,我们应该使用什么指标来定义异常值呢?有很多选择。马氏距离仅是一。我认为寻找每种异常值都是徒劳的,适得其反。我想问一下你为什么在乎离群值?在估计均值时,他们可以对该估计产生很大影响。稳健的估算器可以减轻重量并容纳离群值,但他们并未对其进行正式测试。现在进行回归分析,离群点(如杠杆点)可能会对模型中的斜率参数产生很大影响。对于双变量数据,它们可能不适当地影响估计的相关系数,并且在三个或更多个维度上会影响多个相关系数。

Hampel引入影响功能作为一种可靠的估计工具,Mallows撰写了一篇不错的未发表论文,主张使用它们。影响函数是您在n维空间中所处的点和参数的函数。它实质上测量参数估计值与计算中的点与遗漏的点之间的差异。不必费心计算两个估计并求出差,您通常可以为其得出一个公式。然后,恒定影响的轮廓会告诉您相对于此参数的估计而言极端的方向,从而告诉您在n维空间中何处寻找离群值。

有关更多信息,请查看我在1983年发表在《美国数学与管理科学杂志》上的论文“影响函数及其在数据验证中的应用”。在数据验证中,我们希望查找影响数据预期用途的异常值。我的感觉是,您应该将注意力转移到离群值上,这些离点值会极大地影响您想要估算的参数,而不是那么在乎那些不需要的参数。


1
+1非常好的主意,尤其是为了始终专注于分析目的。
胡伯

一个类似的想法是随机样本共识(RANSAC)。
GeoMatt22 '16


7

对于中等尺寸(如3),那么其他地方建议的某种内核交叉验证技术似乎是合理的,并且是我能想到的最好的方法。

对于较大的尺寸,我不确定该问题是否可以解决。它正好落在“三维诅咒”的领域。问题在于,随着维数(包括从分布派生的距离)的增加,距离函数趋于非常快地收敛到非常大的值。如果您将离群值定义为“相对于其他点具有相对较大的距离函数的点”,并且您的所有距离函数都开始收敛,因为您处于高维空间中,那么,您很麻烦。

如果没有某种可以使您将其转变为概率分类问题的分布假设,或者至少没有某种旋转可以使您将空间分为“噪声维”和“信息维”,我认为高维空间的几何形状将禁止对异常值的任何简单(或至少可靠)识别。


正如我所说,我已经给出的过程可以使用高斯假设进行大规模应用。如果维度相对于样本大小而言确实很大(即p >> n),则可以进行一些稀疏假设(例如,假设高斯分布的参数位于低维度空间中),并使用阈值估计程序估计参数...
罗宾吉拉德

1
非常有见地,维数的诅咒排除了没有分布假设的解决方案(除非您仅拥有疯狂的数据量或维数很小)
John Robertson 2012年

6

我不确定当您说不是在考虑回归问题而是在考虑“真正的多元数据”时,您的意思是什么。我的最初反应是计算马氏距离,因为它不需要您指定特定的IV或DV,但就其核心(据我所知)而言,它与杠杆统计有关。


是的,我可以根据数据的平均值计算每个观测值的马氏距离。但是,与均值距离最大的观测值不一定是多元离群值。考虑具有高相关性的双变量散点图。离群值可以在主要的点云之外,但离均值不远。
罗布·海恩德曼


4

我的第一个回答是,如果您可以对数据进行多元回归,则可以使用该回归中的残差来发现异常值。(我知道您说这不是回归问题,所以这可能对您没有帮助,对不起!)

我要从我之前回答Stackoverflow问题中复制一些内容,其中包含一些R代码示例

首先,我们将创建一些数据,然后使用异常值对其进行污染;

> testout<-data.frame(X1=rnorm(50,mean=50,sd=10),X2=rnorm(50,mean=5,sd=1.5),Y=rnorm(50,mean=200,sd=25)) 
> #Taint the Data 
> testout$X1[10]<-5 
> testout$X2[10]<-5 
> testout$Y[10]<-530 

> testout 
         X1         X2        Y 
1  44.20043  1.5259458 169.3296 
2  40.46721  5.8437076 200.9038 
3  48.20571  3.8243373 189.4652 
4  60.09808  4.6609190 177.5159 
5  50.23627  2.6193455 210.4360 
6  43.50972  5.8212863 203.8361 
7  44.95626  7.8368405 236.5821 
8  66.14391  3.6828843 171.9624 
9  45.53040  4.8311616 187.0553 
10  5.00000  5.0000000 530.0000 
11 64.71719  6.4007245 164.8052 
12 54.43665  7.8695891 192.8824 
13 45.78278  4.9921489 182.2957 
14 49.59998  4.7716099 146.3090 
<snip> 
48 26.55487  5.8082497 189.7901 
49 45.28317  5.0219647 208.1318 
50 44.84145  3.6252663 251.5620 

通常,以图形方式检查数据最有用(与数学相比,大脑更容易发现异常值)

> #Use Boxplot to Review the Data 
> boxplot(testout$X1, ylab="X1") 
> boxplot(testout$X2, ylab="X2") 
> boxplot(testout$Y, ylab="Y") 

然后,您可以使用统计信息计算临界值,在这里使用Lund测试(请参阅Lund,RE 1975,“线性模型中离群值的近似测试表”,Technometrics,第17卷,第4期,第473页) -476。和Prescott,第1975年,“线性模型中离群值的近似测试”,技术计量学,第17卷,第1期,第129-132页。)

> #Alternative approach using Lund Test 
> lundcrit<-function(a, n, q) { 
+ # Calculates a Critical value for Outlier Test according to Lund 
+ # See Lund, R. E. 1975, "Tables for An Approximate Test for Outliers in Linear Models", Technometrics, vol. 17, no. 4, pp. 473-476. 
+ # and Prescott, P. 1975, "An Approximate Test for Outliers in Linear Models", Technometrics, vol. 17, no. 1, pp. 129-132. 
+ # a = alpha 
+ # n = Number of data elements 
+ # q = Number of independent Variables (including intercept) 
+ F<-qf(c(1-(a/n)),df1=1,df2=n-q-1,lower.tail=TRUE) 
+ crit<-((n-q)*F/(n-q-1+F))^0.5 
+ crit 
+ } 

> testoutlm<-lm(Y~X1+X2,data=testout) 

> testout$fitted<-fitted(testoutlm) 

> testout$residual<-residuals(testoutlm) 

> testout$standardresid<-rstandard(testoutlm) 

> n<-nrow(testout) 

> q<-length(testoutlm$coefficients) 

> crit<-lundcrit(0.1,n,q) 

> testout$Ynew<-ifelse(testout$standardresid>crit,NA,testout$Y) 

> testout 
         X1         X2        Y    newX1   fitted    residual standardresid 
1  44.20043  1.5259458 169.3296 44.20043 209.8467 -40.5171222  -1.009507695 
2  40.46721  5.8437076 200.9038 40.46721 231.9221 -31.0183107  -0.747624895 
3  48.20571  3.8243373 189.4652 48.20571 203.4786 -14.0134646  -0.335955648 
4  60.09808  4.6609190 177.5159 60.09808 169.6108   7.9050960   0.190908291 
5  50.23627  2.6193455 210.4360 50.23627 194.3285  16.1075799   0.391537883 
6  43.50972  5.8212863 203.8361 43.50972 222.6667 -18.8306252  -0.452070155 
7  44.95626  7.8368405 236.5821 44.95626 223.3287  13.2534226   0.326339981 
8  66.14391  3.6828843 171.9624 66.14391 148.8870  23.0754677   0.568829360 
9  45.53040  4.8311616 187.0553 45.53040 214.0832 -27.0279262  -0.646090667 
10  5.00000  5.0000000 530.0000       NA 337.0535 192.9465135   5.714275585 
11 64.71719  6.4007245 164.8052 64.71719 159.9911   4.8141018   0.118618011 
12 54.43665  7.8695891 192.8824 54.43665 194.7454  -1.8630426  -0.046004311 
13 45.78278  4.9921489 182.2957 45.78278 213.7223 -31.4266180  -0.751115595 
14 49.59998  4.7716099 146.3090 49.59998 201.6296 -55.3205552  -1.321042392 
15 45.07720  4.2355525 192.9041 45.07720 213.9655 -21.0613819  -0.504406009 
16 62.27717  7.1518606 186.6482 62.27717 169.2455  17.4027250   0.430262983 
17 48.50446  3.0712422 228.3253 48.50446 200.6938  27.6314695   0.667366651 
18 65.49983  5.4609713 184.8983 65.49983 155.2768  29.6214506   0.726319931 
19 44.38387  4.9305222 213.9378 44.38387 217.7981  -3.8603382  -0.092354925 
20 43.52883  8.3777627 203.5657 43.52883 228.9961 -25.4303732  -0.634725264 
<snip> 
49 45.28317  5.0219647 208.1318 45.28317 215.3075  -7.1756966  -0.171560291 
50 44.84145  3.6252663 251.5620 44.84145 213.1535  38.4084869   0.923804784 
       Ynew 
1  169.3296 
2  200.9038 
3  189.4652 
4  177.5159 
5  210.4360 
6  203.8361 
7  236.5821 
8  171.9624 
9  187.0553 
10       NA 
11 164.8052 
12 192.8824 
13 182.2957 
14 146.3090 
15 192.9041 
16 186.6482 
17 228.3253 
18 184.8983 
19 213.9378 
20 203.5657 
<snip> 
49 208.1318 
50 251.5620 

显然,除了隆德检验(格鲁布斯涌现出来)之外,还有其他异常检验,但是我不确定哪种检验更适合多元数据。


1
单变量箱线图对于发现单变量离群值很有用。但是他们可以完全错过多元离群值。如果我有一个Y和一堆X变量,那么回归的想法就可以了。但是正如我在问题中说的那样,没有Y,因此回归是不合适的。
罗伯·海恩德曼

@RobHyndman-可以修复Y(将其设置为常数),并尝试在没有截距的情况下对多元回归建模。在实践中,它工作得很漂亮。从本质上讲,这将一个根本上无监督的问题(通常是异常检测)转化为有监督的问题。
arielf '16

@arielf有趣。你有参考吗?
罗布·亨德曼

@RobHyndman不是学术论文,但也许更好,您可以自己尝试。请参阅我在vw-top-errors@ goo.gl/l7SLlB上的github页面 (请注意,那里的示例碰巧有一个Y,但是我使用相同的技术,通过固定Y也非常成功地解决了无监督问题。)
arielf

1

以上答案之一是在马哈拉诺比斯距离中碰到的...。也许再进一步一步,计算同时的置信区间将有助于发现异常值!

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.