异常检测模型整理

写在前面

文中使用了其他博主的图,具体链接已不好追踪,如果不妥,还请谅解(私信我加备注哦)~

异常检测主要检测数据中的离群点,异常数据的特征值与正常数据的特征值距离较远。
异常检测具有以下难点:

  • 标签数据较少,从较少的标签数据中很难学习到哪些是正常数据,哪些是异常数据。
  • 难以划分异常和正常的边界。
  • 数据本身存在噪声,导致噪声和异常难以区分。

处理异常检测的模型包括监督模型、半监督学习和无监督学习模型,具体如下:

一、监督模型

常见分类模型都可使用。若有标签数据,则优先使用有监督学习方法解决问题。在基于监督学习的异常检测中,存在正类、负类类别不平衡的问题,因此需要注意不平衡数据的处理。

二、半监督学习

1)若有少量标签数据

参考puLearning中two-step的方法。先使用分类器在标签样本中训练(聚类方法同理),选取置信度较高的预测样本加入训练样本,并不断迭代。

2)若有大量标注数据,但是标注的数据全都是正常数据

i)基于距离的方法
  • Kmeans

思路: 先用干净的数据(没有异常点)得到一个K-Means结果。然后把测试集(包含异常点)根据之前KMeans的结果进行聚类,如果一个点距离它最近的中心超过之前训练集里的最大距离的话,就判断它为异常点。
优点: 用作聚类收敛快。
缺点: ①主要还是聚类算法,异常检测只是聚类功能的一个赠品;②KMeans适用于凸数据集;③初始聚类中心和K的选择影响算法结果。

ii)基于线性模型的方法
  • OCSVM(One-Class SVM)

思路: 将数据密度较高的区域分类为正,将数据密度较低的区域分类为负(异常样本)。
优点: 适合高维数据的异常检测。
缺点: 适合中小型数据集的分析,不适合海量数据情况下的异常检测。

三、无监督模型

1)统计与概率模型

思路: 主要对数据的分布做出假设,并找出假设下所定义的“异常”,如Z-Score。具体步骤:

  • i)假设数据服从的分布,并根据特征数据训练分布的参数;
  • ii)根据得到的参数和分布的函数计算预测特征的概率;
  • iii)①将预测概率小于给定阈值数据当做异常点;②预测概率越大,异常值越低。
    推广到高维后,可以假设每个维度各自独立,并将各个维度上的异常度相加。

优点: 速度快,适合大数据量情形。
缺点: ①仅适用于对单独维度进行研究,推广到多维,基本也是通过一些方法进行加权求和等,使用上有很大的局限性;②存在较强的“假设”,实际情况比较复杂,若假设错误,则效果不一定好;③假设各个维度之间相互独立,所以要求设计的特征尽可能相互独立;④基于假设的方法往往因为线上环境和线下环境分布的不同,线上效果可能和线下效果有差异。

2)基于距离的算法
  • KNN

思路: 一个样本和它第k个近邻的距离被当做是临界值,异常点的k近邻距离更大。
优点: 当维度较低时表现较好。
缺点: KNN每次运行需要遍历所有数据,计算开销较高,仅适用于中小数据集和低维数据。

  • Kmeans

思路: 使用KMeans对数据进行聚类,考虑离每簇的centroid最远的点,它们就是异常点。
优点: 用作聚类收敛快。
缺点: ①主要还是聚类算法,异常检测只是聚类功能的一个赠品;②KMeans适用于凸数据集;③初始聚类中心和K的选择影响算法结果。
备注: 图片来源https://zhuanlan.zhihu.com/p/77514567

3)基于密度的算法

基于密度的离群点检测方法的关键步骤在于给每个数据点都分配一个离散度,其主要思想是:针对给定的数据集,对其中的任意一个数据点,如果在其局部邻域内的点都很密集,那么认为此数据点为正常数据点,而离群点则是距离正常数据点最近邻的点都比较远的数据点。通常有阈值进行界定距离的远近。

  • DBScan

思路: DBSCAN算法在聚类过程中主要通过寻找核心对象来不断扩展密度可达的样本,从而将样本空间中不同位置的高密度空间找出来。除了高密度空间外的其他不属于任何类簇的样本就被视为样本点。比如图中DBSCAN根据密度和含糖率两个特征聚成了4个类簇,黑色实心点代表核心对象,白色点是核心对象密度可达的样本,剩下不在类簇中的星号*样本便是异常样本。
优点: 可以找出分布不均匀的数据中局部异常的数据。
缺点: ①主要还是聚类算法,异常检测只是聚类功能的一个赠品;②样本集的密度不均匀、聚类间距差相差很大时效果较差;③数据量大、特征维度较高的情况下,运行效率低下;④只能得到是否是异常点,无法得到异常程度。

  • LOF(Local Outlier Factor)

思路: 通过比较每个点p和其邻域点的密度来判断该点是否为异常点,点p的密度越低,越可能被认定是异常点。至于密度,是通过点之间的距离来计算的,点之间距离越远,密度越低,距离越近,密度越高。对其中的任意一个数据点,如果在其局部邻域内的点都很密集,那么认为此数据点为正常数据点,而离群点则是距离正常数据点最近邻的点都比较远的数据点。
优点: 检测精度高。
缺点: ①LOF方法通过比较所有数据点的LOF值判断离群程度,其需要计算数据点两两之间的距离,造成整个算法时间复杂度为O(n^2);②LOF对密度的是通过点的第k邻域来计算,而不是全局计算,因此得名为“局部”异常因子;③LOF类的算法适用于局部区域空间问题,对于完整区域空间,KNN和Iforest更好;④高维数据情况下效率较低。
备注: 图片来源https://zhuanlan.zhihu.com/p/37753692

  • feature bagging

思路: 先将训练数据随机划分(每次选取所有样本的d/2-d个特征,d代表特征数),得到多个子训练集,再在每个训练集上训练一个独立的模型(默认为LOF),并最终合并所有的模型结果(如通过平均)
优点: ensemble的思想。
缺点: 多个LOF的组合,效率较低。

4)基于线性模型
  • PCA

思路: PCA的主要思想是将方差最大的方向作为主要特征(或基于最小投影距离,即样本点投影超平面的距离足够近),常用于数据的降维。
降维方法进行异常检测的两种思路:
①将数据映射到低维特征空间,在低维特征空间的不同维度上查看每个数据点跟其他数据的偏差。如果一个样本在很多特征维度上的偏差都比较大,则考虑为异常样本。
②将数据映射到低维特征空间,然后由低维特征空间重新映射回原空间,尝试用低维特征重构原始数据,看重构误差的大小。如果一个样本不容易被重构出来,表示这个样本的特征跟整体数样本的特征不一致,则考虑为异常样本。
缺点: 线性模型,类似思想的非线性模型可参考Autoencoder。

5)基于树的算法

此类方法的思想是通过划分子空间寻找异常点。

  • 孤立森林

思路: 很快被划分到叶子节点的大概率是异常。由于异常值的数量较少且与大部分样本的疏离性,因此,异常值会被更早的孤立出来,也即异常值会距离iTree的根节点更近,而正常值则会距离根节点有更远的距离。具体步骤:

使用如下步骤建立t棵孤立树:
  1. 从训练数据中随机选择Ψ个点作为子样本,放入一棵孤立树的根节点;
  2. 随机指定一个维度,在当前节点数据范围内,随机产生一个切割点p —— 切割点产生于当前节点数据中指定维度的最大值与最小值之间;
  3. 此切割点的选取生成了一个超平面,将当前节点数据空间切分为2个子空间:把当前所选维度下小于p的点放在当前节点的左分支,把大于等于p的点放在当前节点的右分支;
  4. 在节点的左分支和右分支节点递归步骤2、3步骤,不断构造新的叶子节点,直到叶子节点上只有一个数据(无法再继续切割)或树已经生长到了所设定的高度。

孤立树构建完毕后,针对一条测试数据,使用ensemble的方法计算异常得分:

s ( x , ψ ) = 2 − E ( h ( x ) ) c ( ψ ) s(x, \psi )=2^{-\frac{E(h(x))}{c(\psi )}} s(x,ψ)=2c(ψ)E(h(x))

其中,h(x)为x在每棵树的高度,c(Ψ) 为给定样本数Ψ时路径长度的平均值,用来对样本x的路径长度 h(x) 进行标准化处理。s(x,Ψ)的取值范围为[0, 1],值越大,说明样本越有可能是异常样本。
优点: ①适合中大型数据集上的异常检测,具有较高的精准度;②适用于特征值是连续值的任务;③若异常特征隐藏在少量特征维度上,孤立森林效果较好(KNN效果不好);④线性时间复杂度;⑤目前几乎成为异常点检测算法的首选项;⑥相较于LOF,孤立森林对高维数据更鲁棒。
缺点: ①中小数据集上效果较差;②iForest仅对即全局稀疏点敏感,不擅长处理局部的相对稀疏点 ,这样在某些局部的异常点较多的时候检测可能不是很准。
备注: https://zhuanlan.zhihu.com/p/74508141

6)基于神经网络的算法

  • AutoEncoder

思路: Autoencoder与主成分分析PCA类似,但是Autoencoder在使用非线性激活函数时克服了PCA线性的限制。Autoencoder的思想是:先用encoder对数据编码(相当于降维),再使用decoder解码,比较和原始数据的差距,使用数据的重建误差作为异常值。模型训练的方向是越近似原始数据越好,对于异常数据,生成出的结果一般和原始数据差距较大。可以使用还原之后与还原之前的MAE误差/MSE误差来衡量异常情况,样本的重建误差越大,则表明异常的可能性越大。
优点: ①适合高维数据,不存在维度诅咒的问题;②能够挖掘隐式特征。
备注: https://zhuanlan.zhihu.com/p/46188296

  • 生成对抗网络

思路: 使用GAN的思想,用Generator生成潜在离群点(异常数据),将噪声和真实数据合在一起,让Discriminator分辨出噪声和真实数据,最后使用Discriminator作为异常检测分类器。
优点: ①适合高维数据;②能够挖掘隐式特征。
缺点: ①处理探索性阶段,工业应用可能会存在一定差距;②难以训练,Discriminator与Generator之间需要很好的同步,例如Discriminator更新k次而Generator更新一次。
文章: Liu Y, Li Z, Zhou C, et al. Generative adversarial active learning for unsupervised outlier detection[J]. IEEE Transactions on Knowledge and Data Engineering, 2019.

7)部分算法性能对比

备注: 上述17个数据集的规模都为中小型数据集。内容来源:https://www.zhihu.com/question/280696035
结果分析: 整体来看,IForest和KNN的效果好一些,KNN适用于中小型数据集和低维数据,IForest适用于数据量较大的情况。

4、总结&思考

1)基于聚类的方法存在的问题:聚类算法主要目标仍然倾向于发现簇而不是异常点,当一小团点彼此都相似且都是异常时,聚类算法无法识别。因此,个人更倾向于使用专注于异常检测的算法。
2)对于序列数据来说,不同序列节点的重要程度是不同的,若不考虑自动学习不用时间节点的特征重要度,则可以考虑针对某一特征不同序列节点的数据使用指数平滑(即过去的观测给出不同的权重)。若使用attention等模型来获取不同序列节点的权重,则不需要使用。

参考资料:
1、https://zhuanlan.zhihu.com/p/30169110
2、https://github.com/yzhao062/Pyod
3、https://sklearn.apachecn.org/docs/master/26.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值