异常检测 第一篇
一 异常检测的概念
就是要检测出与正常数据不符或者和我们预期差别较大的数据,在数据挖掘中,异常检测是通过与大多数数据显著不同而引起怀疑的罕见项目、事件或观察结果的识别。通常,异常项目会转化为某种问题,如银行欺诈、结构缺陷、医疗问题或文本错误。异常也被称为异常值、新奇、噪音、偏差和异常。可以用下面这几个关键字:outlier detection,deviation detection,exception mining或者anomly detecton。但最常用的英语叫法还是outlier detection和anomly detection。
1.1异常检测类别
- 点异常(point anomalies)指的是少数个体实例是异常的,大多数个体实例是正常的,例如正常人与病人的健康指标;
- 条件异常(conditional anomalies),又称上下文异常,指的是在特定情境下个体实例是异常的,在其他情境下都是正常的,例如在特定时间下的温度突然上升或下降,在特定场景中的快速信用卡交易;
- 群体异常(group anomalies)指的是在群体集合中的个体实例出现异常的情况,而该个体实例自身可能不是异常,在入侵或欺诈检测等应用中,离群点对应于多个数据点的序列,而不是单个数据点。例如社交网络中虚假账号形成的集合作为群体异常子集,但子集中的个体节点可能与真实账号一样正常
- 总结:在点异常中数据本身就是异常数据,条件异常中就显而易见,数据在某些特定的条件下称为异常数据,例如在动物类别里,猫狗是一类数据,但在猫科里面关于狗的数据即为异常数据。群体异常中可看为点异常和群体异常的交融。
1.2异常检测的方法
**通常在异常检测中使用的方法与我们的项目数据,所要想检测出来的异常数据的种类有很大的关系,知道了这些就可以使用一种或者多种方法的结合。
- 基于模型的方法:一大类异常检测算法是先根据输入数据建模,异常就是无法用建好的模型拟合的对象或者模型的输出与我们的预期拟合极大不符,那么通常这些就是异常点。
- 基于距离的方法:通常我们已知正常数据的分布规则,对象之间是可以定义‘距离‘的,那么异常对象就是那些远离大多数点的对象,因此这类方法又被称为基于距离的异常检测方法。
- 基于密度的方法:一个数据集可能不同区域的密度不同,低密度区域的对象,通常离大多数对象比较远,这类对象也可以被看做异常。
其实,异常检测的方法按标签的使用情况分类,和机器学习按照标签的分类是一样的。根据标签的使用情况,可以分为,有监督方法,无监督方法,半监督方法。
1.有监督:训练集的正例和反例均有标签
2.无监督:训练集无标签
3.半监督:在训练集中只有正例,异常实例不参与训练
1.3异常检测的场景
- 欺诈检测:比如信用诈骗,电信诈骗,信用卡盗刷等
- 入侵检测:搞安全的都知道,黑客或者白帽子经常设法攻击一些公司或者个人的服务器或PC机。
- 生态灾难预警:各种自然灾害,极端天气的预警,禽流感等传染类疾病的预警
- 制药领域:药物筛选的时候常常要确定试验结果是否正常。
- 反垃圾:但凡现在一个app用户有了一定的基数,立马成为各种黑产的目标,各种垃圾广告,垃圾邮件满天飞,让app的运营者不胜其扰,用户体验变的很差。
- 数据去噪:一些异常数据可能会导致数据的期望或者方差等严重偏离正常,利用异常检测方法检测出数据中的噪声通常是数据预处理中很重要的一步。
1.4 异常检测的难点
1.数据量少。异常检测任务通常情况下负样本(异常样本)是比较少的,有时候依赖于人工标签,属于样本不平衡问题。
2.噪音。异常和噪音有时候很难分。
2 异常检测的具体方法
异常检测的方法有很多,基于统计的方法,基于机器学习的方法,基于时间序列的方法等。
2.1.1 基于统计学的方法
1.基于统计学
异常检测的统计学方法的一般思想是:学习一个拟合给定数据集的生成模型,然后识别该模型低概率区域中的对象,把它们作为异常点。
即利用统计学方法建立一个模型,然后考虑对象有多大可能符合该模型。
典型的如PCA方法,Principle Component Analysis是主成分分析,简称PCA。它的应用场景是对数据集进行降维。降维后的数据能够最大程度地保留原始数据的特征(以数据协方差为衡量标准)。其原理是通过构造一个新的特征空间,把原数据映射到这个新的低维空间里。PCA可以提高数据的计算性能,并且缓解"高维灾难"。
2.基于邻近度的方法
这类算法适用于数据点的聚集程度高、离群点较少的情况。同时,因为相似度算法通常需要对每一个数据分别进行相应计算,所以这类算法通常计算量大,不太适用于数据量大、维度高的数据。
基于相似度的检测方法大致可以分为三类:
基于集群(簇)的检测,如DBSCAN等聚类算法。
聚类算法是将数据点划分为一个个相对密集的“簇”,而那些不能被归为某个簇的点,则被视作离群点。这类算法对簇个数的选择高度敏感,数量选择不当可能造成较多正常值被划为离群点或成小簇的离群点被归为正常。因此对于每一个数据集需要设置特定的参数,才可以保证聚类的效果,在数据集之间的通用性较差。聚类的主要目的通常是为了寻找成簇的数据,而将异常值和噪声一同作为无价值的数据而忽略或丢弃,在专门的异常点检测中使用较少。
基于距离的度量,如k近邻算法。
k近邻算法的基本思路是对每一个点,计算其与最近k个相邻点的距离,通过距离的大小来判断它是否为离群点。在这里,离群距离大小对k的取值高度敏感。如果k太小(例如1),则少量的邻近离群点可能导致较低的离群点得分;如果k太大,则点数少于k的簇中所有的对象可能都成了离群点。为了使模型更加稳定,距离值的计算通常使用k个最近邻的平均距离。
基于密度的度量,如LOF(局部离群因子)算法。
局部离群因子(LOF)算法与k近邻类似,不同的是它以相对于其邻居的局部密度偏差而不是距离来进行度量。它将相邻点之间的距离进一步转化为“邻域”,从而得到邻域中点的数量(即密度),认为密度远低于其邻居的样本为异常值。