Python实现孤⽴随机森林算法的⽰例代码
⽬录
1 简介
2 孤⽴随机森林算法
2.1 算法概述
2.2 原理介绍
2.3 算法步骤
3 参数讲解
4 Python代码实现
5 结果
1 简介
孤⽴森林(isolation Forest)是⼀种⾼效的异常检测算法,它和随机森林类似,但每次选择划分属性和划分点(值)时都是随机的,⽽不是根据信息增益或基尼指数来选择。
2 孤⽴随机森林算法
2.1 算法概述
Isolation,意为孤⽴/隔离,是名词,其动词为isolate,forest是森林,合起来就是“孤⽴森林”了,也有叫“独异森林”,好像并没有统⼀的中⽂叫法。可能⼤家都习惯⽤其英⽂的名字isolation forest,简称iForest 。
iForest算法是由南京⼤学的周志华和澳⼤利亚莫纳什⼤学的Fei Tony Liu,Kai Ming Ting等⼈共同移除,⽤于挖掘数据,它是适⽤于连续数据(Continuous numerical data)的异常检测,将异常定义为“容易被孤⽴的离点(more likely to be separated)”——可以理解为分布稀疏且离密度⾼的体较远的点。⽤统计学来解释,在数据空间⾥⾯,分布稀疏的区域表⽰数据发⽣在此区域的概率很低,因此可以认为落在这些区域⾥的数据是异常的。通常⽤于⽹络安全中的攻击检测和流量异常等分析,⾦融机构则⽤于挖掘出欺诈⾏为。对于出的异常数据,然后要么直接清除异常数据,如数据清理中的去噪数据,要么深⼊分析异常数据,⽐如分析攻击,欺诈的⾏为特征。
2.2 原理介绍
iForest 属于Non-parametric和unsupervised的⽅法,即不⽤定义数学模型也不需要有标记的训练。对于如何查哪些点是否容易被孤⽴(isolated),iForest使⽤了⼀套⾮常⾼效的策略。假设我们⽤⼀个随机超平⾯来切割(split)数据空间(data
space),切⼀次可以⽣成两个⼦空间(详细拿⼑切蛋糕⼀分为⼆)。之后我们再继续⽤⼀个随机超平⾯来切割每个⼦空间,循环下去,直到每个⼦空间⾥⾯只有⼀个数据点为⽌。直观上来讲,我们可以发现那些密度很⾼的簇是被切分很多次才会停⽌切割,但是那些密度很低的点很容易很早就停到⼀个⼦空间看了。
iForest 算法得益于随机森林的思想,与随机森林由⼤量决策树组成⼀样,iForest森林也由⼤量的⼆叉树组成,iForest 中的树叫 isolation tree,简称 iTree,iTree 树和决策树不太⼀样,其构建过程也⽐决策树简单,是⼀个完全随机的过程。
假设数据集有 N 条数据,构建⼀颗 ITree时,从 N条数据中均匀抽样(⼀般是⽆放回抽样)出 n 个样本出来,作为这棵树的训练样本。在样本中,随机选出⼀个特征,并在这个特征的所有值范围内(最⼩值和最⼤值之间)随机选⼀个值,对样本进⾏⼆叉划分,将样本中⼩于该值的划分到节点的左边,⼤于等于该值的划分到节点的右边。由此得到⼀个分裂条件和左右两边的数据集,然后分别在左右两边的数据集上重复上⾯的过程,直到数据集只有⼀条记录或者达到了树的限定⾼度。
由于异常数据较⼩且特征值和正常数据差别很⼤。因此,构建 iTree的时候,异常数据离根更近,⽽正常数据离根更远。⼀颗ITree的结果往往不可信,iForest算法通过多次抽样,构建多颗⼆叉树。最后整合所有树的结果,并取平均深度作为最终的输出深度,由此计算数据点的异常分⽀。
2.3 算法步骤
怎么来切这个数据空间是iForest的设计核⼼思想,本⽂仅学习最基本的⽅法,由于切割是随机的,所以需要⽤ensemble的⽅法来得到⼀个收敛值(蒙特卡洛⽅法),即反复从头开始切,然后平均每次切的结果。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')
semble 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')
linspace函数pythonclf.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("孤⽴随机森林")
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孤⽴随机森林算法的资料请关注其它相关⽂章!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论