精华内容
下载资源
问答
  • 孤立森林异常检测
    2020-11-21 12:01:14

    3edd849a10a9822e67aefe565b16d36c.gif

    向AI转型的程序员都关注了这个号👇👇👇

    机器学习AI算法工程  公众号:datayx

    在压力测试和性能分析过程中,通常有两种情形会导致测试结果不准确:

    • 一是由于 JMeter 和 LoadRunner 等工具在启动多线程是有一个爬坡过程,通常需要1-10秒钟左右,这个时间也不会很长。但在这个过程由于线程数量不定,导致了测试数据的可靠性降低。

    • 二是由于现实测试中通常会存在网络异常的情形,极少量的异常值会大大影响对被测对象的性能评估。

    在上述场景中,异常的数据与整个测试数据样本相比是很少的一部分,常见的分类算法例如:SVM、逻辑回归等都不合适。而孤立森林算法恰好非常适合上述场景,首先测试数据具备一定的连续性,其次异常数据具备显著的离群特征,最后异常数据的产生是小概率事件,因此,孤立森林算法在网络安全、交易欺诈、疾病监测等方面也有着广泛的应用。

    算法简介

    孤立森林算法属非监督学习算法,不需要定义参数模型和进行历史训练样本,通过采用多次迭代的方式构建二叉搜索树(Binary Search Tree),然后将这些二叉树组成森林,默认二叉搜索树的高度为 8,每 100 棵树组成一个森林,每次最多生成 256 个森林。算法主要构建思想如下:

    • 构建二叉树 iTree,首先从训练数据中随机选择 X 个样本,若 iTree 已经 达到限定高度或者仅剩一个样本,则算法收敛。否则,递归构建二叉搜索树,将小于当前根结点的样本放入左子结点,将大于当前根结点的样本放入右子结点。

    97a8b5fa2f9f51d105e41f45a34c4442.png

    • 构建二叉树森林 iForest,根据样本数据容量迭代重复步骤(1)过程创建二叉搜索树 iTree,并将生成的 iTree 组成二叉树森林。

    • 计算森林中二叉树的路径长度,当二叉树森林 iForest 构建完成后,就可以对样本进行预测了,预测过程就是对二叉搜索树进行递归中序遍历,记录从根结点到叶子结点的路径长度 h(x)。

    c7b749dbb78bc6875c8a02897f46e1e8.png

    • 计算离群点偏离值,当森林中所有样本路径长度 h(x) 计算完毕后,通过运用统计学的方法计算得出所有数据样本期望值 E(h(x)) 和方差 S(h(x)),进而得到偏离期望和方差的异常数据点。

    常见机器学习聚类算法通常根据空间距离或者密度来寻找异常数据,孤立森林算法独辟蹊径,采用构建二叉树森林再进行中序遍历计算叶子结点平均高度的方式来寻找异常数据,算法实现了对于海量数据的异常检测仅需 O(n) 的线性时间复杂度,能够在短暂的批处理时间间隔内有效检测出离群数据点。

    代码获取方式

    关注微信公众号 datayx  然后回复 异常检测  即可获取。

    AI项目体验地址 https://loveai.tech

    更多相关内容
  • 孤立森林异常检测

    2019-04-07 09:54:31
    孤立森林异常检测,Outlier Detection with Isolation Forest 。
  • 本项目应用孤立森林异常检测算法,过滤JMeter 在对Splunk 数据库进行压力测试过程中产生的异常性能数据。 背景 在压力测试和性能分析过程中,通常有两种情形会导致测试结果不准确: 一是由于JMeter 和LoadRunner 等...
  • 孤立森林(isolation Forest)算法,2008年由刘飞、周志华等提出,算法不借助类似距离、密度等指标去描述样本与其他样本的差异,而是直接去刻画所谓的疏离程度(isolation),因此该算法简单、高效,在工业界应用较多。...

    孤立森林(isolation Forest)算法,2008年由刘飞、周志华等提出,算法不借助类似距离、密度等指标去描述样本与其他样本的差异,而是直接去刻画所谓的疏离程度(isolation),因此该算法简单、高效,在工业界应用较多。

    Isolation Forest算法的逻辑很直观,算法采用二叉树对数据进行分裂,样本选取、特征选取、分裂点选取都采用随机化的方式。如果某个样本是异常值,可能需要很少次数就可以切分出来

    推荐文章

    我们开始正文吧。

    一、理解孤立森林

    再用一个例子来说明孤立森林的思想:假设现在有一组一维数据(如下图),我们要对这组数据进行切分,目的是把点A和 B单独切分出来,先在最大,值和最小值之间随机选择一个值 X,然后按照 <X 和 >=X 可以把数据分成左右两组,在这两组数据中分别重复这个步骤,直到数据不可再分。

    点B跟其他数据比较疏离,可能用很少的次数就可以把它切分出来,点 A 跟其他数据点聚在一起,可能需要更多的次数才能把它切分出来。

    那么从统计意义上来说,相对聚集的点需要分割的次数较多,比较孤立的点需要的分割次数少,孤立森林就是利用分割的次数来度量一个点是聚集的(正常)还是孤立的(异常)。

    图片

    直观上来看,我们可以发现,那些密度很高的簇要被切很多次才会停止切割,即每个点都单独存在于一个子空间内,但那些分布稀疏的点,大都很早就停到一个子空间内了。

    先sklearn的孤立森林算法,搞个例子看看大概的算法流程和结果,模拟上面的数据构造一个数据集。异常检测的工具还是很多的,主要有以下几个,我们这次选用的是Scikit-Learn进行实验。

    1、PyOD:超过30种算法,从经典模型到深度学习模型一应俱全,和sklearn的用法一致

    2、Scikit-Learn:包含了4种常见的算法,简单易用

    3、TODS:与PyOD类似,包含多种时间序列上的异常检测算法

    数据集是月工资的,单位为万,看看哪些是异常的。

    图片

    # 加载模型所需要的的包
    import numpy   as np
    import pandas  as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    from sklearn.ensemble import IsolationForest
    
    # 构造一个数据集,只包含一列数据,假如都是月薪数据,有些可能是错的
    df = pd.DataFrame({'salary':[4,1,4,5,3,6,2,5,6,2,5,7,1,8,12,33,4,7,6,7,8,55]})
    
    #构建模型 ,n_estimators=100 ,构建100颗树
    model = IsolationForest(n_estimators=100, 
                          max_samples='auto', 
                          contamination=float(0.1),
                          max_features=1.0)
    # 训练模型
    model.fit(df[['salary']])
    
    # 预测 decision_function 可以得出 异常评分
    df['scores']  = model.decision_function(df[['salary']])
    
    #  predict() 函数 可以得到模型是否异常的判断,-1为异常,1为正常
    df['anomaly'] = model.predict(df[['salary']])
    print(df)
    salary    scores  anomaly
    0        4  0.212235        1
    1        1  0.095133        1
    2        4  0.212235        1
    3        5  0.225169        1
    4        3  0.156926        1
    5        6  0.227608        1
    6        2  0.153989        1
    7        5  0.225169        1
    8        6  0.227608        1
    9        2  0.153989        1
    10       5  0.225169        1
    11       7  0.212329        1
    12       1  0.095133        1
    13       8  0.170615        1
    14      12 -0.010570       -1
    15      33 -0.116637       -1
    16       4  0.212235        1
    17       7  0.212329        1
    18       6  0.227608        1
    19       7  0.212329        1
    20       8  0.170615        1
    21      55 -0.183576       -1
    

    我们可以看到,发现了三个异常的数据,和我们认知差不多,都是比较高的,并且异常值越大,异常分scores就越大,比如那个月薪55万的,不是变态就是数据错了。

    图片

    其实到此,你基本上就会用这个算法了,但是,我们还需要更深入的理解的话,继续往下看。

    二、孤立森林算法详解

    孤立森林与随机森林非常相似,它是基于给定数据集的决策树集成而建立的,然而,也有一些区别,孤立森林将异常识别为树上平均路径较短的观测结果,每个孤立树都应用了一个过程:

    随机选择m个特征,通过在所选特征的最大值和最小值之间随机选择一个值来分割数据点。观察值的划分递归地重复,直到所有的观察值被孤立。

    图片

    图片

    我们看看更加明细的训练+预测过程

    1、前提假设

    异常样本不能占比太高

    异常样本和正常样本差异较大

    2、算法思想

    异常样本更容易快速落入叶子结点或者说,异常样本在决策树上,距离根节点更近

    3、算法训练

    1)训练逻辑

    从原始数据中,有放回或者不放回的抽取部分样本,选取部分特征,构建一颗二叉树(iTree即Isolation Tree),利用集成学习的思想,多次抽取样本和特征,完成多棵iTree的构建。

    2)iTree停止条件

    树达到指定的高度/深度,或者数据不可再分。

    3)算法伪代码如下

    图片

    图片

    4)几个小问题:

    • 树的最大深度=ceiling(log(subsimpleSize)),paper里说自动指定,sklearn也是在代码中写死:max_depth = int(np.ceil(np.log2(max(max_samples, 2))))这个值接近树的平均深度,我们只关注那些小于平均深度的异常值,所以无需让树完全生长

    • Sub-sampling size,每次抽取的样本数,建议256即可,大于256,性能上不会有大的提升

    • Number of tree,建议100,如果特征和样本规模比较大,可以适当增加

    4、算法预测

    1)PathLength计算逻辑

    类似二分类模型,预测时可输出P ( y = 1 ) P(y=1)P(y=1),iforest最终也可以输出一个异常得分。很容易想到用该样本落入叶子结点时,split的次数(即样本落入叶子结点经过的边)作为衡量指标,对于t tt棵树,取平均即可。先看PathLength的计算逻辑:

    图片

    2)PathLength计算公式如下:

    图片

    其中e为样本x xx从树的根节点到叶节点的过程中经历的边的个数,即split次数。T.size表示和样本x同在一个叶子结点样本的个数,C(T.size)可以看做一个修正值,表示T.size个样本构建一个二叉树的平均路径长度,c(n)计算公式如下:

    图片

    其中,0.5772156649为欧拉常数

    3)为何加入这一修正值?

    由于树的深度设置为ceiling(log(subsimpleSize)) ,所以可能大部分样本的PathLength都比较接近,而如果叶子结点的样本数越多,该样本是异常值的概率也较低(基于fewAndDifferent的假设)。另外c(n)是单调递增的,总之,加了修正,使得异常和正常样本的PathLength差异更大,可以简单的理解,如果样本快速落入叶子结点,并且该叶子结点的样本数较少,那么其为异常样本的可能性较大。

    5、计算异常分

    样本落入叶子结点经过的边数(split次数),除了和样本本身有关,也和limit length和抽样的样本子集有关系。这里,作者采用归一化的方式,把split length的值域映射到0-1之间。具体公式如下:

    图片

    其 中

    h(x): 为样本在iTree上的PathLength

    E(h(x)): 为样本在t棵iTree的PathLength的均值

    c(n): 为n个样本构建一个BST二叉树的平均路径长度,为什么要算这个,因为iTree和BST的结构的等价性, 标准化借鉴BST(Binary Search Tree)去估计路径的平均长度c(n)。

    上述公式,指数部分值域为(−∞,0),因此s值域为(0,1)。当PathLength越小,s越接近1,此时样本为异常值的概率越大。

    我们知道了E(h(x))是根节点外部节点x的**路径长度h(x)**的平均值,而c(n)是给定n的h(x)的平均值,用于规范化h(x)。有三种可能的情况:

    当E(h(x))= c(n), s(x,n)=1/2

    当E(h(x))-> 0, s(x,n)= 1

    当E(h(x))-> n-1,s(x,n)= 0

    当观测的得分接近1时,路径长度非常小,那么数据点很容易被孤立,我们有一个异常。当观测值小于0.5时,路径长度就会变大,然后我们就得到了一个正常的数据点。如果所有的观察结果都有0.5左右的异常值,那么整个样本就没有任何异常。

    然后,孤立森林可以通过计算每棵树的异常得分,并在孤立树之间进行平均,从而在比正常观测更少的步骤中隔离异常。事实上,得分较高的异常值路径长度较低。

    注: scikit-learn的隔离森林引入了异常分数的修改,异常值由负的分数表示,而正的分数意味着是正常的。

    图片

    上图就是对子样本进行切割训练的过程,左图的 xi 处于密度较高的区域,因此切割了十几次才被分到了单独的子空间,而右图的 x0 落在边缘分布较稀疏的区域,只经历了四次切分就被 “孤立” 了。

    四、孤立森林参数

    我们使用sklearn中的孤立森林,进行参数调节讲解,一般任务默认参数即可,算法API地址:

    https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html#sklearn.ensemble.IsolationForest

    1、基本用法

    sklearn.ensemble.IsolationForest(
                  *, 
                  n_estimators=100, 
                  max_samples='auto', 
                  contamination='auto', 
                  max_features=1.0, 
                  bootstrap=False, 
                  n_jobs=None, 
                  random_state=None, 
                  verbose=0, 
                  warm_start=False)
    

    2、参数详解

    n_estimators : int, optional (default=100)

    iTree的个数,指定该森林中生成的随机树数量,默认为100个

    max_samples : int or float, optional (default=”auto”)

    构建子树的样本数,整数为个数,小数为占全集的比例,用来训练随机数的样本数量,即子采样的大小

    如果设置的是一个int常数,那么就会从总样本X拉取max_samples个样本来生成一棵树iTree

    如果设置的是一个float浮点数,那么就会从总样本X拉取max_samples * X.shape[0]个样本,X.shape[0]表示总样本个数

    如果设置的是"auto",则max_samples=min(256, n_samples),n_samples即总样本的数量

    如果max_samples值比提供的总样本数量还大的话,所有的样本都会用来构造数,意思就是没有采样了,构造的n_estimators棵iTree使用的样本都是一样的,即所有的样本

    contamination : float in (0., 0.5), optional (default=0.1)

    取值范围为(0., 0.5),表示异常数据占给定的数据集的比例,数据集中污染的数量,其实就是训练数据中异常数据的数量,比如数据集异常数据的比例。定义该参数值的作用是在决策函数中定义阈值。如果设置为’auto’,则决策函数的阈值就和论文中定义的一样

    max_features : int or float, optional (default=1.0)

    构建每个子树的特征数,整数位个数,小数为占全特征的比例,指定从总样本X中抽取来训练每棵树iTree的属性的数量,默认只使用一个属性

    如果设置为int整数,则抽取max_features个属性

    如果是float浮点数,则抽取max_features * X.shape[1]个属性

    bootstrap : boolean, optional (default=False)
    采样是有放回还是无放回,如果为True,则各个树可放回地对训练数据进行采样。如果为False,则执行不放回的采样。

    **n_jobs 😗*int or None, optional (default=None)
    在运行fit()和predict()函数时并行运行的作业数量。除了在joblib.parallel_backend上下文的情况下,None表示为1。设置为-1则表示使用所有可用的处理器

    random_state : int, RandomState instance or None, optional (default=None)

    每次训练的随机性

    如果设置为int常数,则该random_state参数值是用于随机数生成器的种子

    如果设置为RandomState实例,则该random_state就是一个随机数生成器

    如果设置为None,该随机数生成器就是使用在np.random中的RandomState实例

    verbose : int, optional (default=0)

    训练中打印日志的详细程度,数值越大越详细

    warm_start : bool, optional (default=False)
    当设置为True时,重用上一次调用的结果去fit,添加更多的树到上一次的森林1集合中;否则就fit一整个新的森林

    3、属性

    base_estimator_:he child estimator template used to create the collection of fitted sub-estimators.

    estimators_list of ExtraTreeRegressor instances** The collection of fitted sub-estimators.

    estimators_:features_list of ndarray_ The subset of drawn features for each base estimator.

    estimators_samples__:list of ndarra The subset of drawn samples for each base estimator.

    max_samples_:The actual number of samples

    n_features__:DEPRECATED: Attribute n_features_ was deprecated in version 1.0 and will be removed in 1.2.

    n_features_in_:Number of features seen during fit.

    feature_names_in_:Names of features seen during fit. Defined only when X has feature names that are all strings

    4、方 法

    fit(X[, y, sample_weight]):训练模型

    decision_function(X):返回平均异常分数

    predict(X):预测模型返回1或者-1

    fit_predict(X[, y]):训练-预测模型一起完成

    get_params([deep]):Get parameters for this estimator.

    score_samples(X):Opposite of the anomaly score defined in the original paper.

    set_params(**params):Set the parameters of this estimator.

    五、应用案例

    1、模型训练

    有了对原理的了解,算法参数的介绍,我们就可以进行应用了,为了方便大家跑通,没有引入外部数据,直接使用简单的内置的iris 数据集作为案例。

    import plotly.express as px 
    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 
    df.head()
    sepal length (cm)  sepal width (cm)  ...  petal width (cm)  target
    0                5.1               3.5  ...               0.2       0
    1                4.9               3.0  ...               0.2       0
    2                4.7               3.2  ...               0.2       0
    3                4.6               3.1  ...               0.2       0
    4                5.0               3.6  ...               0.2       0
    
    [5 rows x 5 columns]
    
    # 模型训练
    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) 
    
    df
         sepal length (cm)  sepal width (cm)  ...  anomaly_label    scores
    0                  5.1               3.5  ...              1  0.177972
    1                  4.9               3.0  ...              1  0.148945
    2                  4.7               3.2  ...              1  0.129540
    3                  4.6               3.1  ...              1  0.119440
    4                  5.0               3.6  ...              1  0.169537
    ..                 ...               ...  ...            ...       ...
    145                6.7               3.0  ...              1  0.131967
    146                6.3               2.5  ...              1  0.122848
    147                6.5               3.0  ...              1  0.160523
    148                6.2               3.4  ...              1  0.073536
    149                5.9               3.0  ...              1  0.169074
    
    [150 rows x 7 columns]
    
    # 我们看看哪些预测为异常的
    df[df.label==-1]
     sepal length (cm)  sepal width (cm)  ...  anomaly_label    scores
    13                 4.3               3.0  ...             -1 -0.039104
    15                 5.7               4.4  ...             -1 -0.003895
    41                 4.5               2.3  ...             -1 -0.038639
    60                 5.0               2.0  ...             -1 -0.008813
    109                7.2               3.6  ...             -1 -0.037663
    117                7.7               3.8  ...             -1 -0.046873
    118                7.7               2.6  ...             -1 -0.055233
    131                7.9               3.8  ...             -1 -0.064742
    
    [8 rows x 7 columns]
    

    2、模型可视化

    我们可视化看看预测的结果,看看异常类型和非异常类型的直方图分布,这里最好用notebook画,其他地方画不一定能显示出来。

    df['anomaly'] = df['label'].apply(lambda x: 'outlier' if x==-1  else 'inlier') 
    fig = px.histogram(df,x='scores',color='anomaly') 
    fig.show()
    

    图片

    在看看3D图,红色的是比较异常的,可以看看到,还是比较准确的,但是由于这个数据本身差异性就不大,所以没那么明显,实际业务中的异常数据,一般都具有更大的差异化。

    fig = px.scatter_3d(df,x='petal width (cm)', 
                           y='sepal length (cm)', 
                           z='sepal width (cm)', 
                           color='anomaly') 
    fig.show()
    

    图片

    六、结 论

    1、每棵树随机采样独立生成,所以孤立森林具有很好的处理大数据的能力和速度,可以进行并行化处理,因此可部署在大规模分布式系统上来加速运算。

    2、通常树的数量越多,算法越稳定,树的深度不易过深,但不是越多越好,通过下图可以发现,当t>=100后,划分上文提到的xi和x0的平均路径长度都已经收敛了,故因此论文中推荐t设置为100。

    图片

    3、不同于 KMeans、DBSCAN 等算法,孤立森林不需要计算有关距离、密度的指标,可大幅度提升速度,减小系统开销;

    4、为什么需要对树的高度做限制?之所以对树的高度做限制,是因为我们只关心路径长度较短的点,它们更可能是异常点,而并不关心那些路径很长的正常点

    技术交流

    欢迎转载、收藏、有所收获点赞支持一下!

    在这里插入图片描述

    目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

    • 方式①、发送如下图片至微信,长按识别,后台回复:加群;
    • 方式②、添加微信号:dkl88191,备注:来自CSDN
    • 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

    长按关注

    展开全文
  • 孤立森林异常检测之入门

    千次阅读 2019-03-04 11:45:20
    iForest (Isolation Forest)孤立森林 是一个基于Ensemble的快速异常检测方法,具有线性时间复杂度和高精准度,是符合大数据处理要求的state-of-the-art算法(详见新版教材“Outlier Analysis”第5和第6章 PDF)。...

    iForest (Isolation Forest)孤立森林 是一个基于Ensemble的快速异常检测方法,具有线性时间复杂度和高精准度,是符合大数据处理要求的state-of-the-art算法(详见新版教材“Outlier Analysis”第5和第6章 PDF)。其可以用于网络安全中的攻击检测,金融交易欺诈检测,疾病侦测,和噪声数据过滤等。本文将通俗解释实现方法和日常运用,即无需深厚的数学功底。

    首先,我们先了解下该算法的动机。目前学术界对异常(anomaly detection)的定义有很多种,iForest 适用与连续数据(Continuous numerical data)的异常检测,将异常定义为“容易被孤立的离群点 (more likely to be separated)”——可以理解为分布稀疏且离密度高的群体较远的点。用统计学来解释,在数据空间里面,分布稀疏的区域表示数据发生在此区域的概率很低,因而可以认为落在这些区域里的数据是异常的。一个例子如下(来源):

    黑色的点为异常点,白色点为正常的点(在一个簇中)。iForest检测到的异常边界为红色,它可以正确地检测到所有黑点异常点。

    iForest属于Non-parametric和unsupervised的方法,即不用定义数学模型也不需要有标记的训练。对于如何查找哪些点是否容易被孤立(isolated),iForest使用了一套非常高效的策略。假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。上图里面黑色的点就很容易被切几次就停到一个子空间,而白色点聚集的地方可以切很多次才停止。

    怎么来切这个数据空间是iForest的设计核心思想,本文仅介绍最基本的方法。由于切割是随机的,所以需要用ensemble的方法来得到一个收敛值(蒙特卡洛方法),即反复从头开始切,然后平均每次切的结果。iForest 由t个iTree(Isolation Tree)孤立树 组成,每个iTree是一个二叉树结构,其实现步骤如下:

    1. 从训练数据中随机选择Ψ个点样本点作为subsample,放入树的根节点。

    2. 随机指定一个维度(attribute),在当前节点数据中随机产生一个切割点p——切割点产生于当前节点数据中指定维度的最大值和最小值之间。

    3. 以此切割点生成了一个超平面,然后将当前节点数据空间划分为2个子空间:把指定维度里小于p的数据放在当前节点的左孩子,把大于等于p的数据放在当前节点的右孩子。

    4. 在孩子节点中递归步骤2和3,不断构造新的孩子节点,直到 孩子节点中只有一个数据(无法再继续切割) 或 孩子节点已到达限定高度 。

    获得t个iTree之后,iForest 训练就结束,然后我们可以用生成的iForest来评估测试数据了。对于一个训练数据x,我们令其遍历每一棵iTree,然后计算x最终落在每个树第几层(x在树的高度)。然后我们可以得出x在每棵树的高度平均值,即 the average path length over t iTrees。*值得注意的是,如果x落在一个节点中含多个训练数据,可以使用一个公式来修正x的高度计算,详细公式推导见原论文

    获得每个测试数据的average path length后,我们可以设置一个阈值(边界值),average path length 低于此阈值的测试数据即为异常。也就是说 “iForest identifies anomalies as instances having the shortest average path lengths in a dataset ”(异常在这些树中只有很短的平均高度). *值得注意的是,论文中对树的高度做了归一化,并得出一个0到1的数值,即越短的高度越接近1(异常的可能性越高)。

    4个测试样本遍历一棵iTree的例子如下:

     

    b和c的高度为3,a的高度是2,d的高度是1。

    可以看到d最有可能是异常,因为其最早就被孤立(isolated)了。

     


    生成一棵iTree的详细算法(来源):

    X为独立抽取的训练样本。参数e的初始值为0。h是树可以生成的最大高度。

    iForest算法默认参数设置如下:

    subsample size: 256

    Tree height: 8

    Number of trees: 100

    通俗解释就是——建100棵iTree,每棵iTree最高8层,且每棵iTree都是独立随机选择256个数据样本建成。


    个人见解:

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

    2. iForest不适用于特别高维的数据。由于每次切数据空间都是随机选取一个维度,建完树后仍然有大量的维度信息没有被使用,导致算法可靠性降低。高维空间还可能存在大量噪音维度或无关维度(irrelevant attributes),影响树的构建。对这类数据,建议使用子空间异常检测(Subspace Anomaly Detection)技术。此外,切割平面默认是axis-parallel的,也可以随机生成各种角度的切割平面,详见“On Detecting Clustered Anomalies Using SCiForest”。

    3. iForest仅对Global Anomaly 敏感,即全局稀疏点敏感,不擅长处理局部的相对稀疏点 (Local Anomaly)。目前已有改进方法发表于PAKDD,详见“Improving iForest with Relative Mass”。

    4. iForest推动了重心估计(Mass Estimation)理论发展,目前在分类聚类和异常检测中都取得显著效果,发表于各大顶级数据挖掘会议和期刊(如SIGKDD,ICDM,ECML)。


    参考文献

    iForest 是刘飞博士(Fei Tony Liu)在莫纳什大学就读期间由陈开明(Kai-Ming Ting)教授和周志华(Zhi-Hua Zhou)教授指导发表的。第一个版本是在2008年ICDM上,获得年度最佳论文,扩充版本发表与TKDD。

    Liu, Fei Tony, Kai Ming Ting, and Zhi-Hua Zhou. "Isolation forest."Data Mining, 2008. ICDM'08. Eighth IEEE International Conference on. IEEE, 2008.

    Liu, Fei Tony, Kai Ming Ting, and Zhi-Hua Zhou. "Isolation-based anomaly detection."ACM Transactions on Knowledge Discovery from Data (TKDD)6.1 (2012): 3.

    论文下载

    http://cs.nju.edu.cn/zhouzh/zhouzh.files/publication/icdm08b.pdf

    http://cs.nju.edu.cn/zhouzh/zhouzh.files/publication/tkdd11.pdf

    源码下载

    R语言    https://sourceforge.net/projects/iforest/

    Python语言    http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html

    Java语言    http://weka.sourceforge.net/packageMetaData/isolationForest/index.html

    Matlab语言 https://github.com/zhuye88/iForest



    作者:YeZhu
    链接:https://www.jianshu.com/p/5af3c66e0410
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    展开全文
  • 异常检测 (anomaly detection) 或者又被称为“离群点检测” (outlier detection),是机器学习研究领域中跟现实紧密联系、有广泛应用需求的一类问题。但是,什么是异常,并没有标准答案,通常因具体应用场景而异。...

    异常检测 (anomaly detection)

    或者又被称为“离群点检测” (outlier detection),是机器学习研究领域中跟现实紧密联系、有广泛应用需求的一类问题。但是,什么是异常,并没有标准答案,通常因具体应用场景而异。如果要给一个比较通用的定义,很多文献通常会引用 Hawkins 在文章开头那段话。很多后来者的说法,跟这个定义大同小异。这些定义虽然笼统,但其实暗含了认定“异常”的两个标准或者说假设:

    1. 异常数据跟样本中大多数数据不太一样。

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

    简介

    Forest (Isolation Forest)孤立森林 是一个基于Ensemble的快速异常检测方法,具有线性时间复杂度和高精准度。其可以用于网络安全中的攻击检测,金融交易欺诈检测,疾病侦测,和噪声数据过滤等。

    动机

    目前学术界对异常的定义有很多种,iForest 适用与连续数据的异常检测,将异常定义为“容易被孤立的离群点——可以理解为分布稀疏且离密度高的群体较远的点。用统计学来解释,在数据空间里面,分布稀疏的区域表示数据发生在此区域的概率很低,因而可以认为落在这些区域里的数据是异常的。

    iForest属于Non-parametric和unsupervised的方法,即不用定义数学模型也不需要有标记的训练。对于如何查找哪些点是否容易被孤立(isolated),

     

     

    算法介绍

    我们先用一个简单的例子来说明 Isolation Forest 的基本想法。假设现在有一组一维数据(如下图所示),我们要对这组数据进行随机切分,希望可以把点 A 和点 B 单独切分出来。具体的,我们先在最大值和最小值之间随机选择一个值 x,然后按照 <x 和 >=x 可以把数据分成左右两组。然后,在这两组数据中分别重复这个步骤,直到数据不可再分。显然,点 B 跟其他数据比较疏离,可能用很少的次数就可以把它切分出来;点 A 跟其他数据点聚在一起,可能需要更多的次数才能把它切分出来。

     

    我们把数据从一维扩展到两维。同样的,我们沿着两个坐标轴进行随机切分,尝试把下图中的点A'和点B'分别切分出来。我们先随机选择一个特征维度,在这个特征的最大值和最小值之间随机选择一个值,按照跟特征值的大小关系将数据进行左右切分。然后,在左右两组数据中,我们重复上述步骤,再随机的按某个特征维度的取值把数据进行细分,直到无法细分,即:只剩下一个数据点,或者剩下的数据全部相同。跟先前的例子类似,直观上,点B'跟其他数据点比较疏离,可能只需要很少的几次操作就可以将它细分出来;点A'需要的切分次数可能会更多一些。

    按照先前提到的关于“异常”的两个假设,一般情况下,在上面的例子中,点B和点B' 由于跟其他数据隔的比较远,会被认为是异常数据,而点A和点A' 会被认为是正常数据。直观上,异常数据由于跟其他数据点较为疏离,可能需要较少几次切分就可以将它们单独划分出来,而正常数据恰恰相反。这其实正是 Isolation Forest(IF)的核心概念。IF采用二叉树去对数据进行切分,数据点在二叉树中所处的深度反应了该条数据的“疏离”程度。整个算法大致可以分为两步:

    1. 训练:抽取多个样本,构建多棵二叉树(Isolation Tree,即 iTree);

    2. 预测:综合多棵二叉树的结果,计算每个数据点的异常分值。

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

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

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

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

     

    公式中,e 表示数据 x 从 iTree 的根节点到叶节点过程中经过的边的数目,C(T.size) 可以认为是一个修正值,它表示在一棵用 T.size 条样本数据构建的二叉树的平均路径长度。一般的,C(n) 的计算公式如下:

    其中,H(n-1) 可用 ln(n-1)+0.5772156649 估算,这里的常数是欧拉常数。数据 x 最终的异常分值 Score(x) 综合了多棵 iTree 的结果:

    公式中,E(h(x)) 表示数据 x 在多棵 iTree 的路径长度的均值, 表示单棵 iTree 的训练样本的样本数, 表示用条数据构建的二叉树的平均路径长度,它在这里主要用来做归一化。

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

    算法注意点

    Isolation Forest 算法主要有两个参数:一个是二叉树的个数;另一个是训练单棵 iTree 时候抽取样本的数目。实验表明,当设定为 100 棵树,抽样样本数为 256 条时候,IF 在大多数情况下就已经可以取得不错的效果。这也体现了算法的简单、高效。

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

     

     

    代码块

    # 调用模块
    class sklearn.ensemble.IsolationForest(n_estimators = 100,max_samples ='auto',contamination ='legacy',max_features = 1.0,bootstrap = False,n_jobs = None,behavior ='old',random_state = None,verbose = 0 )

    参数详情

    n_estimators : int,optional(默认值= 100)
    整体中基本估算器的数量。
    
    max_samples : int或float,optional(default =“auto”)
    从X中抽取的样本数量,用于训练每个基本估算器。
    如果是int,则绘制max_samples样本。
    如果是float,则绘制max_samples * X.shape [0]样本。
    如果是“auto”,则max_samples = min(256,n_samples)。
    如果max_samples大于提供的样本数,则所有样本将用于所有树(无采样)。
    
    contamination : float(0.,0.5),可选(默认值= 0.1)
    数据集的污染量,即数据集中异常值的比例。在拟合时用于定义决策函数的阈值。如果是“自动”,则确定决策函数阈值,如原始论文中所示。
    
    在版本0.20中更改:默认值contamination将从0.20更改为'auto'0.22。
    
    max_features : int或float,可选(默认值= 1.0)
    从X绘制以训练每个基本估计器的特征数。
    
    如果是int,则绘制max_features特征。
    如果是float,则绘制max_features * X.shape [1]特征。
    bootstrap : boolean,optional(default = False)
    如果为True,则单个树适合于通过替换采样的训练数据的随机子集。如果为假,则执行未更换的采样。
    
    n_jobs : int或None,可选(默认=无)
    适合和预测并行运行的作业数。 None除非在joblib.parallel_backend上下文中,否则表示1 。 -1表示使用所有处理器。
    
    random_state : int,RandomState实例或None,可选(默认=无)
    如果是int,则random_state是随机数生成器使用的种子; 如果是RandomState实例,则random_state是随机数生成器; 如果没有,随机数生成器所使用的RandomState实例np.random。
    
    verbose : int,optional(默认值= 0)
    控制树构建过程的详细程度。

    实现

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.ensemble import IsolationForest
    
    # 获得一组有规律的数据
    
    # 获得随机数生成器
    rng = np.random.RandomState(42)
    
    # 以给定的形状创建一个数组,数组元素来符合标准正态分布N(0,1)
    X = 0.3 * rng.randn(100, 2)
    # np.r是按列连接两个矩阵,就是把两矩阵上下相加,要求列数相等
    X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    
    # 再生成一组有规律的数据
    
    # Generate some regular novel observations
    X = 0.3 * rng.randn(20, 2)
    X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
    
    # 生成一组异常数据
    
    # 随机生成-8-8之间(20,2)的出界数组
    X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
    
    # 导入模型
    
    # 生成模型
    clf = IsolationForest(max_samples=100*2)
    clf.fit(X_train)
    # 生成训练数据预测值
    y_pred_train = clf.predict(X_train)
    print('y_pred_train',y_pred_train)
    # 生成测试数据预测值
    y_pred_test = clf.predict(X_test)
    print('y_pred_test',y_pred_test)
    # 生成出界数据预测值
    y_pred_outliers = clf.predict(X_outliers)
    
    print('y_pred_outliers',y_pred_outliers)
    

    得到结果  1 是正常值 -1是异常值

    # 训练集里面的数据预测结果
    y_pred_train [ 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
      1  1  1  1  1  1  1  1  1  1  1  1  1 -1  1  1  1  1  1  1  1  1  1  1
      1  1  1  1  1 -1  1  1  1  1  1  1  1 -1 -1  1  1  1  1  1  1  1  1  1
      1  1  1  1  1  1 -1  1  1  1  1  1  1  1  1  1  1 -1  1  1  1  1  1  1
      1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
      1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 -1  1  1  1  1  1  1
      1  1  1  1  1  1  1  1  1  1  1  1 -1  1  1  1  1  1  1  1  1  1  1  1
      1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 -1  1  1
      1  1  1  1  1  1  1  1  1  1  1  1  1  1 -1 -1  1  1  1  1  1  1  1  1
      1  1 -1  1  1  1  1  1 -1  1  1  1  1  1  1  1  1  1  1  1  1 -1  1  1
      1  1  1  1  1  1  1  1  1  1  1  1  1 -1  1 -1 -1  1  1  1  1 -1  1  1
      1  1  1  1  1  1  1  1  1  1  1  1  1  1 -1  1  1  1  1  1  1  1  1  1
      1 -1  1  1  1  1  1  1  1  1  1  1  1 -1  1 -1  1  1  1 -1  1  1 -1  1
      1  1  1 -1  1  1 -1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
      1 -1  1 -1  1 -1  1  1  1  1  1  1  1  1  1  1  1 -1  1 -1 -1  1  1  1
      1 -1 -1  1  1  1  1 -1  1  1  1  1  1 -1  1  1  1  1 -1  1  1 -1  1 -1
      1  1  1  1  1 -1  1  1  1  1  1  1  1  1  1  1]
    
    # 测试集预测结果
    y_pred_test [ 1  1  1  1 -1  1  1  1  1  1 -1  1  1  1  1  1  1 -1  1  1  1  1  1  1
     -1  1  1  1  1  1 -1  1  1  1  1  1  1  1  1  1  1  1  1  1 -1  1  1  1
      1  1 -1 -1  1  1  1  1  1 -1 -1  1  1  1 -1  1 -1  1  1  1  1  1 -1 -1
      1  1  1  1  1 -1 -1  1]
    
    # 出界数据的预测结果
    y_pred_outliers [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1]
    

     

    展开全文
  • 异常检测孤立森林(isolate forest)

    千次阅读 2021-12-01 16:25:26
    孤立森林是一种传统的异常检测机器学习算法,他属于无监督学习的boost 树模型,对于每棵子树来说,针对数据集的不同特征值,会随机挑选特征值取值范围内的一个随机值,然后将所有数据按照该特征的这个随机值划分为两...
  • 孤立森林进行异常检测; 用 Python 实现。 注:完整代码、数据、技术交流,文末获取 异常检测简介 离群值是在给定数据集中,与其他数据点显著不同的数据点。异常检测是找出数据中离群值(和大多数数据点显著...
  • 使用孤立森林进行异常检测

    千次阅读 2021-04-06 09:17:08
    异常检测是对罕见的观测数据进行识别,这些观测数据具有与其他数据点截然不同的极值。这类的数据被称为异常值,需要被试别和区分。造成这些异常现象的原因有很多:数据的可变性、数据收集过程中获得的错误,或者发生...
  • 孤立森林不需要根据距离和密度来衡量异常,因此孤立森林的时间复杂度是线性的,需要的内存也很少。孤立森林有能力处理大数据和高维数据,对于我们大数据背景下的异常识别,是十分适合的一个模型。 孤立森林的基本...
  • 孤立森林(isolation Forest)算法,2008年由刘飞、周志华等提出,算法不借助类似距离、密度等指标去描述样本与其他样本的差异,而是直接去刻画所谓的疏离程度(isolation),因此该算法简单、高效,在工业界应用较多。...
  • 孤立森林是一种简单但非常有效的算法,能够非常快速地发现数据集中的异常值。理解这个算法对于处理表格数据的数据科学家来说是必须的,所以在本文中将简要介绍算法背后的理论及其实现。 由于其算法非常的简单并且...
  • 孤立森林是基于Ensemble的快速异常检测方法,具有线性时间复杂度和高精准度,是符合大数据处理要求的state-of-the-art算法。孤立森林算法适用于连续数据的异常检测,将异常定义为“容易被孤立的离群点”,可以理解...
  • 常见机器学习聚类算法通常根据空间距离或者密度来寻找异常数据,孤立森林算法独辟蹊径,采用构建二叉树森林再进行中序遍历计算叶子结点平均高度的方式来寻找异常数据,算法实现了对于海量数据的异常检测仅需 ...
  • 孤立森林(isolation Forest)算法,2008年由刘飞、周志华等提出,算法不借助类似距离、密度等指标去描述样本与其他样本的差异,而是直接去刻画所谓的疏离程度(isolation),因此该算法简单、高效,在工业界应用较多。...
  • 孤立森林异常检测

    2022-04-13 16:57:11
    孤立森林异常检测
  • 文章目录孤立森林算法简介代码实现可视化 孤立森林 算法简介 孤立森林是一种无监督学习算法,可以用来做anomaly detection。在孤立森林中,递归地随机分割数据集,直到所有的样本点都是孤立的。在这种随机分割的策略...
  • 如果我们在建模之前就有异常行为的信息,那么异常检测可以通过监督学习算法来解决,但在没有反馈的情况下,最初很难识别这些点。因此,我们可以使用孤立森林(Isolation Forest)、支持向量机和LSTM等算法将其建模为...
  • 孤立森林算法是基于隔离机制的异常检测算法,存在与轴平行的局部异常点无法检测、对高维数据异常点缺乏敏感性和稳定性等问题。针对这些问题,提出了基于随机超平面的隔离机制和多粒度扫描机制,随机超平面使用多个...
  • 孤立森林(Iforest) 异常检测方法

    千次阅读 2019-08-02 11:25:25
    孤立森林(Iforest) 异常检测方法 概述 Iforest算法常用于异常检测孤立森林算法由08年首次提出,基于孤立森林异常检测算法11年在tkdd问世,这两篇论文的一作是小哥Fei Tony Liu和Kai Ming Ting教授,周志华是第...
  • 孤立森林理论简介,和参数说明 理解:最早被树分离出去(树的长度最短)的数据点,可能为异常点。 不需要标准化,不需要PCA降维 python实例 import requests import matplotlib.pyplot as plt from sklearn.ensemble...
  • 实现背景和意义 在物联网应用中,数据的产生大多数都是由传感器采集的,农业物联网更是如此。并且农业物联网中,传感器...孤立森林算法 在详细讨论算法的文章里已经说明的很清楚了,这里不做赘述,只讲一下自己的理解作
  • 与其他流行的孤立点检测方法不同的主要思想是,孤立森林显式地识别异常,而不是对正常数据点进行分析。 孤立林和任何一种树系算法一样,都是建立在决策树的基础上的。 在这些树中,首先是随机选择一个特征,然后在所...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,459
精华内容 583
关键字:

孤立森林异常检测