Isolation Forest 孤立森林

孤立森林,不再描述正常的样本点,而是要孤立异常点。

用一个随机超平面对一个数据空间进行切割,切一次可以生成两个子空间。继续随机选取超平面,切割得到的两个子空间,以此循环下去,直到每子空间里面只包含一个数据点为止。密度很高的簇要被切很多次才会停止切割,即每个点都单独存在于一个子空间内,但那些分布稀疏的点,大都很早就停到一个子空间内了。

随机选择m个特征,通过在所选特征的大值和小值之间随机选择一个值来分割数据点。观察值的划分递归地重复,直到所有的观察值被孤立。获得 t 个孤立树后,单棵树的训练就结束了。

用生成的孤立树来评估测试数据了,即计算异常分数 s。对于每个样本 x,需要对其综合计算每棵树的结果,用公式计算异常得分,

from sklearn.datasets import load_iris 
from sklearn.ensemble import IsolationForest

data = load_iris(as_frame=True) 
X,y = data.data,data.target 
df = data.frame 

# 模型训练
iforest = IsolationForest(n_estimators=100, max_samples='auto',  
                          contamination=0.05, max_features=4,  
                          bootstrap=False, n_jobs=-1, random_state=1)

#  fit_predict 函数 训练和预测一起 可以得到模型是否异常的判断,-1为异常,1为正常
df['label'] = iforest.fit_predict(X) 

# 预测 decision_function 可以得出 异常评分
df['scores'] = iforest.decision_function(X)

孤立森林的算法思想:异常样本更容易快速落入叶子结点或者说,异常样本在决策树上,距离根节点更近。异常的点通常是孤立的,例如采用二叉树对数据进行切分,数据点在二叉树中所处的深度反应了该条数据的“疏离”程度,异常点只需较少的切分即可划分出来。

异常的两个特点:异常数据只占很少量、异常数据特征值和正常数据差别很大。 

此时异常被定义为“容易被孤立的离群点 (more likely to be separated)”,即分布稀疏且离密度高的群体较远的点。 在特征空间里,分布稀疏的区域表示事件发生在该区域的概率很低,落在该区域的数据是异常的。

孤立森林是适用于连续数据(Continuous numerical data)的无监督异常检测方法,即不需要有标记的样本来训练,但特征需要是连续的。在孤立森林中,递归地随机分割数据集,直到所有的样本点都是孤立的。在这种随机分割的策略下,异常点通常具有较短的路径

与随机森林由大量决策树组成一样,iForest森林由大量的树组成。iForest中的树叫 isolation tree,简称 iTree,其构建过程比决策树简单,其是完全随机的过程。

假设数据集有 N 条数据,构建一颗 iTree 时,从N条数据中均匀抽样(一般是无放回抽样)出ψ个样本出来,作为这颗树的训练样本。随机选一个特征,并在这个特征的所有值范围内(最小值与最大值之间)随机选一个值,对样本进行二叉划分,将样本中小于该值的划分到节点的左边,大于等于该值的划分到节点的右边,得到了一个分裂条件和左、右两边的数据集,分别在左右两边的数据集上重复上面的过程,直接达到终止条件。

终止条件有两个,一个是数据本身不可再分(只包括一个样本,或者全部样本相同),另外一个是树的高度达到log2(ψ)。不同于决策树,iTree在算法里面已经限制了树的高度。

构建好所有的 iTree,就可以对测数据进行预测;过程就是把测试数据在 iTree 树上沿对应的条件分支往下走,直到达到叶子节点,并记录这过程中经过的路径长度h(x),即从根节点,穿过中间的节点,最后到达叶子节点,所走过的边的数量(path length),将h(x)带入,计算每条待测数据的异常分数(Anomaly Score):

树的平均路径长度为c(n):

H(i)为调和数,可以估计为 ln(i) + 0.5772156649。c(n)为给定样本数为 n 时,路径长度的平均值,用来标准化样本 x 的路径长度h(x),E(h(x))为样本x在一批孤立树中的路径长度的期望。

  1. 如果分数越接近1,其是异常点的可能性越高;
  2. 如果分数都比0.5要小,那么基本可以确定为正常数据;
  3. 如果所有分数都在0.5附近,那么数据不包含明显的异常样本。

训练:从全量数据中抽取样本,随机选择一个特征作为起始节点,并在该特征的最大值和最小值之间随机选择一个值,将样本中小于该取值的数据划到左分支,大于等于该取值的划到右分支。然后,在左右两个分支数据中重复上述步骤,直到满足如下条件:

· 数据不可再分,即:只包含一条数据,或者全部数据相同。

· 二叉树达到限定的最大深度。

预测:计算数据 x 的异常分值,先估算其在每棵树中的路径长度(即深度)。先沿着一棵树从根节点按不同特征的取值从上往下,直到到达某叶子节点。

样本点x的路径长度h(x)为从树的根节点到叶子节点所经过的边的数量。

如包含n个样本的数据集,树的平均路径长度如下:

C(s) = 2 * H(n - 1) - 2 * (n - 1) / n;H(n-1) 可用 ln(n-1) + 0.5772156649 估算。

c(n)为给定样本数为n时,路径长度的平均值,用来标准化样本 x 的路径长度h(x)。

x的异常得分:

从异常分值的公式看,如果数据 x 在多棵树的平均路径长度越短,得分越接近 1,表明 x 越异常;如果数据 x 的平均路径长度越长,得分越接近 0,表示数据 x 越正常;如果 x 在多棵树中的平均路径长度接近整体均值,则打分会在 0.5 附近。

实际应用:

Isolation Forest 有两个参数:二叉树的个数和训练单棵树时抽取样本的数目。

实验表明,当设定为 100 棵树,抽样样本数为 256 条时候,就可以取得不错的效果。

Isolation Forest 是无监督的异常检测算法,不需要黑白标签。

需要注意的是:

(1)如果训练样本中异常样本的比例比较高,违背了异常检测的假设,最终效果会受影响;

(2)异常检测跟具体的应用场景紧密相关,算法检测出的“异常”不一定是实际想要的。比如,在识别虚假交易时,异常的交易未必就是虚假的交易;所有在特征选择时需要过滤不太相关的特征,以免识别出一些不太相关的“异常”。

参考:

机器学习-异常检测算法(一):Isolation Forest - 知乎 (zhihu.com)

孤立森林(Isolation Forest)_extremebingo的博客-CSDN博客_孤立森林

浅谈孤立森林算法 - 知乎 (zhihu.com)

sklearn.ensemble.IsolationForest — scikit-learn 1.1.dev0 documentation

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值