一.研究背景及意义

  离群点检测(Outlier Detection)又称偏差检测(Deviation Detection)或者例外检测(Exception Detection)等等,其目标是找到待检测数据集中与绝大多数数据对象不同的对象。因为数据集中的绝大多数对象是正常的或者常见的,而离群点是那些其属性值显著偏离待检测数据集中的绝大多数对象。一般来说,数据集中的大多数对象均遵从某种特定的规则或者模式P,离群点是不遵从模式P或规则的数据对象。

离群点检测的研究历史已经十分漫长,无论是在统计学领域或者机器学习与数据挖掘领域。离群点检测的算法种类十分繁杂,有基于距离、密度、神经网络等诸多类型,但所有的检测算法都基于这样一种共识,即:离群点在待检测数据集中的数据量是很少的。虽然根据共识可知,离群点在数据集中是较为罕见的,但这并不意味着离群点出现的次数特别少,这主要取决于待检测数据集的数据量。例如,当某待检测数据集的数据对象高达一千万时,即使是出现万分之一的概率,也会出现一千次,而另一个待检测数据集的数据对象只有一千个时,若离群点出现的概率为千分之一,则离群点在该数据集中可能只会出现一次。

在日常生产生活中,无论是自然界亦或是社会生活,人们所遇到的绝大多数事件均是常见的或者普通的。这些常见的事件或对象虽然也包含一些有意义的知识或信息,但是相比于某地区异常干旱或者异常发生洪涝灾害,又例如某运动员异常的运动数据的事件,其所包含的有益信息相对较少,这些异常事件或者异常对象往往相比于正常对象具有更高的价值。例如研究异常干旱的情况可以帮助人们更好的种植农作物,防止自然灾害,而运动员异常的运动数据可能就会获得冠军,而在实验室中,异常的实验结果往往可以帮助科学家找到实验过程中可能存在的问题或者帮助研究人员提出新问题或发现以前从未发现的结论。

离群点检测已经在很多领域具有十分广泛的应用,例如金融欺诈检测、网络入侵检测、生态系统检测、医疗卫生辅助诊断、受损农作物识别等等。在金融欺诈检测中,由于盗贼获取被盗者的信用卡后的刷卡习惯往往与之前信用卡主人的消费习惯不同,则信用卡公司可以通过分析盗贼的消费习惯或寻找其较为罕见的刷卡行为进行检测,帮助被盗者减少损失。在网络入侵检测中,由于互联网上大规模的网络入侵已经十分普遍,大多数网络攻击都遵从相似的模式,如渗入攻击或者数据库注入等试图使被攻击计算机瘫痪或者数据库受损。但也有部分攻击类型难以侦测,如试图收集被攻击计算机的网页浏览信息等,许多网络攻击仍旧只能依靠十分昂贵的监视软件或网络的异常波动来识别,而离群点检测算法通过学习攻击模式的训练数据,可以快速高效的对入侵行为进行侦测。在生态系统检测领域,例如飓风、暴风雪、火山爆发、洪涝等自然灾害,离群点检测在这些领域可以帮助研究人员分析自然灾害的相似性或者分析这些灾害发生的原因。在辅助医疗诊断领域,离群点检测可以辅助医生诊断乳腺癌患者或者帮助卫生部的官员分析某一地区儿童疫苗的注射情况。

通过上述的离群点检测应用介绍可知,离群点检测的研究绝大多数都是由需要进行异常分析的事件而驱动,具有广泛的实际应用需求。在离群点检测算法的早期研究中,人们的研究重点在于发现数据集中绝大多数对象所包含的规律或模式,而将离群点认为是数据集中没有意义的部分,进行离群点检测也只是为了提高数据分析的质量。但一个人的噪音可能是另一个人的信号,数据集中那些异常的对象反而可能潜藏着某种未知的知识或者有趣的模式。随着数据量的增长和检测算法研究方向的侧重点变化,为了更进一步的挖掘数据集所蕴含的知识,现在人们的研究重点已经由发现数据集中大多数对象所包含的有益信息转换为寻找数据集中离群对象所包含的有益知识。离群点检测长久以来被当做一种对数据预处理的方法,因为有可能数据集中少量的离群点就可能导致数据集的均值或者标准差发生较大的偏移,又或者使得基于聚类算法的簇集合发生改变。

二、国内外研究现状

目前国内外对于离群点检测算法的研究主要可分为六类:

1. 基于距离的离群点检测算法:该类算法首先计算待检测数据集中所有对象之间的距离,然后计算出每个数据对象和其最近的k个邻居对象之间的距离关系,最后计算出对象的离群值并输出最有可能是离群点的数据对象。基于距离的离群点检测算法原理简单,易于理解和实现。但该类算法在处理高维度和数据量较大的数据集时算法时间复杂度较高,且准确率不高。

2. 基于支持向量机的离群点检测算法;该类算法大多先学习数据集中绝大多数对象的边界,然后将用边界去判定数据对象是否是离群点,即如果某个对象偏离边界越远,则越有可能是离群点,离边界越近或在边界内,则是离群点的可能性越低。但该类算法一个显著的缺点是在学习边界的过程中,学习时间较长且对高维度稀疏数据的检测性能不佳。

3. 基于密度的离群点检测算法:该类算法通过计算数据对象的k近邻与相对密度和离群因子来判定对象是否是离群点。位于低密度区域的对象相对偏离高密度区域的对象。一般基于密度的离群点检测算法均需要设定近邻数k的值,若参数k取值过小,算法易发生漏检的情况。而若参数k值设置的过大,则会将高密度区域周围的离群点误检测为正常点。因此在基于密度的离群点检测算法实际应用中,需要调参人员具有丰富的实践经验。

4. 基于自编码器的离群点检测算法:该类算法通过训练输入尽可能等于输出的神经网络,训练完成后,将在输出层难以重构或者重构误差较大的输入数据判定为离群点。该类算法的一个显著缺点是在小规模数据集中检测结果不佳,原因在于神经网络无法充分学习到输入数据的特征及模式。

5. 基于孤立森林的离群点检测算法:该类算法利用输入数据学习一种iTree的二叉搜索树结构,如果数据对象离iTree的根节点较近,则其越有可能是离群点,相反正常对象会距离iTree的根节点更远。

6. 基于聚类的离群点检测算法:该类算法通过对待检测数据集聚类,将不属于任何簇的数据对象判定为数据集中的离群点。基于聚类的离群点检测算法时间和空间复杂度是线性或者较为接近线性,但该类算法的检测结果产生的离群点较为依赖聚类中簇的数量和数据集中离群点的存在性。

在上文介绍的主流离群点检测算法类型之外,还有诸多类型的检测算法。例如Yuan等人针对传统离群点检测算法不能有效处理符号型与数值型属性混合的数据集中离群点的检测问题,提出了一种改进的基于邻域值差异度量的算法。Wang等人针对传统集中式的离群点检测方法计算时间长,检测效率低的问题,提出了一种高效的分布式离群点检测算法。除了算法研究之外,近些年还有许多将离群点检测算法成功应用到生产生活中的例子,例如Schiff等人将离群点检测技术应用到侦测医生对患者开具的处方药潜在的用药错误中,有效降低了患者的用药风险。Huang等人利用离群点检测技术侦测电子商务系统中商家伪造买家评论,有效降低了评论造假现象。Alaverdyan等人将离群点检测技术应用到癫痫病灶的筛查中,为医生快速定位患者疾病提供了较好的解决方案。

三、离群点检测过程中的若干问题

 

待检测数据集中数据对象离群的三种常见原因:①数据对象的来源不同;②数据对象的自然变化;③数据收集时由于机器失灵或者机器噪声等造成的误差。由于原因一所产生的离群,是由于该离群对象可能与其他大多数数据对象分属于不同的类。例如金融欺诈中的信用卡盗刷,盗刷信用卡的人属于一种异常性较高的刷卡类型,而正常合法使用信用卡的用户属于异常性较低的刷卡类型。上文所述的离群点检测的应用,如网络入侵、异常的实验结果等都是属于原因一的异常类型。由于原因二所产生的离群,是由于许多待检测数据集都可以使用统计学的模型来对其进行建模,如许多数据集都服从高斯正态分布,在高斯正态分布中数据对象的数量由中心向两侧逐渐减少,即服从正态分布的绝大多数对象都靠近中心而显著地偏离中心的数据对象的可能性较少。又例如,人类的身高基本符合高斯分布,如果一个特别矮的人在其单独所具有的类中是正常的,而只有将其置于大量人类身高的数据集中才能显示出其异常性。由原因一与原因二产生的离群点,是人们最为关注的离群点。而由于第三种原因所产生的离群,通常是测量结果未被精准的记录,并不存在有益的信息,相反它的存在会降低对应数据集的分析质量。一般对测量产生的误差离群,都会将其删除。删除第三种原因产生的离群对象是数据预处理阶段的重要工作。

综上所述,造成数据集中对象的离群原因可能是上述三种原因中的一种,也有可能是尚未被人们发现的原因。在实际应用中,待检测的数据集往往包含有多种原因造成的离群,造成这些离群现象的本质原因往往不被人所熟知,但离群点检测技术(算法)并不受离群原因的影响,因此离群点的产生原因只对预期的应用而言较为重要。

离群点检测过程中所面对的三个主要问题是:①待检测数据集中的对象具有何种异常属性时才会被离群点检测算法侦测出;②在高维及数据量很大的数据集中,怎样做到离群点检测的高效与精准;③对离群点检测算法侦测出的数据集中离群点进行解释及分析,以近一步提高数据分析的质量。

离群点检测技术有三种基本方法:无监督离群点检测算法、半监督离群点检测算法、全监督离群点检测算法。三种方法的本质区别在于需要类标签的程度。无监督离群点检测算法是在无法提供类标签的数据集中进行检测的技术,这种情况下,将会给待检测数据集中的所有对象一个离群值,以反映对象的离群程度。在半监督离群点检测算法中,训练数据会包含一定对象数量的类标签,但不包含所有对象离群与否的标签,该类算法的检测目标是利用有标签的正常对象的信息,对于指定的待检测数据,分离出离群对象。全监督离群点检测算法对训练数据有严格要求,即所有对象的类标签都需指定(无论是正常类或者离群类)。

在进行离群点检测之前,有如下几个重要问题需要先进行阐述:

1. 判断数据对象是离群点的特征数量。由于待检测对象的特征数量一般都较高,部分甚至高达上百维度。在这么多特征中,对象的部分特征可能是异常的,但也有部分特征可能是正常的。也有可能待检测的对象所有特征都是正常的,但其整体确是异常的。例如,一个人的身高为183cm属于正常范围,一个儿童的体重为20kg也是正常的。但若将这两个特征合在一起,即一个身高183cm的人只有20kg体重就是异常的。因此在判定待检测对象是否是离群点时,必须指定一个对象的哪些特征可以确定其离群。

2. 离群点的全局离群与局部离群。一个待检测对象可能相对于整体数据集而言是正常的,但相对于数据集的局部却可能是离群的。例如,一个身高183cm、90kg的人在日常生活中并不常见,但在专业篮球队内可能并不算异常。

3. 对象离群程度的评价。在某些离群点检测算法中,其以二分类方式对离群点进行评价,是非黑即白的方式。一般来说,这种方法并不能客观的显示出对象的离群程度。在实际应用中,人们更愿意使用可以对对象的离群程度进行打分的算法,即用离群值分数来判断某个对象是否是离群点的概率。

4. 算法每次检测出的离群点数量。在离群点检测算法中,有的算法一次检测只识别待检测数据集当中的一个离群点,然后再进行第二次检测,依此重复,直到达到设定的阈值才停止检测。而有的检测算法会一次检测出数据集中当中算法判定的所有离群点。前者的检测算法容易在检测过程中出现部分离群点干扰其他离群点的检测,出现屏蔽问题。后者的检测算法可能会在检测过程中将正常对象误判为离群点,出现泥潭问题。

5. 离群点检测算法的评价指标。常见的针对离群点检测算法的评价指标包括检测精度、召回率、检测率等等。对于基于模型的离群点检测算法,可通过算法检测完成后删除的离群点对模型性能的提升程度来进行评价。

6. 离群点检测算法的时间复杂度。每一种离群点检测算法的时间复杂度都不尽相同,基于距离的离群点检测算法一般的时间复杂度都是On2),基于统计的检测算法时间开销一般都在模型的建立阶段,但随后的检测过程的时间复杂度可以达到常数级。

 

四、经典的LOF算法形式化定义及Matlab实现

4.1  LOF算法的形式化定义

设待检测数据集为X={x1, x2, x3,..., xi,..., , xn},kN+,LOF算法的相关定义如下所示:

定义1.对象xi的第k距离:

对象xi的第k距离记做k-distancexi)。若在待检测数据集中存在对象xj满足如下两个条件,则认为k-distancexi)=dxi xj):

1)在待检测数据集X中至少存在k个对象xl,使得dxi xl)<= dxi xj);

2)在待检测数据集X中至多存在k-1个对象xl,使得dxi xl)< dxi xj);

显然,若对象xi位于相对密度较大的区域,则其k-distancexi)值将会较小。若对象xi位于相对密度较小的区域,则其k-distancexi)值将会较大。

定义2.对象xi的第k距离邻域:

已知对象xi的第k距离,那么待检测数据集中所有与对象xi之间的距离小于或等于k-distancexi)的对象所构成的集合,称为对象xi的第k距离邻域,记做Nkxi)。

对象xi的第k距离邻域物理意义是指以xi为中心,k-distancexi)为半径的区域里的所有数据对象。一般的,如果对象xi位于密度较大的区域,则其第k距离邻域范围内的数据对象数会较多。若对象对象xi位于密度较小的区域,则其第k距离邻域范围内的数据对象数会较少。

定义3.对象xi相对于对象xj的可达距离:

对象xi相对于对象xj的可达距离记做reachdistxi, xj),reachdistxi, xj)=max{ k-distancexj),|| xi xj||}。若对象xixj之间的距离相对偏离,则xixj之间的可达距离是实际两个对象之间的距离,若对象xixj之间的距离相对较近,则xixj之间的可达距离是对象xj的第k距离。

定义4.对象xi的局部可达部密度lrdxi):

离对象xi最近的k个邻居的平均可达密度的倒数为xi的局部可达部密度,

拉依达准则进行离群值检测python 离群值检验的目的_拉依达准则进行离群值检测python

 

定义5.对象xi的局部离群因子:

局部离群因子是对象xi的离群程度的重要性指标,计算公式如下:

拉依达准则进行离群值检测python 离群值检验的目的_数据集_02

 

如果对象xi的离群值越接近于1,表示xi与其最近的k个邻居的密度更为接近,则其越不可能是离群点。若对象xi的离群值越大于1,表示xi相较于与其最近的k个邻居,其密度越小,则xi越有可能是离群点。

4.2  Matlab实现的LOF算法源码

Input:k维数据集X,最近邻参数k.
Output:LOF算法判定的离群点编号.
1.	function LOF_norm = LOF_main(data)
2.	//设置散点
3.	//n=100;
4.	x=[(rand(n/2,2)-0.5)*20;randn(n/2,2)];
5.	x(n,1)=14;
6.	x=data;
7.	n=size(x,1);
8.	k=7000;
9.	x2=sum(x.^2,2);//按列求和,便于后续步骤进行计算
10.	[s,t]=sort(sqrt(repmat(x2,1,n)+repmat(x2',n,1)-2*x*x'),2);
11.	//进行异常检测
12.	for i=1:k+1
13.		for j=1:k
14.			RD(:,j)=max(s(t(t(:,i),j+1),k),s(t(:,i),j+1));
15.		end
16.		LRD(:,i)=1./mean(RD,2);
17.	end
18.	LOF=mean(LRD(:,2:k+1),2)./LRD(:,1);
19.	//LOF=mean(LRD,2)./LRD(:,1);
20.	[m n]=sort(LOF,'descend');
21.	//归一化.
22.	ma = max(LOF);
23.	mi = min(LOF);
24.	for i = 1:size(LOF,1) 
25.		LOF_norm(i) = (LOF(i)-mi) / (ma - mi);
26.	end
27.	for i = 1:size(LOF,1)
28.		LOF_norm(i) = (LOF(i)-mean(LOF))/std(LOF);
29.	end
30.	end