异常值检测
2021-9-2
| 2023-8-6
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 
 

什么时候需要异常点检测?

常见的有三种情况:
  • 在做特征工程的时候需要对异常的数据做过滤,防止对归一化等处理的结果产生影响
  • 对没有标记输出的特征数据做筛选,找出异常的数据
  • 对有标记输出的特征数据做二分类时,由于某些类别的训练样本非常少,类别严重不平衡,此时也可以考虑用非监督的异常点检测算法来做
 
异常点检测的目的是找出数据集中和大多数数据不同的数据,常用的异常点检测算法一般分为三类:
  • 基于统计学的方法来处理异常数据
    • 构建一个概率分布模型,计算对象符合该模型的概率,把具有低概率的对象视为异常点。比如RobustScaler在做数据特征值缩放时,会利用数据特征的分位数分布,将数据根据分位数划分为多段,只取中间段来做缩放,比如只取25%分位数到75%分位数的数据做缩放,这样减小了异常数据的影响。
  • 基于聚类的方法来做异常点检测
    • 由于大部分聚类算法是基于数据特征的分布来做的,通常如果聚类后发现某些聚类簇的数据样本量比其他簇少很多,而且这个簇里数据的特征均值分布之类的值和其他簇也差异很大,这些簇里的样本点大部分时候都是异常点。比如BIRCH聚类DBSCAN密度聚类都可以在聚类的同时做异常点的检测
  • 基于专门的异常点检测算法来做
    • 这些算法不像聚类算法,检测异常点只是一个赠品,它们的目的就是专门检测异常点的,这类算法的代表是One Class SVM,Isolation Forest,LocalOutlierFactor
 
另一种策略是转向对异常值具有鲁棒性的模型。有一些稳健的回归形式可以最小化中值最小二乘误差而不是平均值(所谓的稳健回归),但计算量更大。还有一些方法,例如对异常值具有鲁棒性的决策树。
可以抽查一些对异常值具有鲁棒性的方法。如果有显着的模型准确性优势,那么可能有机会从训练数据中建模和过滤掉异常值。
 

基于统计学的方法来处理异常数据

固定范围

 

标准差法

如果知道样本中值的分布是高斯分布或类高斯分布,可以使用样本的标准差作为识别异常值的截断值。
高斯分布的特性:可以使用与平均值的标准差来可靠地总结样本中值的百分比。例如,在平均值的一个标准差内将覆盖68%的数据。
因此,如果平均值为50,标准差为5,那么样本中45到55之间的所有数据将占数据样本的 68% 左右。如果扩大范围,可以覆盖更多的数据样本:
  • 与平均值的1个标准偏差:68%
  • 与平均值的2个标准偏差:95%
  • 与平均值的 3 个标准偏差:99.7%
平均值的三个标准偏差是在实践中识别高斯或类高斯分布中的异常值的常见截止值。对于较小的数据样本,也许可以使用 2 个标准差 (95%) 的值,对于较大的样本,也许可以使用4个标准差 (99.9%) 的值。
 
上面只讨论了具有高斯分布的单变量数据。如果有多变量数据,每个变量具有不同的高斯分布,可以使用相同的方法。如果有两个变量,可以想象定义椭圆的二维边界。落在椭圆之外的观测值将被视为异常值。在三个维度中,这将是一个椭圆体,以此类推到更高维度。或者,可以通过超出数据维度的一个或子集的限制来识别异常值
 

四分位距法

并非所有数据都是正态或正态的,足以将其视为从高斯分布中提取的。非高斯分布数据样本的一个很好的统计量是四分位数范围,简称 IQR。
IQR 计算为数据的第75个百分位数和第 25 个百分位数之间的差值,并在箱线图中定义了盒子。
百分位数可以通过对观察结果进行排序并选择特定指数的值来计算。第 50个百分位数是中间值,或偶数个示例的两个中间值的平均值。如果有 10000 个样本,那么第50个百分位数将是第5000个和第5001 个值的平均值。将百分位数称为四分位数(“ quart ”表示 4),因为数据通过第 25、50 和 75 个值分为四组。IQR 定义了数据的中间 50%,或数据的主体
 

最小协方差行列式

如果输入变量具有高斯分布,则可以使用简单的统计方法来检测异常值。最小协方差行列式 (MCD) 方法是一种高度稳健的多变量位置和散布估计量,可以使用快速算法。
例如,如果数据集有两个输入变量并且都是高斯的,那么特征空间就形成了一个多维的高斯分布,并且这个分布的知识可以用来识别远离分布的值。
这种方法可以通过定义一个覆盖正常数据的超球体(椭圆体)来概括,并且超出该形状的数据被认为是异常值。多变量数据的这种技术的有效实现称为最小协方差行列式,或简称 MCD。
 
 
 

异常点检测算法

One Class SVM

One Class SVM也是属于支持向量机大家族的,但是它和传统的基于监督学习的分类回归支持向量机不同,是无监督学习的方法。
没有类别标签,如何寻找划分的超平面以及寻找支持向量呢?One Class SVM这个问题的解决思路有很多,这里介绍一种特别的思路SVDD
对于SVDD来说,我们期望所有不是异常的样本都是正类别,同时它采用一个超球体而不是一个超平面来做划分,该算法在特征空间中获得数据周围的球形边界,期望最小化这个超球体的体积,从而最小化异常点数据的影响。
假设产生的超球体参数为中心和对应的超球体半径,超球体体积 被最小化,中心是支持向量的线性组合;跟传统SVM方法相似,可以要求所有训练数据点到中心的距离严格小于,但同时构造一个惩罚系数为的松弛变量,优化问题:
和支持向量机系列类似的求解方法,在采用拉格朗日对偶求解之后,可以判断新的数据点是否在类内,如果到中心的距离小于或者等于半径,则不是异常点,如果在超球体以外,则是异常点。
 
在sklearn中,可以用svm包里面的OneClassSVM来做异常点检测。OneClassSVM也支持核函数,所以普通SVM里面的调参思路在这里也适用。
notion image
 

Isolation Forest

Isolation Forest(IForest)是周志华老师的学生提出来的,主要是利用集成学习的思路来做异常点检测,目前几乎成为异常点检测算法的首选项,它是随机森林大家族的一员。
算法主要包括:第一步训练构建随机森林对应的多颗决策树,这些决策树一般叫iTree;第二步计算需要检测的数据点最终落在任意第颗iTree的层数,然后可以得出 在每棵树的高度平均值 ;第三步根据判断 是否是异常点。
对于第一步构建决策树的过程,方法和普通的随机森林不同。
首先采样决策树的训练样本时,普通的随机森林要采样的样本个数等于训练集个数。但是iForest不需要采样这么多,一般来说,采样个数要远远小于训练集个数。原因是我们的目的是异常点检测,只需要部分的样本我们一般就可以将异常点区别出来了。
另外就是在做决策树分裂决策时,由于我们没有标记输出,所以没法计算基尼系数或者和方差之类的划分标准。这里使用的是随机选择划分特征,然后在基于这个特征再随机选择划分阈值,进行决策树的分裂。直到树的深度达到限定阈值或者样本数只剩一个。
第二步计算要检测的样本点在每棵树的高度平均值。首先需要遍历每一颗iTree,得到检测的数据点 最终落在任意第颗iTree的数层数。这个代表的是树的深度,也就是离根节点越近,则越小,越靠近底层,则越大,根节点的高度为0
第三步是据判断是否是异常点,一般用下面的公式计算的异常概率分值:
的取值范围是[0,1],取值越接近于1,则是异常点的概率也越大,为样本个数。
是欧拉常数
表示式可以看出:如果高度,则,是异常点的概率是100%;如果高度,则,不可能是异常点;如果高度,则,是异常点的概率是50%。一般可以设置的一个阈值然后去调参,这样大于阈值的才认为是异常点。
在sklearn中可以用ensemble包里面的IsolationForest来做异常点检测:
notion image
 

LocalOutlierFactor

识别异常值的一种简单方法是在特征空间中定位那些远离其他数据的数据。
这对于低维(特征很少)的特征空间很有效,随着特征数量的增加它会变得不那么可靠,这被称为维度灾难。
局部异常值因子( LOF)是一种尝试利用最近邻的概念进行异常值检测的技术。每个示例都根据其本地邻域的大小被分配一个评分,即其孤立程度或成为异常值的可能性有多大。那些得分最高的例子更有可能是异常值。为数据集中的每个对象引入了一个局部异常值 (LOF),表示其异常值程度。
 
 
IForest目前是异常点检测最常用的算法之一,它的优点非常突出,它具有线性时间复杂度。因为是随机森林的方法,所以可以用在含有海量数据的数据集上面。通常树的数量越多,算法越稳定。由于每棵树都是互相独立生成的,因此可以部署在大规模分布式系统上来加速运算。对于目前大数据分析的趋势来说,它的好用是有原因的。
但是IForest也有一些缺点,比如不适用于特别高维的数据。由于每次切数据空间都是随机选取一个维度和该维度的随机一个特征,建完树后仍然有大量的维度没有被使用,导致算法可靠性降低。此时推荐降维后使用,或者考虑使用One Class SVM
另外iForest仅对即全局稀疏点敏感,不擅长处理局部的相对稀疏点 ,这样在某些局部的异常点较多的时候检测可能不是很准
而One Class SVM对于中小型的数据分析,尤其是训练样本不是特别海量的时候用起来经常会比iForest顺手,因此比较适合做原型分析
  • Scikit-Learn
  • 删除重复数据数值替换
    目录