异常值检测算法

    闲话:最近总是特别嗜睡,不知为何床对我的引力总是让我死死的赖在上面,大概是懒癌又犯了....要改。

异常值分析是检验数据是否有录入错误以及含有不合常理的数据的过程,忽视异常值的存在是十分危险的,不加剔除地把异常值包括进数据的计算分析过程中,对结果会产生不良影响,重视异常值的出现,分析其产生的原因,常常成为发现问题进而改进决策的契机。

常用的异常值检测方法主要有:

 1. 简单统计量分析:

先对变量做一个描述性统计,进而查看哪些数据是不合理的,如箱型图分析,平均值,最大最小值分析,统计学上的3σ法则(若数据服从正太分布,在3σ原则下,异常值被定义为一组测定值中与平均值的偏差超过3倍标准差的值,因为在正态分布的假设下,距离平均值3σ之外的值出现的概率小于0.003)。
3σ原则

2. 基于距离的方法:

通常可以在对象之间定义邻近性度量,并且许多移仓检测方法都基于邻近度。异常对象是那些远离大部分其他对象的对象,这一邻域的许多技术都基于距离,称作基于距离的离群点检测技术,代表算法:基于KNN的密度检测算法。优点与缺点:基于邻近度的方法一般需要O(m^2)时间。这对于大型数据集可能代价过高,尽管在低维情况下可以使用专门的算法来提高性能。该方法对参数的选择也是敏感的。此外,它不能处理具有不同密度区域的数据集,因为它使用全局阈值,不能考虑这种密度的变化。

3. 基于密度的离群点检测:

从基于密度的观点来看,离群点是在低密度区域中的对象。基于密度的离群点检测与基于邻近度的离群点检测密切相关,因为密度通常用邻近度定义。一种常用的定义密度的方法是,定义密度为到k个最近邻的平均距离的倒数。如果该距离小,则密度高,反之亦然。优点与缺点:基于相对密度的离群点检测给出了对象是离群点程度的定量度量,并且及时数据具有不同密度的区域也能够很好地处理。与基于距离的方法一样,这些方法必然具有O(m^2)时间复杂度(其中m是对象个数),虽然对于低维数据,使用专门的数据结构可以将它降低到O(mlogm)。参数选择也是困难的,虽然标准LOF算法通过观察不同的k值,然后取最大离群点得分来处理该问题。然而,仍然需要选择这些值的上下界。

4. 基于密度的离群点检测:

一种利用聚类检测离群点的方法是丢弃原理其他簇的小簇。这种方法可以与任何聚类技术一起使用,但是需要最小簇大小和小簇与其他簇之间距离的阈值,通常,该过程可以简化为丢弃小于某个最小尺寸的所有簇。
优点与缺点:有些聚类技术(如K均值)的时间和空间复杂度是线性或接近线性的,因而基于这种算法的离群点检测技术可能是高度有效的。此外,簇的定义通常是离群点的补,因此可能同时发现簇和离群点。缺点方面,产生的离群点集和它们的得分可能非常依赖所用的簇的个数和数据总离群点的存在性。例如,基于原型的算法产生的簇可能因数据中存在离群点而扭曲。聚类算法产生的簇的质量对该算法产生的离群点的质量影响非常大。每种聚类算法只适合特定的数据类型;因此,应当小心地选择聚类算法。

5. Isolation Forest:

Isolation Forest 简称 IForest,这个算法是周志华老师在2010年提出的一个异常值检测算法,在工业界很实用,算法效果好,时间效率高,能有效处理高维数据和海量数据,也是本文主要介绍的一种算法。
算法起源于08年的一篇论文《Isolation Forest》,这论文由澳大利亚莫纳什大学的两位教授Fei Tony Liu, Kai Ming Ting和南京大学的周志华教授共同完成,而这三人在2011年又发表了《Isolation-based Anomaly Detection》,这两篇论文算是确定了这个算法的基础。

论文地址:
http://cs.nju.edu.cn/zhouzh/zhouzh.files/publication/icdm08b.pdf
http://cs.nju.edu.cn/zhouzh/zhouzh.files/publication/tkdd11.pdf

算法流程:
1.构建N棵iTree,为每棵树随机做无放回采样生成训练集。iTree是一棵随机二叉树,给定数据集DataSet,假设数据集内所有属性都是连续型变量,iTree构造过程可以描述为:

    首先随机选择数据的一个属性A,然后随机选择属性A中的一个值V,按照属性A的值对每条数据进行树的分裂,将小于V的记录放在左孩子上,把大于V的记录放在右孩子上,然后按上述过程递归构建树,直到满足如下条件:
    1.传入的数据集只有一条记录或者多条一样的记录;
    2.树的高度达到了限定高度

2.进行预测:预测的过程就是把测试数据在iTree树上沿对应的分支往下走,走到达到叶子节点,并记录着过程中经过的路径长度h(x)。将h(x)带入到异常值评分函数中,得到异常值分数,公式如下图所示:
这里写图片描述
 s(x,n)s(x,n)就是记录x在由n个样本的训练数据构成的iTree的异常指数,s(x,n)s(x,n)取值范围为[0,1],越接近1表示是异常点的可能性高,越接近0表示是正常点的可能性比较高,如果大部分的训练样本的s(x,n)都接近于0.5,说明整个数据集都没有明显的异常值。

这里写图片描述

关于这个算法我的理解:
相比较与基于密度和基于距离的异常值检测算法,iForest 采用空间划分的策略来查找异常值,在这个算法中,异常值存在于树种较浅层的位置,可以理解为,假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。(这个例子引用自http://www.jianshu.com/p/5af3c66e0410
对于这个算法,我个人理解为这是一种kd树和随机森林模型的思想融合的产物,其利用类似kd树对空间检索和划分的理论,找到那些游离于整体的异常值的点,然后通过对树的集成思想,增强整个模型的泛化能力和对异常值鉴别的准确度,基于以上特性,iForest具有线性时间复杂度和对海量数据的处理能力,并且随着树的数量越多,算法越稳定。

sklearn示例
iForest 已经被集成在scikit-learn的0.19版本中,在Sk-learn中其评分函数越低,表示数据是越正常,越高则为异常值的可能性越大。

http://scikit-learn.org/dev/modules/generated/sklearn.ensemble.IsolationForest.html

本文参考资料:

http://blog.163.com/zhoulili1987619@126/blog/static/353082012015211114642546/
http://www.jianshu.com/p/1b020e2605e2
http://www.cnblogs.com/fengfenggirl/p/iForest.html
《Python数据挖掘分析与挖掘实战》 张良均 王路等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章