常见异常检测算法
接触到异常检测,要从接触到one class svm来说,其实是和刘翔宇聊到webshell检测到尾声的时候突然提起的,又顺便聊到了异常检测,然后又告诉了我PCA也可以做这个。当时对One Class SVM也不熟,至于PCA,我一直是以为做降维的,也没有想到可以用来做异常检测。
下面先介绍下常用的异常检测算法有哪几种。
- Robust covariance 适用于符合高斯分布时,效果较好
- One Class SVM 适用于非高斯分布时,效果较好,得到尽量小的维度和特征空间,远离离群点
- Isolation Forest
- Local Out lierFactor 基于密度,效果很好。
- PCA 典型的降维算法,通过降维后的数据和原数据比较,从而发现异常点
作为一个实战派,肯定是先从实战出发。在測試的效果上來看,LOF的效果最好。當然,下面开始介绍不同的算法(Robust Covariance暂不介绍)。 异常检测上,都是黑样本少,标签少。
One Class SVM
很好理解,顾名思义,根据正常样本进行训练,Detects the soft boundary of the set of samples X.读了下源码,但是没发现什么特殊的实现,OneClassSVM
重写了基类BaseLibSVM
的fit
方法, 对应x的y直接有x的length然后自动生成一个全为一的数组作为对应标签。
1 |
|
但是这个太慢了,太慢了,我的笔记本根本跑了俩小时,不舍得电脑哗哗的转了,就给关掉了。
Isolation Forest
IsolationForest 是周志华老师提出来的,简称iTree吧,是一种集成学习法方法,相对于LOF, oneclassSVM ,占用的内存更小,速度也快。原理就是构建树,但是因为不像决策树是有监督学习,根据label构建,这个构建过程是完全随机的。
构建过程: 从n中随机取出m条数据,作为训练样本,在样本中随机选一个特征,并在特征值范围内,随机选择一个值,然后划分。小于该值在左,其余在右。然后继续重复选择特征,划分到不能划分为止。或者树的高度达到一定高度。高度可以自己限制。构建完成之后就可以进行预测了。
预测过程是,把测试数据根据特征条件沿树到最后,记录该路径长度,以及走过边的数量。最后进行计算。然后分数越接近1,就越可能是异常点,低于0.5就是正常,0.5左右都是不明显的异常。
实际用例在此
Local Out lierFactor
虽然LOF是效果最好的,但是在这次的ATEC风险支付比赛中,表现并不好,而Robust Convariance
(肯定是效果最好,因为正常的交易和不正常的交易,恰恰应该是符合高斯分布的)的效果虽好,但是在本机一下就内存溢出了。而且跑出来的模型太大了,存了个模型,4个G大.
LOF是基于数据密度的算法,所以我们可以想到有k-distance,rechability distance. LOF 算法的优点是考虑到数据集的局部和全局属性:即使在异常样本具有不同潜在密度的数据集中,它也能够表现得很好。 问题不在于样本是如何被分离的,而是样本与周围近邻的分离程度有多大。
PCA
PCA做异常检测一种是将数据映射到低维特征空间,然后在特征空间不同维度上查看每个数据点跟其它数据的偏差;另外一种是将数据映射到低维特征空间,然后由低维特征空间重新映射回原空间,尝试用低维特征重构原始数据,看重构误差的大小。两种思路看似不太一样,其实本质上是差不多的。(该句摘自知乎用户)