异常检测,是指在大量正常的行为中找出少量的异常行为。
常见异常检测方式
无监督异常检测
无监督的异常检测模型整体上可以划分为5大类:统计和概率模型、线性模型、基于相似度衡量的模型、集成异常检测和模型融合、特定领域的异常检测。
统计和概率模型:分为假设和检验两部分,假设数据的分布与检测异常。例如对一维数据假设符合高斯分布,然后将3 sigma以外的数据划分为异常;对于高维数据,假设特征之间是独立的,可以计算每个特征维度的异常值并相加,如果特征之间是相关的则可以假设多为高斯分布,可以用马氏距离衡量异常度。
- 代表检测算法:分位点法、Z-score算法。
线性模型:假设数据在低维空间有嵌入,那么在低位空间投影后表现不好的数据则认为是异常点。例如PCA算法有两种异常检测思路,一种是将数据映射到低维空间,然后在特征空间不同维度上查看每个数据点和其他数据点的偏差,另一种是看重构误差,想映射到低维然后再映射回高维,异常点的重构误差更大。
- 代表检测算法:PCA、OneClassSVM
基于相似度衡量的检测模型:异常点因为和正常点的分布不同,因此相似度较低,由此衍生出了一些根据密度、距离、划分超平面等相似度衡量指标进行异常检测的模型。
- 代表检测算法:KNN、Local Outlier Factor(局部相对密度)、Isolation Forest(划分超平面)
- 集成异常检测与融合模型
1.分位点法
超过四分位点之外的数据可以认为是异常数据
2.Z-score(高斯分布)
使用情况:一维或低维空间的异常检测算法
该技术是假定数据时高斯分布,异常值是分布尾部的数据点,因此原理数据的平均值
3.孤立森林
略
python实现:
1 | from sklearn.ensemble import IsolationForest |
4.聚类
最常采用的方式就是聚类的方式,根据不同聚类算法的特点,使用各种聚类算法时也有不同的方法和应用场景,下面来具体介绍一下我对聚类在异常检测中的常见做法
Kmeans
注意:Kmeans法做异常检测注意一定要做归一化
使用方法一
聚类完成后,使用距离中心点最远的第n个点到中心点的距离为阈值,大于阈值则为异常点
使用方法二
使用历史的全部数据进行聚类,使用这个聚类模型可以将数据中离质心最远的点找出来,将这个点到质心的距离设置为阈值,当有新数据进来时,判断这个数据到其质心的距离是否大于阈值,超过这个阈值则认为是异常。
问题:历史数据并非全部为正常数据,也包含了异常数据
解决 : 可以先将各个类中距离最远的那部分数据进行人工查看,确定不存在异常
DBSAN
直接对数据进行聚类,将不属于任意一类的样本作为异常样本
【参考文献】