异常检测iforest算法介绍

异常检测算法iforest

异常检测介绍

异常检测又被称为是“离群点检测”,是机器学习领域跟现实紧密联系的、有广泛需求的一类问题。如网络安全中的攻击检测和流量异常分析,金融机构则用于挖掘出欺诈行为。

什么是异常,并没有标准答案,通常因具体应用场景而异。

通常异常有两个假说:

1)异常数据跟样本中大多数数据不太一样;

2)异常数据在整体样本中占的比例较小。

对于异常检测而言,最直接的做法是利用各种统计的、距离的、密度的量化指标去描述数据样本跟其他样本的疏离程度。而iforest算法的想法要巧妙的多,它尝试直接去刻画数据的“梳离”程度,而不是借助其他的量化指标。该算法因为简单、高效,在学术界和工业界有不错的声望。

iforest算法介绍

我们先举个例子来说明算法的基本思想。假设现有一组数据,我们要对这组数据进行随机切分,希望把“星星”区分出来。具体的,确定一个维度的特征,并在最大值和最小值之间随机选择一个值x,然后按照小于x和大于等于x可以把数据分成左右两组。然后再随机按照某个维度的取值把左右两组的数据进行细分,重复上述步骤,直到无法细分,直到数据不可再分。直观上,异常数据由于跟其他数据较为梳离,可能需要较少的切分就可以把它们单独划分出来,而正常数据恰恰相反,这就是iforest算法的核心原理。

在这里插入图片描述

模型训练

iforest算法是一个基于集成学习的快速异常检测算法,既不需要数学模型也不需要有标签的训练,是具有线性时间复杂度和高精准度。该算法采用二叉树对数据进行切分,数据点在二叉树中所处的深度反映了该条数据的“梳离”程度。整个算法大致可以分为两个步骤:由于切割是随机的,所以需要集成学习的方法来得到一个收敛值,即反复从头开始切,然后平均每次切的结果。iforest由t个isolation tree孤立树组成,每个itree是一个二叉树结构,其实现步骤如下:

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

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

2) 二叉树达到最大深度阈值。

模型预测

计算数据x的异常分值时,先要估算它在每棵树itree中的路径长度(深度)。具体的,先沿着一棵树itree,从根节点开始按不同特征的取值从上往下,直到到达某叶子结点。假设itree的训练样本中同样落在x所在叶子结点的样本数为T.size,则数据x在这棵树itree上的路径长度为h(x),可以用下面的公式计算:

h(x) = e + C(T.size)

其中e表示数据x从itree的根节点到叶子结点过程中所经历的边的数目,C(T.size)可以认为是一个修正值,表示一颗用T.size条样本数据构建的二叉树的平均路径长度。C(n)=2H(n-1)-2(n-1)/n

其中,H(n-1) 可用 ln(n-1)+0.5772156649 估算,这里的常数是欧拉常数。 数据x最终的异常分综合了多棵树的结果:
在这里插入图片描述
从异常分值的公式看,如果数据x在多棵树中的平均路径长度越短,得分越接近1,表明数据x越异常;如果数据x在多棵树中的平均路径长度越长,得分越接近0,表示数据x越正常;如果数据x在多棵树中的平均路径长度接近整体均值,则打分会在0.5附近。

算法特点

  1. iforest算法具有线性的时间复杂度。因为是ensemble的方法,所以可以在海量数据上运行。通常树的数量越多,算法越稳定。由于每棵树都是相互独立生成的,因此可以在部署在大规模分布式系统上来加速运行。

  2. iforest不适用于特别高维的数据。由于每次切数据空间都是随机选取一个维度,建完树后仍然有大量的维度信息没有被使用,导致算法可靠性降低。高维数据还可能存在大量噪音维度或者无关维度,影响树的构建。对这类数据,建议使用子空间异常检测技术。

  3. iforest仅对全局稀疏点敏感,不擅长处理局部稀疏点。目前已有改进算法

  4. iforest推动了重心估计理论的发展,目前在分类聚类和异常检测中都有显著的效果,发表了大量的期刊和文章。

  5. iforest算法属于无监督的异常检测算法,在实际应用中,不需要黑白标签。需要注意的是:1)如果训练样本中异常样本的比例较高,违背了先前提到的异常检测的基本假设,最终的效果可能会受到影响;2)异常检测跟具体应用场景关系密切,算法检测出的异常并不一定是我们实际想要的。比如,在识别虚假交易时,异常的交易未必就是虚假的交易。所以,在特征选择时,可能需要过滤不太相关的特征,避免识别出一些不太相关的“异常”。

python的iforest算法参数介绍

class sklearn.ensemble.IsolationForest(n_estimators=100, max_samples=’auto’, contamination=’auto’, max_features=1.0, bootstrap=False, n_jobs=None, behaviour=’deprecated’, random_state=None, verbose=0, warm_start=False)

  1. n_estimators: 默认为100,配置iTree树的多少
  2. max_samples: int or float, optional (default=”auto”) 每次建树随机选取的样本数
  • If int, then draw max_samples samples.
  • If float, then draw max_samples * X.shape[0] samples.
  • If “auto”, then max_samples=min(256, n_samples).
  1. max_features: 默认为全部特征,对高维数据,可以只选取部分特征
  2. contamination:默认为auto,数据集中异常样本的比例; 取值可以是“auto", 也可是float小数;
  • If ‘auto’, the threshold is determined as in the original paper.
  • If float, the contamination should be in the range [0, 0.5].

代码如下:

#coding:utf-8
import numpy as np
from sklearn.ensemble import IsolationForest

if __name__ == "__main__":
	X_train = np.random.rand(1000,3)#随机生成1000个3维的样本数据
	params = {
            'n_estimators': 100,
            'contamination': 0.01,
            'max_samples': 256,
    }
    iforest = IsolationForest(**params)
    iforest.fit(X_train)
    y_pred = iforest.predict(X_train)
    print y_pred

  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值