异常值检测

在数据集中,异常值(Outlier or Anomaly)作为不寻常的表征点,无利于后面算法对于数据集中模式的挖掘,甚至会极大地影响性能,或者直接用于一些异常检测的场景,如欺诈检测、安全检测等.异常值检测是数据清洗里非常重要的一步.

定义

一般可以利用聚类的思想,定义为分布稀疏且离密度高的群体较远的点 通常异常值出现的原因有以下几种:

  • 数据收集过程出现问题,录入错误
  • 数据测量误差(人为、测量仪器)
  • 数据随机误差(数据自身)

如何检测

基于统计

1. 基于高斯分布的异常点检测

根据已有的数据集,建立高斯分布的模型,通过新数据与已知分布的差异判断是否属于异常值,

\[ p(x)=\frac{1}{\sqrt{2 \pi} \sigma^{2}} \exp \left(-\frac{x-\mu^{2}}{2 \sigma^{2}}\right) \]

可以扩展到多维或者多元分布.3\(\sigma\)原则也是属于高斯分布判断方法的一种,在这里异常值被定义为,其值与平均值的偏差超过三倍标准差的值,即

\[ P(|x-\mu|\gt3\sigma)\le0.003 \]

2. 四分位数

\(Q_1\):上四分位数 \(Q_2\):下四分位数 \(IQR=Q_1-Q_2\):上下四位分数之差,包含了全部观测值的一半

四分位数的思想就是,通过估计数据集中可能的最小和最大值,以此判断异常值,估计可能的最小和最大值为 \[ min=Q_2-k*IOR\\ max=Q_1+k*IOR \] \(k\)的取值取决于你对异常值的忍耐程度,一般取\(k=1.5\).

3. 各类统计量

更多的还有基于各类统计量来检测多元离群点,例如\(\chi^2\)检验、\(t\)检验等.

4. 基于主成分分析的矩阵分解方法

这种方法经过主成分分析分解,再进行重构,通过异常值在主成分分量上的偏差更大来判断是否异常.

https://mp.weixin.qq.com/s?__biz=MzIzODExMDE5MA==&mid=2694182465&idx=1&sn=c644809b757bb1c3f0439eae4bb2f78c#rd

5. Seasonal Hybrid ESD算法

Twitter的异常检测算法(Seasonal Hybrid ESD) 先用STL把序列分解,考察残差项。假定这一项符合正态分布,然后就可以用Generalized ESD提取离群点 待续....... https://anomaly.io/blog/

基于距离

利用聚类的思想,对数据进行聚类.,排除距离中心最远的\(N​\)个点,一般的方法有,kmeans、knn、DBSCAN

局部异常因子LOF(Local Outlier Factor)算法

首先定义以下概念,

  1. \(k\)邻近距离(k-distance) 定义为,在距离数据点\(p\)最近的几个点中第\(k\)个最近的点与点\(p\)之间的距离,记为\(d_k(p)\)

  2. 可达距离 定义为,给定邻近距离参数\(k\)时,点\(p\)与另一点\(o\)的可达距离为,点\(o\)\(k\)邻近距离与\(distance(p,o)\)两个距离比较的最大值, \[ rech-dist_k(p, o)=\max\{d_k(o),distance(p,o)\} \]

  3. 局部可达密度(local rechability density) 基于可达距离,首先与点\(p\)距离小于\(d_k(p)\)的数据称为它的\(k\)近邻,记为\(N_k(p)\),点\(p\)的局部可达密度则定义为,点\(p\)\(k\)近邻数据点的平均可达距离的倒数 \[ lrd_k(p) = 1 / (\frac{\sum_{o \in N_{k}(p)} reach-dist_k(p,o)}{|N_{k}(p)|}) \] 局部可达密度的意义就是,一个数据点跟其他点比较疏远的话,那么显然它的局部可达密度就小,即密度越低的话,就越有可能是离群点.

  4. 局部异常因子(local outlier factor) LOF算法为允许数据分布不均匀、密度不同的情况,采取了与周围近邻点相对密度来定义局部异常因子 点\(p\)的局部相对密度(局部异常因子)为点\(p\)\(k近邻\)的平均局部可达密度跟数据点p的局部可达密度的比值

\[ LOF_k(p)=\frac{\sum_{o \in N_{k}(p)} \frac{lrd_k(o)}{lrd_k(p)}}{|N_k(p)|} = \frac{\sum_{o \in N_k(p)} lrd_k(o)}{|N_k(p)|} / lrd_k(p) \]

如果数据点\(p\)的LOF得分小于1,表明数据点处在一个相对密集的区域,不大可能是一个异常点;如果数据点\(p​\)的LOF得分远大于1,表明数据点跟其他点比较疏远,很有可能是一个异常点. 别人的实现 https://github.com/damjankuznar/pylof https://github.com/wangyibo360/pylof

注意点 LOF算法中关于局部可达密度的定义其实暗含了一个假设,即:不存在大于等于\(k\)个重复的点。当这样的重复点存在的时候,这些点的平均可达距离为零,局部可达密度就变为无穷大,会给计算带来一些麻烦。在实际应用时,为了避免这样的情况出现,可以不考虑重复的情况。或者,还可以考虑给可达距离都加一个很小的值,避免可达距离等于零。 LOF 算法需要计算数据点两两之间的距离,造成整个算法时间复杂度为 \(O(n^2)\) 。为了提高算法效率,FastLOF (Goldstein,2012)先将整个数据随机的分成多个子集,然后在每个子集里计算 LOF 值。对于那些 LOF异常得分小于等于1的,从数据集里剔除,剩下的在下一轮寻找更合适的近邻,并更新LOF值。

孤立森林iForest(Isolation Forest)

孤立森林基于异常值是孤立的离群点,正常值则聚集在密度较高的区域.iForst的重点就在于,如何快速有效地判断该点是在离群较远的地方还是聚集在某一块区域.其操作就是,通过随机切分超平面,不断二分数据空间,直到所有的数据都被单独地划分到某一子空间,直觉上来说,离群点会很快被单独划分到一个子空间里,而数据聚集的区域往往需要划分更多次,这一行为就体现在数据点在二叉树的高度的高低上.iForest就是基于ensemble的方法,切分多个独立的孤立树,最后给一个总的判断.其优点是具有线性时间复杂度,但是不适合维度过高. 更具体的可以参考机器学习-异常检测算法(一):Isolation Forest,以及iForest (Isolation Forest)孤立森林 异常检测 入门篇,同时这个算法在sklearn(sklearn.ensemble.IsolationForest)里面已经有相应的实现.

如何解决

  • 异常值可能是被正确记录的,本身就反应了数据集的某种模式,需要保留下来
  • 异常值被记录错误,可以删除
  • 异常值被错误记录,也可以修正

以下是一些讨论和偏学术的文章资料

1.Anomaly Detection : A Survey 2.Outlier Analysis 3.KDD016-topics-outlier-and-anomaly-detection

-------------本文结束感谢您的阅读-------------
Donate comment here