0%

异常检测

​ 异常检测,是指在大量正常的行为中找出少量的异常行为。

常见异常检测方式

无监督异常检测

​ 无监督的异常检测模型整体上可以划分为5大类:统计和概率模型、线性模型、基于相似度衡量的模型、集成异常检测和模型融合、特定领域的异常检测

  • 统计和概率模型:分为假设和检验两部分,假设数据的分布与检测异常。例如对一维数据假设符合高斯分布,然后将3 sigma以外的数据划分为异常;对于高维数据,假设特征之间是独立的,可以计算每个特征维度的异常值并相加,如果特征之间是相关的则可以假设多为高斯分布,可以用马氏距离衡量异常度。

    • 代表检测算法:分位点法、Z-score算法
  • 线性模型:假设数据在低维空间有嵌入,那么在低位空间投影后表现不好的数据则认为是异常点。例如PCA算法有两种异常检测思路,一种是将数据映射到低维空间,然后在特征空间不同维度上查看每个数据点和其他数据点的偏差,另一种是看重构误差,想映射到低维然后再映射回高维,异常点的重构误差更大。

    • 代表检测算法:PCA、OneClassSVM
  • 基于相似度衡量的检测模型:异常点因为和正常点的分布不同,因此相似度较低,由此衍生出了一些根据密度、距离、划分超平面等相似度衡量指标进行异常检测的模型。

    • 代表检测算法:KNN、Local Outlier Factor(局部相对密度)、Isolation Forest(划分超平面)
  • 集成异常检测与融合模型

1.分位点法

​ 超过四分位点之外的数据可以认为是异常数据

2.Z-score(高斯分布)

​ 使用情况:一维或低维空间的异常检测算法

该技术是假定数据时高斯分布,异常值是分布尾部的数据点,因此原理数据的平均值

3.孤立森林

python实现:

1
2
3
4
5
6
7
from sklearn.ensemble import IsolationForest
import pandas as pd

clf = IsolationForest(max_samples=100, random_state=42)
table = pd.concat([input_table['Mean(ArrDelay)']], axis=1)
clf.fit(table)
output_table = pd.DataFrame(clf.predict(table))

4.聚类

​ 最常采用的方式就是聚类的方式,根据不同聚类算法的特点,使用各种聚类算法时也有不同的方法和应用场景,下面来具体介绍一下我对聚类在异常检测中的常见做法

Kmeans

​ 注意:Kmeans法做异常检测注意一定要做归一化

使用方法一

​ 聚类完成后,使用距离中心点最远的第n个点到中心点的距离为阈值,大于阈值则为异常点

使用方法二

​ 使用历史的全部数据进行聚类,使用这个聚类模型可以将数据中离质心最远的点找出来,将这个点到质心的距离设置为阈值,当有新数据进来时,判断这个数据到其质心的距离是否大于阈值,超过这个阈值则认为是异常。

​ 问题:历史数据并非全部为正常数据,也包含了异常数据

​ 解决 : 可以先将各个类中距离最远的那部分数据进行人工查看,确定不存在异常

DBSAN

​ 直接对数据进行聚类,将不属于任意一类的样本作为异常样本

【参考文献】