python 孤立森林,随机森林算法举例

  python 孤立森林,随机森林算法举例

  IsolationForest是一种有效的异常检测算法。类似于随机森林,但每次随机选取划分属性和划分点(值),并不是基于信息增益或基尼指数。本文将使用Python实现这个算法,有需要的可以参考。

  00-1010 1简介2孤立随机森林算法2.1算法概述2.2原理介绍2.3算法步骤3参数说明4 Python代码实现5结果

  

目录

  隔离森林是一种有效的异常检测算法。类似于随机森林,但每次随机选取划分属性和划分点(值),并不是基于信息增益或基尼指数。

  

1 简介

  

2 孤立随机森林算法

  Isolation,意思是隔离/隔绝,是名词,动词是isolate,forest是forest,合起来表示“孤立的森林”,其中有一部分被称为“独特的森林”。它似乎没有统一的中文名称。可能大家都习惯用它的英文名,isolation forest,简称iForest。

  iForest算法是由南京大学的和澳大利亚莫那什大学的廷、刘非托尼联合提出的,并用于数据挖掘。适用于连续数值型数据的异常检测,异常定义为“更可能被孤立”3354,可以理解为分布稀疏且距离一个高密度组较远的点。从统计学上讲,在数据空间中,分布稀疏的区域说明数据发生在这个区域的概率很低,因此可以认为数据落在这些区域是异常的。它通常用于网络安全中的攻击检测和流量异常分析,而金融机构则用于发现欺诈。对于发现的异常数据,要么直接去除异常数据,比如数据清洗中的去噪数据,要么对异常数据进行深度分析,比如分析攻击和欺诈的行为特征。

  

2.1 算法概述

  IForest属于非参数无监督方法,即不需要定义数学模型和标记训练。至于如何找出哪些点容易隔离,iForest采用了非常高效的策略。假设我们用一个随机超平面来拆分数据空间,可以一次生成两个子空间(详细用刀子把蛋糕一分为二)。之后继续用一个随机超平面来切割每个子空间,循环往复,直到每个子空间只有一个数据点。直观的说,我们可以发现那些密度高的簇在停止切割之前被切割了很多次,而那些密度低的点却很容易在一个子空间中停止很长时间。

  IForest算法得益于随机森林的思想。和random forest一样,iForest也是由大量的二叉树组成。iForest中的树叫隔离树,简称iTree。iTree不同于决策树,它的构造过程比决策树简单,所以它是一个完全随机的过程。

  假设数据集有N条数据,在构造ITree时,从这N条数据中均匀采样N个样本(一般为无替换采样),用作这棵树的训练样本。在示例中,随机选择一个特征,并从该特征的所有值的范围(最小值和最大值之间)中随机选择一个值。样本分为两部分,小于此值的分为节点左侧,大于等于此值的分为节点右侧。这样,得到一个分裂条件和左右数据集,然后分别对左右数据集重复上述过程,直到数据集中只有一条记录或达到树的有限高度。

  因为异常数据很小,特征值和正常数据差别很大。因此,在构建iTree时,异常数据离根更近,而正常数据离根更远。一棵ITree的结果往往是不可靠的,iForest算法通过多次采样构造多个二叉树。最后综合所有树的结果,取平均深度作为最终输出深度,从而计算出数据点的异常分支。

  

2.2 原理介绍

  如何切割这个数据空间,是iForest设计的核心思想。本文只研究最基本的方法。因为切割是随机的,所以需要用系综法来得到一个收敛值(蒙特卡罗法),即从开始反复切割,然后每隔

  次切的结果。IForest由 t个iTree(Isolation Tree)孤立树组成,每个iTree是一个二叉树结构,所以下面我们先说一下iTree树的构建,然后再看iForest树的构建。

  

  

3 参数讲解

  (1)n_estimators:构建多少个itree,int,optional (default=100)指定该森林中生成的随机树数量

  (2)max_samples:采样数,自动是256,int,optional(default='auto)

  用来训练随机数的样本数量,即子采样的大小:

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

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

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

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

  (3)contamination:c(n)默认是0.1,float in (0, 0.5),optional(default=0.1),取值范围为(0, 0.5),表示异常数据占给定的数据集的比例,就是数据集中污染的数量,定义该参数值的作用是在决策函数中定义阈值。如果设置为auto,则决策函数的阈值就和论文一样,在版本0.20中有变换:默认值从0.1变为0.22的auto。

  (4)max_features:最大特征数,默认为1,int or float,optional,指定从总样本X中抽取来训练每棵树iTree 的属性的数量,默认只使用一个属性

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

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

  (5)bootstrap:boolean,optional(default = False),构建Tree时,下次是否替换采样,为True为替换,则各个树可放回地对训练数据进行采样;为False为不替换,即执行不放回的采样

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

  (7)behaviour:str,default='old',决策函数 decision_function 的行为,可以是old和‘new’。设置为 behavior='new'将会让 decision_function 去迎合其它异常检测算法的API,这在未来将会设置为默认值。正如在 offset_ 属性文档中详细解释的那样,decision_function 变得依赖于 contamination 参数,以 0 作为其检测异常值的自然阈值。

  New in version 0.20:behaviour参数添加到了0.20版本中以实现后向兼容

  behaviour='old'在0.20版本中以经弃用,在0.22版本中将不能使用

  behaviour参数将在0.22版本中弃用,将在0.24版本中移除

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

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

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

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

  (9)verbose:int,optional(default=0)控制树构建过程的冗长性

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

  

  

4 Python代码实现

  

# _*_coding:utf-8_*_

  #~~~~~~~~导入相关库~~~~~~~~~~~·

  import numpy as np

  import matplotlib.pyplot as plt

  from pylab import *

  import matplotlib; matplotlib.use(TkAgg)

  mpl.rcParams[font.sans-serif] = [SimHei]

  mpl.rcParams[axes.unicode_minus] = False

  from sklearn.ensemble import IsolationForest #孤立随机森林

  rng = np.random.RandomState(42) #该方法为np中的伪随机数生成方法,其中的42表示种子,只要种子一致 产生的伪随机数序列即为一致。

  #~~~~~~~产生训练数据~~~~~~~~~~

  X = 0.3 * rng.randn(100, 2) #randn:标准正态分布;rand的随机样本位于[0, 1)中

  X_train = np.r_[X + 2, X - 2]

  X = 0.3 * rng.randn(20, 2)

  X_test = np.r_[X + 2, X - 2]

  X_outliers = rng.uniform(low=-4, high=4, size=(20, 2))

  #~~~~~~~~~训练模型~~~~~~~~~~~~·

  clf = IsolationForest( max_samples=100,random_state=rng, contamination=auto)

  clf.fit(X_train)

  y_pred_train = clf.predict(X_train)

  y_pred_test = clf.predict(X_outliers)

  xx, yy = np.meshgrid(np.linspace(-5, 5, 50), np.linspace(-5, 5, 50))

  Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])

  Z = Z.reshape(xx.shape)

  #~~~~~~~~~~~~~~~~可视化~~~~~~~~~~~~~~~~~~·

  plt.title("孤立随机森林")

  plt.contourf(xx, yy, Z, camp=plt.cm.Blues_r)

  b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c=green,

   s=20, edgecolor=k)

  b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c=white,

   s=20, edgecolor=k)

  c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c=red,

   s=20, edgecolor=k)

  plt.axis(tight)

  plt.xlim((-5, 5))

  plt.ylim((-5, 5))

  plt.legend([b1, b2, c],

   ["training observations",

   "new regular observations", "new abnormal observations"],

   loc="upper left")

  plt.show()

  

  

  

5 结果

  

  以上就是Python实现孤立随机森林算法的示例代码的详细内容,更多关于Python孤立随机森林算法的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: