异常值检测

目录

  • 1 概论
    • 1.1 异常检测的定义
    • 1.2 异常检测的应用场景
    • 1.3 异常值的特点
    • 1.4 异常检测算法分类
  • 2 Isolation Forest算法
    • 2.1 Isolation Forest 算法原理
    • 2.2 Isolation Forest 算法特点
  • 3 局部异常因子LOF算法
    • 3.1 LOF算法原理
    • 3.2 LOF算法特点
  • 4 One-Class SVM算法
    • 4.1 One-Class SVM算法原理
    • 4.2 One-Class SVM 算法特点:
  • 5 基于高斯概率密度算法
    • 5.1 基于高斯概率密度算法原理
    • 5.3 基于高斯概率密度算法特点
  • 6 使用PCA或自动编码机进行异常点检测

1 概论

1.1 异常检测的定义

异常: 异常是远离其他观测数据而被疑为不同机制产生的观测数据。
异常检测: 在数据挖掘中,异常检测(Anomaly Detection)即对不匹配预期模式或数据集中其他项目的项目、事件或观测值的识别。
异常检测方法概述: 目前的异常检测,一般均从已知的正常数据类数据中进行学习,建立正常行为的模型以进行异常检测,从而构建一个假设模型 h(x) 和一个阈值 ρ \rho ρ ,当 h ( x ) ≥ ρ h(x)≥\rho h(x)ρ时判 x 为正常,否则为异常,而阈值 ρ \rho ρ 的设定则根据训练集上所允许的经验误差 α \alpha α 进行设定,使得 P ( h ( x ) ≥ ρ ) ≥ 1 − α P(h(x)\geq\rho)\geq1-\alpha P(h(x)ρ)1αP其中P(x)为分布函数。

1.2 异常检测的应用场景

如入侵检测、欺诈检测、故障检测、系统健康监测、传感器网络事件检测和生态系统干扰检测等。
数据预处理经常需要用到异常检测。因为去除异常数据的数据集往往会在统计上显著提升准确性。
异常检测是整个智能运维(AI Ops)的核心工作。

1.3 异常值的特点

  • 异常样本少
  • 异常类型多
  • 异常的未知性

1.4 异常检测算法分类

根据异常检测方法数学模型分类:

  • 基于统计学的方法
  • 基于邻近性的方法
  • 基于聚类的方法

根据训练集是否包含标注:

  • 无监督异常检测
  • 有监督异常检测

2 Isolation Forest算法

Isolation Forest属于Non-parametric和unsupervised的方法,即不用定义数学模型也不需要有标记的训练。

2.1 Isolation Forest 算法原理

隔离森林(Isolation Forest) 又名孤立森林,是一种从异常点出发,通过指定规则进行划分,根据划分次数进行判断的异常检测方法。
核心思路:循环分割(隔离),越容易被分割的判定为异常可能性越大。因为异常具有“少而不同”这一特点,所以异常数据比正常数据更容易被隔离。利用隔离森林,完成分割后,在最终形成的树中,异常将更加接近于根的位置。
隔离树: 设T为隔离树的一个节点,T是没有子节点的外节点,或者一个具有测试条件的内节点,它有两个子节点 ( T l , T r ) (T_l,T_r) (Tl,Tr)。测试条件由属性q和分割值p组成,根据测试条件q T l T_l Tl或者 T r T_r Tr
由于切割是随机的,所以需要用ensemble的方法来得到一个收敛值(蒙特卡洛方法),即反复从头开始切,然后平均每次切的结果。iForest 由t个iTree(Isolation Tree)孤立树 组成,每个iTree是一个二叉树结构,
算法步骤

  1. 从训练数据中随机选择w个点样本点作为subsample,放入树的根节点。
  2. 随机指定一个维度(attribute),在当前节点数据中随机产生一个切割点p——切割点产生于当前节点数据中指定维度的最大值和最小值之间。
  3. 以此切割点生成了一个超平面,然后将当前节点数据空间划分为2个子空间:把指定维度里小于p的数据放在当前节点的左孩子,把大于等于p的数据放在当前节点的右孩子。
  4. 在孩子节点中递归步骤2和3,不断构造新的孩子节点,直到 孩子节点中只有一个数据(无法再继续切割) 或 孩子节点已到达限定高度 。

获得t个iTree之后,iForest 训练就结束,然后我们可以用生成的iForest来评估测试数据了。对于一个训练数据x,我们令其遍历每一棵iTree,然后计算x最终落在每个树第几层(x在树的高度)。然后我们可以得出x在每棵树的高度平均值。设置一个阈值(边界值),average path length 低于此阈值的测试数据即为异常。异常在这些树中只有很短的平均高度。

2.2 Isolation Forest 算法特点

  1. iForest具有线性时间复杂度
  2. iForest不是基于模型(model-based)的算法,也是一种非监督学习算法。
  3. 因为是ensemble的方法,所以可以用在含有海量数据的数据集上面。通常树的数量越多,算法越稳定。由于每棵树都是互相独立生成的,因此可以部署在大规模分布式系统上来加速运算。
  4. iForest不适用于特别高维的数据。由于每次切数据空间都是随机选取一个维度,建完树后仍然有大量的维度信息没有被使用,导致算法可靠性降低。高维空间还可能存在大量噪音维度或无关维度(irrelevant attributes),影响树的构建。对这类数据,建议使用子空间异常检测(Subspace Anomaly Detection)技术。此外,切割平面默认是axis-parallel的,也可以随机生成各种角度的切割平面。
  5. iForest仅对Global Anomaly 敏感,即全局稀疏点敏感,不擅长处理局部的相对稀疏点 (Local Anomaly)。
  6. iForest推动了重心估计(Mass Estimation)理论发展,目前在分类聚类和异常检测中都取得显著效果。
  7. 算法运行时随机采样的数目非常重要,举个极端的例子,一次采样中采样10个数据,很不巧有9个是异常数据,那么,正常数据将会被认为是异常数据。对于这种情况可以考虑多次随机采样(即设置sklearn函数中的 n_estimators 参数) 与设置异常数所占的比例(即 contamination 参数),并设置为有放回的取样,若对于不同取样样本中同一个数据,多次都被认为是异常,那么就认为它是异常。若预先设定好的比例,超出比例的部分将不会被认为是异常。

转自:https://www.jianshu.com/p/5af3c66e0410

3 局部异常因子LOF算法

3.1 LOF算法原理

LOF (Local Outliers Factor,局部异常因子) 算法 是一种非监督异常检测算法,它是通过计算给定数据点相对于其邻域的局部密度偏差而实现异常检测。
核心思路: LOF算法是通过比较每个点p和邻域点的密度来判断该点是否为异常:点p的密度越低,越有可能是异常点。而点的密度是通过点之间的距离来计算的,点之间距离越远,密度越低;距离越近,密度越高。也就是说,LOF算法中点的密度是通过点的k邻域计算得到的,而不是通过全局计算得到,这里的"k邻域”也就是该算法中“局部”的概念。

相关定义: 论文中一共有七个定义,详细内容请下载论文了解。这里只介绍其中的五处定义,理解这几个定义基本上就能明白算法核心内容:
定义 3, k-distance of an object (对象p的k距离): 对于任意正整数k,p的k距离表示为k-distance§,定义为对象p和数据集D中对象o之间的距离d(p,o),满足:

  1. 在集合D中至少有k个点 o’,其中 o’ ∈D\ {p},满足 d ( p , o ′ ) ≤ d ( p , o ) d(p,o')\leq d(p,o) d(p,o)d(p,o)
  2. 在集合D中最多有k-1个点o’,其中 o’ ∈D\ {p},满足 d ( p , o ; ) < d ( p , o ) d(p,o;)d(p,o;)<d(p,o)

注意:(k-distance是函数名,不能把 - 当成减号)
为了解释k距离、k距离邻域问题,论文中例图如下:
异常值检测_第1张图片
自己的理解:在距离数据点 p 最近的几个点中,第 k 个(不包括p)最近的点跟点 p 之间的距离称为点 p 的 K-邻近距离,记为 k-distance (p)。论文这么定义是有存在虚线上有多个点的情况。

定义 4, k-distance neighborhood of an object p (对象p的k距离邻域): 给定k值,那么p对象的k距离领域则可表示为: N k − d i s t a n c e ( p ) ( P ) = { q ∈ D ∖ p ∣ d ( p , q ) ≤ k − d i s t a n c e ( p ) } N_{k−distance(p)}(P)=\lbrace q∈D∖{p}∣d(p,q)≤k−distance(p) \rbrace Nkdistance(p)(P)={qDpd(p,q)kdistance(p)}

定义 5, reachability distance of an object p w.r.t. object o (对象p关于对象o的可达距离)
r e a c h − d i s k k ( p , o ) = m a x { k − d i s t a n c e ( o ) , d ( p , o ) } reach−disk_k(p,o)=max \lbrace k−distance(o),d(p,o)\rbrace reachdiskk(p,o)=max{kdistance(o),d(p,o)}
这句话的理解可以参考上图,对于两个不同的点p1和p2,它们的可达距离计算是不一样的,对p1来说,因为p1o 的 k 邻域内(可以看出这里的k=3),所以它们的距离就是 k-distance(o) 的距离,也就是等于圆的半径;而对于p2,很明显它不在o的k邻域内,所以它的可达距离就是实际距离,也就是这两点之间的距离。

定义 6, local reachability density of an object p (对象p的局部可达密度):
异常值检测_第2张图片
即对象p的局部可达密度是基于p的MinPts邻居的平均可达距离的倒数。对象p的局部可达密度越高,越可能属于统一簇;密度越低,越可能是离群点。
注意,是p到o的可达距离(o为中心点),并且,如果有重复点,那么分母的可达距离之和有可能为0,则会导致lrd变为无限大
定义7, local outlier factor of an object p (对象p的局部异常因子):
异常值检测_第3张图片
对象p的局部异常因子表示p 的异常程度。如果这个比值的绝对值越接近1,说明p与邻域点的密度相差不多,p 和邻域同属一簇;如果这个比值的绝对值小于1,说明p的密度高于邻域点的密度,p 为密集点;如果这个比值的绝对值大于1的部分越多,说明 p 的密度小于邻接点的密度, p 越有可能是异常点。

3.2 LOF算法特点

  1. LOF算法是一种非监督算法
  2. LOF算法是一种基于密度的算法
  3. 它最明显的缺点就是检测的数据必须有明显的密度差异,计算比较复杂

4 One-Class SVM算法

4.1 One-Class SVM算法原理

One-Class SVM: One-Class SVM是一种无监督算法,它学习用于新颖性(novelty)检测的决策函数:将新数据分类为与训练集相似或不同的数据。
严格来说,One-Class SVM 不是一个异常点检测算法,而是一个新颖值检测(Novelty Detection)算法。换句话说,在One-Class SVM 将所有与正常数据有一定区别的都当成新颖数据,而我们根据实际需要设定边界,才认为超出边界的数据为异常数据。关于边界的问题,可以参考后面的例子。
One-Class SVM 算法与SVM算法的原理以及数学模型基本相同。总而言之就是寻找一个超平面,使用这个超平面把正常数据和异常数据(或称之为新颖数据)划分开,这是SVM算法的基本思想,而One-Class SVM 是基于一类数据(正常数据)求超平面,对 SVM 算法中求解负样本最大间隔目标进行改造,进而完成非监督学习下的异常检测。识别一个新的数据点时,如果这个数据点落在超球面内,就是这个类,否则不是。
support vector domain description(SVDD)SVDD的优化目标就是,求一个中心为a,半径为R的最小球面:
在这里插入图片描述
使得这个球面满足:
在这里插入图片描述
满足这个条件就是说要把training set中的数据点都包在球面里。
ξ i \xi_i ξi是松弛变量,和经典SVM中的松弛变量的作用相同 ,它的作用就是,使得模型不会被个别极端的数据点给“破坏”了,想象一下,如果大多数的数据都在一个小区域内,只有少数几个异常数据在离它们很远的地方,如果要找一个超球面把它们包住,这个超球面会很大,因为要包住那几个很远的点,这样就使模型对离群点很敏感.
注意松弛变量是带有下标i的,也就是说它是和每个数据点有关的,每个数据点都有对应的松弛变量,可以理解为:对于每个数据点来说,那个超球面可以是不一样的,根据松弛变量来控制,如果松弛变量的值一样,那超球面就一样。

有了要求解的目标,又有了约束,接下来的求解方法和SVM几乎一样,用的是Lagrangian乘子法:
异常值检测_第4张图片
α i ≥ 0 \alpha_i\geq 0 αi0, γ i ≥ 0 \gamma_i\geq 0 γi0,对参数求导并令倒数等于0得到:
异常值检测_第5张图片
再代回拉格朗日函数,得到:
在这里插入图片描述
之后的求解步骤就和SVM中的一样了。
训练结束后,判断一个新的数据点z是否是这个类,那么就看这个数据点是否在训练出来的超球面里面
在这里插入图片描述
将超球面的中心用支持向量来表示在这里插入图片描述

4.2 One-Class SVM 算法特点:

  1. 是一种非监督学习算法
  2. 是一种基于正常数据的特征进行异常检测的算法,和正常数据特征相似的数据被认为是正常数据,否则则认为是异常数据
  3. 比较适用于高维空间中的样本数据集

5 基于高斯概率密度算法

5.1 基于高斯概率密度算法原理

基本思想: 该算法是基于高斯分布的异常检测算法(Anomaly Detection Algorithm),在很多场景中被广泛使用。其算法的核心思想是:给定一个m*n维训练集,将训练集转换为n维的高斯分布,通过对m个训练样例的分布分析,得出训练集的概率密度函数,即得出训练集在各个维度上的数学期望μ和方差σ^2,并且确定一个阈值ε。当给定一个新的点,我们根据其在高斯分布上算出的概率,及阈值ε,判断当p<ε判定为异常,当p>ε判定为非异常。
对于无偏移的n维高斯分布,其概率密度函数可以使用以下两种方式来表示:
概率式:
在这里插入图片描述在这里插入图片描述
矩阵式:
在这里插入图片描述
关于ε的确定,

  1. 我们需要部分已知结果的训练样例作为交叉验证集。在训练过程中,尝试多种ε的值,然后根据F1 Score来选择ε的值.
  2. 当前数据点偏离总体数据平均值3个标准差时,可以认为是一个异常点(偏离多少个标准差可视实际情况调整)。

5.3 基于高斯概率密度算法特点

  • 适用于大致服从高斯分布的数据集
  • 不适用于高维特征数据集。对于高斯分布的概率密度函数必须要求m>n(m表示样本数目,n表示特征数目),要不然的话会导致协方差矩阵Σ不可逆,这里简单的证明一下,有兴趣的可以自行严格证明,假设A为nxm维矩阵,B为mxn维矩阵,mn,实际更确切的讲,实际应用算法中样本数目(n_samples) 应该大于特征数目的平方(n_features**2)
    注: 该算法应用场景极其有限,在此不做过多介绍。

6 使用PCA或自动编码机进行异常点检测

使用降维后的维度作为新的特征空间,其降维结果可以认为剔除了异常值的影响(因为过程是保留使投影后方差最大的投影方向)

你可能感兴趣的:(机器学习算法)