作者:云智慧算法工程师 Chris Hu
异常检测是识别与正常数据不同的数据,与预期行为差异大的数据。本文详细介绍了异常检测的应用领域以及总结梳理了异常检测的算法模型分类。文章最后更是介绍了常用的异常算法数据集。
异常的概念与类型
目前异常检测主要是基于Hawkins对异常的定义:(Hawkins defines an outlier as an observation that deviates so significantly from other observations as to arouse suspicion that it was generated by a different mechanism.)。异常(anomaly/outlier)指的是远离其他观测数据而疑为不同机制产生的观测数据。根据概率理论对异常的形式化定义如下:
异常主要分为以下三种类型:
-
point anomalies(点异常)
点异常是单个异常数据点 ,将数据集中每个数据映射到高维空间中,其中孤立的点被称为点异常。这种异常点与其他数据点具有明显差异,这种异常分类是异常数据中最为简单的一种,也是异常检测研究中最常研究的异常类型。
-
conditional anomalies/contextual anomalies(条件异常/上下文异常)
一个数据本身来看属于正常点,但在特定的条件下又与一般情况有差异,这类数据称为条件异常或上下文异常。其中上下文指数据集间的结构和关系,每个数据均由上下文特征( contextual attributes) 及行为特征( behavioral attributes) 来定义,即条件异常需要考虑的不仅仅是数据的取值,还需考虑数据出现的环境,也就是说某一数据在特定数据环境下被判断为异常,而在其他数据集中则可能是正常的。
-
collective anomalies/group anomalies(群体异常/序列异常)
数据属性在正常范围内,且从上下文环境角度判断也属于正常的数据仍有可能是异常数据。如图3所示,在脑电图中虚线圆圈部分与脑电图整体图形不一致模式称之为聚集异常( 或称集合异常)。异常数据集中单个点可能并不异常,但这些相互关联的数据点聚集在一起时变为异常的情况。聚集异常不仅需要考虑数据的取值、上下文环境,还考虑数据集是否符合整体模式。聚集异常检测常用于时间序列、空 间数据以及图形式的数据中。
在实际的运维场景中,以上三种异常都会出现,比如资源使用率突然上升造成Point Anomalies,又如CPU使用过程中的突然卡顿形成Contextual anomaly,再如某指标使用率连续一段时间处于“满格”状态而呈现出Collective or group anomalies。后两者异常通常需要和业务紧密结合,单纯从数据本身出发具有一定的辨识难度,再加上运维领域中大比例情况下出现的是Point Anomalies,客户多关注于此,因而通常情况下我们更关注Point Anomalies。
异常检测的应用领域
-
入侵检测(Intrusion detection):通过从计算机网络或计算机系统中的若干关键点收集信息并对其进行分析,从中发觉网络或系统中有没有违反安全策略的行为和遭到袭击的迹象,并对此做出适当反应的流程。最普遍的两种入侵检测系统包括基于主机的入侵检测系统(HIDS)、网络入侵检测系统(NIDS)。
-
欺诈检测(Fraud detection):主要是不同领域的非法活动检测,主要应用领域包括银行欺诈、移动蜂窝网络故障、保险欺诈、医疗欺诈。
-
恶意软件检测(Malware Detection):主要分为静态分析检测技术与动态分析与检测技术。
-
医疗异常检测(Medical Anomaly Detection):通过X光片、核磁共振、CT等医学图像检测疾病或量化异常,也可以通过EEG、ECG等时序信号进行疾病检测或异常预警。
-
深度学习用于社交网络中的异常检测(Deep learning for Anomaly detection in Social Networks): 社交网络中的异常通常是指个人的不正常甚至违法的行为,如垃圾邮件发送者、性侵者、在线欺诈者、虚假用户或谣言散布者等。
-
日志异常检测(Log Anomaly Detection):日志异常检测是指找到异常日志,从而判断系统故障原因与性质,通常将日志数据建模为自然语言序列进行异常检测。
-
物联网大数据异常检测(Internet of things (IoT) Big Data Anomaly Detection):通过监控数据流信息检测异常设备和系统行为。
-
工业异常检测(Industrial Anomalies Detection): 检测风力涡轮机、发电厂、高温能源系统、存储设备和旋转机械部件组成的工业系统中设备的损坏情况, 该领域中异常检测的挑战是数据量与数据的动态特性,因为故障通常是由多种因素引起的。
-
时间序列中的异常检测(Anomaly Detection in TimeSeries):包括单变量时间序列异常检测与多变量时间序列异常检测。
-
视频监控(Video Surveillance):检测视频中的异常场景。
异常检测思路与方法总结
现如今,异常检测主要面临以下困难与挑战:
-
未知性:异常与许多未知因素有关,例如,具有未知的突发行为、数据结构和分布的实例。它们直到真正发生时才为人所知,比如恐怖袭击、诈骗和网络入侵等应用;
-
异常类的异构性: 异常是不规则的,一类异常可能表现出与另一类异常完全不同的异常特征。例如,在视频监控中,抢劫、交通事故和盗窃等异常事件在视觉上有很大差异;
-
类别不均衡:异常通常是罕见的数据实例,而正常实例通常占数据的绝大部分。因此,收集大量标了标签的异常实例是困难的,甚至是不可能的。这导致在大多数应用程序中无法获得大规模的标记数据。
基于标签的异常检测算法分类
- 有监督异常检测算法
有监督异常检测算法是指在训练集中的正常实例和异常实例都有标签,训练二类或多类分类器。有监督异常检测方法主要面临两个问题,一方面是在训练数据中,相对于正常时间序列来讲,异常的数据量太小,会对检测效果产生影响;另一方面是在实际操作中很难精确地标注数据是正常或异常,而且异常的情况也难以全部覆盖。基于以上原因,在实际异常检测中,有监督异常检测算法在实际应用中较少。
- 半监督异常检测算法
半监督异常检测算法是指在训练集中只有单一类别(正常实例)的实例,没有异常实例参与训练。半监督异常检测技术的一种典型方法是基于训练数据集为正常时间序列数据建立模型,然后利用该模型识别待检测数据中的异常。半监督异常检测学习正常数据的判别边界,不属于正常类的数据被判断为异常。由于训练中不需标注异常序列,因此半监督式异常检测方法的应用相对更加广泛。
- 无监督异常检测算法
无监督异常检测算法在训练集中既有正常实例也可能存在异常实例,但假设数据的比例是正常实例远大于异常实例,模型训练过程中没有标签进行校正。此类技术的核心思想在于异常的情况相对于正常的情况而言是很少的,且其与正常情况存在较大的差异,这种差异可以体现在数据之间的距离远近、分布密度、偏离程度等方面。无监督异常检测算法仅根据数据的内在属性(如距离、密度等)检测数据的异常值,自编码器是所有无监督深度异常检测模型的核心。
基于模型的异常检测算法分类
基于模型的异常算法分类基于传统方法的异常检测模型和基于深度学习的异常检测模型两大类。
基于传统方法的异常检测模型
- 基于统计的方法
使用这类方法基于的基本假设是正常的数据是遵循特定分布形式的,并且占了很大比例,而异常点的位置和正常点相比存在比较大的偏移。比如高斯分布,在平均值加减3倍标准差以外的部分仅占了0.2%左右的比例,一般我们把这部分数据就标记为异常数据。
基于统计的异常检测一般需要充分的数据基础和相应的先验知识,此时检测效果可能是非常有效的。然而,此类检测方法一般是针对单个属性或低维数据的,而对于高纬度的时间序列数据就难以估计其真实的分布。
- 基于重构的方法
假设异常点是不可被压缩的或不能从低维映射空间有效地被重构的。常见的方法有PCA、Robust PCA、random projection等降维方法。 PCA提取了数据的主要特征,如果一个数据样本不容易被重构出来,表示这个数据样本的特征跟整体数据样本的特征不一致,那么它显然就是一个异常的样本。
对于数据样本X_i, 假设其基于 k 维特征向量重构的样本为X_ik^’ , 则该数据样本的异常得分可以用如下的公式计算:
- 聚类分析方法
此类方法利用聚类算法(如K-means、_x0008_DBSCAN等)对待检测数据进行聚类,通过聚类的结果来分辨正常与异常的数据,是一种典型的非监督式异常检测技术。通常来讲,基于聚类的异常检测可基于三种假设来分辨异常数据:
-
不属于任何簇(Cluster)的数据即为异常;
-
距离簇中心很远的数据即为异常;
-
归属于数据点少或稀疏簇的数据即为异常。
使用聚类算法进行异常检测,可利用大量已有的聚类研究成果。但是,聚类与异常检测还是有较大差异的,异常检测的目标在于寻找不正常的数据,而聚类的目的在于确定数据归属的类别。而且,很多聚类算法并未针对时间序列数据做优化,算法执行效率往往不高。
- one-class 分类方法
对正常数据建立区分性边界,异常点被划分到边界外。常见的方法有OC-SVM、SVDD等。
基于深度学习的异常检测模型
- Deep one class
该类的典型方法为:Deep SVDD [11] 、OC-NN [20]。
- Deep clustering
采用深度学习的聚类方法一般是用神经网络对输入数据进行编码,然后认为最后的编码序列可以代表神经网络的很多特征,然后我们对编码序列进行聚类就可以达成聚类的目的。该类方法被用于异常检测的包括:CAE-l2 cluster 、DAE-DBC。
CAE-l2 cluster:在autoencoder中间加入了L2标准化以及k-means。
DAE-DBC:先利用autoencoder降维,然后通过聚类方法判别异常值。
- Autoencoder
一个通用的自动编码器由编码器和解码器组成,编码器将原始数据映射到低维特征空间,而解码器试图从投影的低维空间恢复数据。这两种网络的参数通过重构损失函数来学习。为了使整体重构误差最小化,保留的信息必须尽可能与输入实例(如正常实例)相关。
典型案例有稀疏自动编码器(sparse AE)、去噪自动编码器(denoising AE)、收缩自动编码器(contractive AE)、鲁邦自动编码器(Robust Deep AE)等,基本原理都较为简单。
该类方法的优点是能够通过非线性方法捕捉复杂特征,试图找到正常实例的一种通用模式,缺点是如何选择正确的压缩程度,以及如何解决“过拟合”的问题(网络拟合的太好以至于异常实例也“潜伏”在低维特征空间中)。为了解决这个缺点,有研究者使用正则化或者记忆矩阵等等方法。
- Generative models
这种方法通常旨在学习生成网络G的潜在特征空间,使潜在空间能够很好地捕捉到给定数据背后的常态。将生成模型用于异常检测是基于在生成网络的潜在特征空间中正常实例比异常实例能够更准确地被产生这一假设。 实际实例和生成实例之间的残差被定义为异常分数。
典型案例有AnoGAN、GANomaly、Wasserstein GAN、 Cycle GAN、VAE等。该类方法的关键问题是如何设计合适的生成器和目标函数。
异常检测数据集
异常检测数据类型
用于异常检测的数据通常可分为两类:
序列数据:如voice, text, music, time series, protein sequences;
非序列数据:如images, other data。
异常检测开源数据集
下方链接为常用的异常检测数据集,该git仓库中维护了多种通用的异常检测数据集。
https://github.com/GuansongPang/ADRepository-Anomaly-detection-datasets
下方链接为时间序列异常检测数据集,该git仓库中维护了时间序列异常检测算法相关的软件、包、数据集等。
https://github.com/rob-med/awesome-TS-anomaly-detection
开源项目推荐
云智慧已开源数据可视化编排平台 FlyFish 。通过配置数据模型为用户提供上百种可视化图形组件,零编码即可实现符合自己业务需求的炫酷可视化大屏。 同时,飞鱼也提供了灵活的拓展能力,支持组件开发、自定义函数与全局事件等配置, 面向复杂需求场景能够保证高效开发与交付。
如果喜欢我们的项目,请不要忘记点击下方代码仓库地址,在 GitHub / Gitee 仓库上点个 Star,我们需要您的鼓励与支持。此外,即刻参与 FlyFish 项目贡献成为 FlyFish Contributor 的同时更有万元现金等你来拿。
GitHub 地址: https://github.com/CloudWise-OpenSource/FlyFish
Gitee 地址: https://gitee.com/CloudWise/fly-fish