isolation forest算法思路与实现

来源:互联网 发布:毛妹100能量伤害数据 编辑:程序博客网 时间:2024/06/05 03:16

网上看了下isolation forest,想自己实现,先把思路理清楚:

1 isolation forest是由很多树组成,最后的结果是综合各个tree的结果,在这里叫itree

2 在训练阶段,itree的训练如下

(先给出一些符号及表示的意义:N代表训练数据的总个数,n代表从N个数据中无放回抽样得到的n个数据):

a 对每个itree,用不同的n进行训练,在样本中,随机选一个特征(比如一个训练集的特征向量有20个,随机选择一个,比如第3个),在第3个特征值的所有范围(比如这个特征值的范围是-1到1)随机选一个值,比如选0.5,对样本进行二叉划分,将样本中小于该值的划分到节点的左边,大于等于该值的划分到节点的右边。

  这样就得到了一个分裂条件和左右两边的数据集,然后分别在左右两边的数据集上重复上面的过程,直接达到终止条件。  终止条件有两个,一是数据本身不可再分(只包括一个样本,或者全部样本相同),另外一个树的高度达到log2(n)。  不同于决策树,itree在算法里面已经限制了树的高度。当然不限制也可以,只是算法为了效率考虑,只需要达到log2(n)深度即可。

b 用同样的方法,随机选择的不同样本训练得到多个树,训练阶段就完成了

3 在测试阶段:

a 把所有的itree构建好了以后,就可以对测试数据进行预测了。预测的过程就是把测试数据在每个itree上沿着对应的条件分支往下走,直到达到叶子节点,并记录这过程中经过的路径长度h(x),即从根节点,穿过中间的节点,最后达到叶子节点,所走过的边的数量。

b 最后,将每个树的路径长度h(x)代入下面的公式,计算该测试数据的异常分数:
s(x,n)就是记录x在由n个样本的训练数据构成的iTree的异常指数
s(x,n)就是记录x在由n个样本的训练数据构成的iTree的异常指数
其中,E(h(x))表示测试数据在每个树的高度均值
c(n)=2H(n−1)−(2(n−1)/n),其中H(k)=ln(k)+ξ,ξ为欧拉常数,为0.5772156649
求得的该分数有以下特征:
1.如果分数越接近1,其是异常点的可能性越高;
2.如果分数都比0.5要小,那么基本可以确定为正常数据;
3.如果所有分数都在0.5附近,那么数据不包含明显的异常样本。

算法特点:
在论文中,也比较了其它的常用异常挖掘的算法。比如常用的统计方法,基于分类的方法,和基于聚类的方法,这些传统算法通常是对正常的数据构建一个模型,然后把不符合这个模型的数据,认为是异常数据。而且,这些模型通常为正常数据作优化,而不是为异常数据作优化。而iForest可以显示地找出异常数据,而不用对正常的数据构建模型。
由于异常数据的两个特征(少且不同: few and different)

异常数据只占很少量;
异常数据特征值和正常数据差别很大。

异常数据的这两个特征,确定了算法的理论基础。因此,构建二叉树型结构的时候,异常数据离根更近,而正常数据离根更远,更深。算法为了效率考虑,也限定了树的深度:ceil(log2(n)),这个值近似于树的平均深度,因为只需要关心那些低于平均高度的数据点,而不需要树进行完全生成。
算法只需要两个参数:树的多少与采样的多少。实验发现,在100颗树的时候,路径的长度就已经覆盖得比较好了,因此选100颗也就够了。采样,是为了更好的将正常数据和异常数据分离开来。有别于其它模型,采样数据越多,反面会降低iForest识别异常数据的能力。因为,通常使用256个样本,这也是scikit-learn实现时默认使用的采样数。
由于算法只需要采样数据256条样本,并且对树的深度也有限制,因此,算法对内存要求很低,且处理速度很快,其时间复杂度也是线性的。
不像其它算法,需要计算距离或者密度来寻找异常数据,iForest算法可以很好的处理高维数据和大数据,并且也可以作为在线预测。假设采样为256条,结点最大为511个,假设一个节点占b字节,共使用t颗树,那么需要的内存只有511tb字节,基本上只需要几M到几十M的内存就够了。数据还显示,预测287,748条数据只花了7.6秒。
另外,iForest既能发现群异常数据,也能发现散点异常数据。同时也能处理训练数据中不包含异常数据的情况。

本文的编写参考了以下几个网站:
http://www.jianshu.com/p/1b020e2605e2
http://www.cnblogs.com/fengfenggirl/p/iForest.html
其中第二个网站
对h(x)讲解的更细一点,并讲了一下改进
下面是自己实现的c++代码:
https://github.com/zhly0/isolation-forest
全部总共一个.h文件

0 0
原创粉丝点击