2021-01-12

#异常检测

#一、概述

***

##1、异常检测的概念

---

###1.1什么是异常检测

**异常检测**指对不匹配预期模式或数据集中其他项目的项目、事件或观测值的识别。 通常异常项目会转变成银行欺诈、结构缺陷、医疗问题、文本错误等类型的问题。异常也被称为离群值、新奇、噪声、偏差和例外。

###1.2为什么需要异常检测

机器学习有四种常见的应用:分类,下一值预测,异常检测和结构发现。其中,异常检测用于检测数据中与其余部分不相符的数据点。它具有广泛的应用性,如:欺诈检测,监控,诊断,数据清理和预测维护。

虽然学术界已经进行了详细的研究,异常检测的应用依然仅限于银行,金融机构,审计和医疗诊断等利基领域。但是,随着物联网的兴起,异常检测会在许多物联网的场景中发挥关键作用,例如:如监控和预测维护。

###1.3异常检测的场景

- 故障检测

- 物联网异常检测

- 欺诈检测

- 工业异常检测

- 时间序列异常检测

- 视频异常检测

- 日志异常检测

- 医疗日常检测

- 网络入侵检测

###1.4异常检测的类型

1. 点异常,个体数据相对于其余数据被视为异常(例如购买中的大型交易)

2. 上下文异常,数据实例仅在特定上下文中异常,而在其它情况中则不是(例如发生在特定时间或特定区域的异常,例如午夜时的峰值)

3. 集合异常,相关数据实例的集合相对于整个数据集是异常的,对于单个值则不是。该异常有两种可能性:

   1. 按无法预料的顺序发生(有序,例如心电图心率中的间隙)

   2. 值的组合是无法预料的(无序, 例如购买大量昂贵物品)

由于训练集存在不同,根据训练集的不同,也可将异常检测分为三类:

1. 全监督异常检测(Supervised Anomaly Detec-tion)

全监督异常检测就是训练的数据集都被标签化,分别标记成正常和异常。全监督检测算法根据**训练集中的标签**进行训练,得到网络模型,在测试阶段,通过对网络模型输入未知类别的样本测试,得到输出结果。在现实的实践中,由于标记样本是个复杂的过程,因此,全监督异常检测的应用范围很窄。

2. 半监督异常检测(Semi-Supervised Anomaly De-tection)

半监督异常检测只是对数据集中正常的样本进行标签化,然后通过训练被标签化的正常样本,得到“正常”模型,将数据样本与“正常”模型的偏差定义为异常度,如果当异常度大于设定的阈值,最终的输出结果将是异常,如果异常度小于设定的阈值,输出结果将是正常。半监督异常检测面临着和全监督异常检测一样的问题,都需要标签化的样本,因此在实际中应用并不广泛。

3. 无监督异常检测(Unsupervised Anomaly Detec-tion)

无监督异常检测的数据集没有任何的标签,无监督异常检测的数据集包含正常数据和异常数据,通常情况下,正常的数据要比异常数据多。无监督异常检测通过训练正常的数据集,得到网络模型,并得到一个异常分类分数,当将测试数据输入到网络模型中,也会得到一个分数,通过比较,如果测试数据得到的分数大于异常分类分数时,则测试数据的输出结果为异常,反之则为正常。在实际生产中,通常正常的数据要远远大于异常数据,而且无监督异常异常检测不需要对数据集进行标签化,所以无监督异常检测应用最为广泛。

---

##2、异常检测算法

---

序号|检测方法|主流算法(模型)|优点|缺点|

:--:|:--:|:--:|--|--|--|

1|基于统计概率|Mahalanobis距离|适用于低维数据,其检测效果具有很好的鲁棒性|对分布模型的依赖程度高,模型选择不当,则会造成检测效果不明显,准确率低|

2|基于最近邻|KNN算法 LOF算法 INFLO算法|不需要假设数据分布|不适用于高维数据,需要人工调节参数,需要遍历数据距离,计算程度大,不适用于在线使用|

3|基于聚类|DBSCAN算法 KMeans算法 CBLOF算法 LDCOF算法|检测速度快,可以应用于实时在线检测|检测效果对聚类效果的依赖程度大,对于大数据而言,开销成本大|

---

###2.1异常检测常用方法分析

####2.1.1基于统计概率的方法

基于概率统计的异常检测算法通过分为两步,第一步假设数据服从一定的分布,如正态分布、泊松分布;第二步是计算每个点属于这个分布的概率,最后得出该点是否异常。一般情况下根据估计参数的方法来确定分布模型,利用数据集的数据去估计,得到一个估计的模型。

####2.1.2线性模型

典型的如主成分分析的方法(PCA),一般用作对数据进行降维。降维后的数据能够最大程度地保留原始数据地特征(以数据协方差为衡量标准)。该方法地原理是通过构造一个新的特征空间,将原数据映射到这个新的低维空间里,PCA可以提高数据地计算性能,并缓解“高维灾难”。

####2.1.3基于最近邻异常检测算法

基于最近邻的异常检测算法通常近邻度分为全局近邻和局部近邻,在全局近邻异常检测算法中常见的是基于距离的异常检测算法;局部近邻异常检测算法中常见是基于密度的异常检测算法。

**1. 基于距离异常检测算法**

基于距离的异常检测算法主要应用于全局近邻,常用的算法是KNN算法,KNN算法主要思想是异常点距离正常点的距离比较远。KNN算法其原理对于每个数据点,通过找到k个最近的邻居,然后根据k个最近的邻居计算异常分数,计算异常分数的方法主要有两种:一是使用第K个最近的距离;二是计算所有的K个距离,然后求出平均距离。通常在实际中方法2的应用程度比较高。

**2. 基于密度异常检测算法**

对于数据集存在分布不均匀,有稠密的地方,有疏松的地方,这就造成分割的阈值难以确定,为解决这一问题,提出基于密度的异常检测算法。基于密度的异常检测算法是根据样本点的局部密度信息去判断是否异常,常见的基于密度的异常检测算法有:LOF、IN-FLO、LOOP等。

- **LOF算法**:其基本原理是对数据点进行计算,找出其k个近邻,然后计算LOF得分,得分越高则异常的可能性越大。LOF是一个比值,其分子是k个近邻的平均局部可达密度,分母则是该数据点局部可达密度。可达密度则是k-近邻个数与k-近邻可达距离的比值。

- **INFLO算法**:在计算局部密度的时候,通过利用k近邻点和引入反向近邻集合来改善LOF算法中存在将边界点视为异常的问题。INFLO算法适用于当不同密度的簇彼此接近的时候。

- **LOOP算法**:与其他算法存在不同,相对于基于全局的KNN算法还是LOF的算法,其输出结果都是异常分数,对于异常分数作为输出结果而言,通常缺少一个衡量的标准,即不知道输出多少分会被判定为异常点,LOOP算法通过输出异常概率解决问题。Lo OP算法计算局部密度的方法的基本原理通常会假设距离最近的邻居服从高斯分布。距离总是以正数值存在,所以符合“半高斯”分布(均值的右边)。使用“半高斯”分布的标准差(也称为概率集距离)。每个数据点会与其邻居产生一个局部异常检测分数,最后应用一个归一化函数和一个高斯误差函数,将异常检测分数转换成一个**概率的形式**输出。

####2.1.3基于聚类的方法

基于聚类的异常检测算法通常有三种假设,每个假设方面都有其常见的方法。

- **假设一**:不属于任何簇类的点就是异常点,代表方法**DBSCAN**算法;DBSCAN算法是一种典型的基于密度的聚类算法,该算法通过将紧密相连的样本划为各个不同的类别,最终得出聚类类别结果。

- **假设二**:距离最近的聚类结果较远的点为异常点,常见方法**K-Means**算法。该算法首先对数据进行聚类,然后通过计算样本与所属聚类的两个距离,一个是样本与所属聚类中心的距离,一个是样本与所属聚类的类内平均距离,通过两个距离的比值衡量异常程度。

- **疏松聚类与较小的聚类里的点都是异常点**:主要方法CBLOF算法、LDCOF算法。该类方法通过聚类后将聚类簇分成大簇和小簇,如果样本数据属于大簇,则利用该样本和所属大簇进行计算异常得分;如果样本数据属于小簇,则利用该样本距离最近的大簇计算异常得分。

###2.2集成方法

集成学习是近年来机器学习领域的研究热点之一,成果主要有**Bagging、Boosting、Arcing、Random Forest**等。其主要思路是通过训练多个弱学习系统并将其结果按一定方式进行组合,可以显著提高学习系统的泛化能力。

令$\boldsymbol{X}=\left\{x_{1}, x_{2}, \cdots, x_{n}\right\} \subset \boldsymbol{R}^{d}$表示$d$维空间中未知标签数据集,其中任意第$i$个数据$x_i$由一个$d$维的特征向量$\left[x_{i 1}, x_{i 2}, \cdots, x_{i d}\right]^{\mathrm{T}}$表示。异常检测模型就是用来对数据集中所有数据进行检测,得到任意第$i$个数据的异常分(异常程度)$AS_i$ ,并为之分配一个标签

$\lambda^{(i)} \in\{\{\text { normal }\},\{\text { abnormal }\}\}, i=1,2, \cdots, n$。实际应用中简化处理为$\lambda^{(i)} \in\{0,1\}$因此,异常检测模型集成学习的基本思路就是利用集成函数$F(\cdot)$将未知数据集$\boldsymbol{X}=\left\{x_{1}, x_{2}, \cdots, x_{n}\right\}$ 映射到一维的标签向量$\lambda^{G}=F\left(\left\{\lambda^{(1)}, \lambda^{(2)}, \cdots, \lambda^{(n)}\right\}\right)$。

##3、异常检测常用开源库

你可能感兴趣的:(2021-01-12)