孤立森林(iForest)作为首个基于孤立机制的异常检测算法,近十年来在学术界和工业界获得了巨大反响,目前也有很多基于其的后续改进算法,运用于不同的场景中。本文将讨论我们研究组这几年来最成功的(大量实践证明效果最好的)一个提升版本算法 —— iNNE (Isolation‐based anomaly detection using nearest‐neighbor ensembles)。该算法作者包括孤立森林原作者陈开明教授和刘飞博士。原文链接: https://doi.org/10.1111/coin.12156
我们发现孤立森林在数值型数据上面临4大问题(孤立森林介绍可参考之前文章):
1. iForest仅对Global Anomaly 敏感,即全局稀疏点敏感,不擅长处理局部的相对稀疏点 (Local Anomaly)。
2. iForest不适用于特别高维的数据。由于每次切数据空间都是随机选取一个维度,建完树后仍然有大量的维度信息没有被使用,导致算法可靠性降低。
3. iForest不善于找到和坐标轴平行的簇中的异常。这是因为每次建子树的时候都是按坐单个标轴进行分割,异常可能会藏在某个维度中数据分布比较密的地方。
4. iForest不适用于含有多个高密度分布区域的数据
为了解决以上问题,我们仍然借鉴数据数据孤立机制,并结合最近邻距离计算方法,开发出了算法iNNE (Isolation‐based anomaly detection using nearest‐neighbor ensembles)。该算法采用多维超球体切割数据空间来实现孤立机制,并考虑了数据局部分布特性即使用最近邻的距离比率来计算数据的异常指标。论文中公式和推导比较复杂,本文将采用浅显易懂(类似介绍iForest)的方式来阐述如何实现并运用该算法。
训练阶段和iForest类似,都是随机抽样来建模,训练数据可以和测试数据无关。
1. 从训练数据中随机选择Ψ个点样本点作为subsample,然后每个样本点都各自找到自己在其他(Ψ-1)个点样本点中离自己最近的点(俗称最近邻),以到该最近邻的距离为半径,自己为圆心画出Ψ个超球。(注明:画1维是线段,2维数据是圆形,3维是球体,超过3维的就是超球体)。
* 因为数据分布越密的地方取得的样本点也越多,所以这种以样本点画球的方法可以理解为,数据空间中数据点越密的地方画的球会越多而且体积越小,数据分布越稀疏的地方球越少且体积越大,也就是说半径越大的超球越容易被孤立。
2. 从训练数据中随机选择Ψ个点样本点继续按步骤1画超球,重复该步骤 t 次直到我们最后可以得到 t 组超球。每次样本点都是独立从所有原始数据中随机抽样产生。
* 该过程类似iForest建 t 棵 iTree。一组超球就是一个独立训练模型,因为我们训练了 t 组超球模型,所以这个方法是集成学习(ensemble learning).
测试阶段就很容易了,当把一个测试数据放进一组超球中的时候,评估过程如下:
1. 如果该测试数据不在任何一个超球的覆盖范围,那该测试数据的异常值就是1,直接当做孤立点了。
2. 如果该测试数据在某个超球Q的覆盖范围,首先记录超球Q的半径为q,之后再找到离超球Q最近的超球P,记录其半径为p,这个测试数据的异常值为 1 - p/q。
图1展示一组超球(Ψ=3),a和b为测试数据。由于a不在任何超球中,a的异常值为1。b的异常值则是 (1 - 绿色线段长度/蓝色线段长度)。蓝色线段为(包含测试点b的)超球Q的半径,绿色线段为超球P的半径(离超球Q最近的超球为超球P)。
按照该规则,把测试数据分别放进每组超球中进行评估,得出 t 个异常值,然后用他们的平均值做为最后的异常指标。其实异常值就是两个最近超球的半径比值组成,也就是俩个最近邻距离的比值。如果测试数据在某个大半径的超球内,且附近超球半径都比较小,则越容易被孤立,因此异常值也就高了。简而言之,该方法可以把局部密度分布比较稀疏的数据点找出来当做异常。
图2对比了iForest和iNNE在同一个数据集上的得到的异常值分布,可以看到对于三个不同密度分布的高斯球,iNNE都可以把这些球的边缘赋予更高的异常值。但是iForest则只能把最稀的高斯球赋予更高的异常值(树深度越浅则异常值越高)。因此iNNE可以有效的克服iForest无法查找局部异常的缺陷。
关于iNNE的参数设置,t 可以取100或者200固定值,一般越大结果越稳定但是运行时间越长;Ψ则和iForest一样,需要根据不同的数据分布来调整,一般数据里面有多少个高密度区域就取多少,在很多数据上2,32或者128都可以达到很好的效果。
图3展示在不同Ψ的情况下,异常值的分布情况。该测试数据和训练数据一致,都是三个高斯球类似子图(B)分布。可以看到Ψ越大,分辨率越高,越多局部细节都可以展示出来,也就是说这三个高斯的周围的点都会被赋予更高的异常值。但是如果Ψ过高,则会把高斯内部的细微变化也展示出来,反而会把内部的一些正常点当成异常点。
iNNE的思想非常精妙,其对我们研究组后续的工作起到了很关键的奠基作用,并推动了孤立核(Isolation Kernel)的开发工作(1篇AAAI和3篇KDD)。之后我会陆续分享我们研究组最近几年关于孤立机制的其他学术前沿成果。
iNNE源码下载:https://github.com/zhuye88/iNNE
scikit-learn 风格: https://github.com/xhan97/innegithub.com/xhan97/inne
iNNE与其他算法在部分数据上的对比:https://bit.ly/3n2EzPO
同时pyod 中也收录了iNNE: https://github.com/yzhao062/pyodgithub.com/yzhao062/pyod
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
全文完,转载必须注明出处: © Ye Zhu 2022