图书馆网站建设方案,沈阳快速建站模板,广州有建网站的公司吗,阅读转发网站那些做的比较好目录
1 简介
2 孤立随机森林算法
2.1 算法概述
2.2 原理介绍
2.3 算法步骤
3 参数讲解
4 Python代码实现
5 结果 1 简介
孤立森林#xff08;isolation Forest#xff09;是一种高效的异常检测算法#xff0c;它和随机森林类似#xff0c;但每次选择划分属性和划…目录
1 简介
2 孤立随机森林算法
2.1 算法概述
2.2 原理介绍
2.3 算法步骤
3 参数讲解
4 Python代码实现
5 结果 1 简介
孤立森林isolation Forest是一种高效的异常检测算法它和随机森林类似但每次选择划分属性和划分点值时都是随机的而不是根据信息增益或基尼指数来选择。
2 孤立随机森林算法
2.1 算法概述
Isolation意为孤立/隔离是名词其动词为isolateforest是森林合起来就是“孤立森林”了也有叫“独异森林”好像并没有统一的中文叫法。可能大家都习惯用其英文的名字isolation forest简称iForest 。 iForest算法是由南京大学的周志华和澳大利亚莫纳什大学的Fei Tony LiuKai Ming Ting等人共同移除用于挖掘数据它是适用于连续数据Continuous numerical data的异常检测将异常定义为“容易被孤立的离群点more likely to be separated”——可以理解为分布稀疏且离密度高的群体较远的点。用统计学来解释在数据空间里面分布稀疏的区域表示数据发生在此区域的概率很低因此可以认为落在这些区域里的数据是异常的。通常用于网络安全中的攻击检测和流量异常等分析金融机构则用于挖掘出欺诈行为。对于找出的异常数据然后要么直接清除异常数据如数据清理中的去噪数据要么深入分析异常数据比如分析攻击欺诈的行为特征。
2.2 原理介绍
iForest 属于Non-parametric和unsupervised的方法即不用定义数学模型也不需要有标记的训练。对于如何查找哪些点是否容易被孤立isolatediForest使用了一套非常高效的策略。假设我们用一个随机超平面来切割split数据空间data space切一次可以生成两个子空间详细拿刀切蛋糕一分为二。之后我们再继续用一个随机超平面来切割每个子空间循环下去直到每个子空间里面只有一个数据点为止。直观上来讲我们可以发现那些密度很高的簇是被切分很多次才会停止切割但是那些密度很低的点很容易很早就停到一个子空间看了。 iForest 算法得益于随机森林的思想与随机森林由大量决策树组成一样iForest森林也由大量的二叉树组成iForest 中的树叫 isolation tree简称 iTreeiTree 树和决策树不太一样其构建过程也比决策树简单是一个完全随机的过程。 假设数据集有 N 条数据构建一颗 ITree时从 N条数据中均匀抽样一般是无放回抽样出 n 个样本出来作为这棵树的训练样本。在样本中随机选出一个特征并在这个特征的所有值范围内最小值和最大值之间随机选一个值对样本进行二叉划分将样本中小于该值的划分到节点的左边大于等于该值的划分到节点的右边。由此得到一个分裂条件和左右两边的数据集然后分别在左右两边的数据集上重复上面的过程直到数据集只有一条记录或者达到了树的限定高度。 由于异常数据较小且特征值和正常数据差别很大。因此构建 iTree的时候异常数据离根更近而正常数据离根更远。一颗ITree的结果往往不可信iForest算法通过多次抽样构建多颗二叉树。最后整合所有树的结果并取平均深度作为最终的输出深度由此计算数据点的异常分支。
2.3 算法步骤
怎么来切这个数据空间是iForest的设计核心思想本文仅学习最基本的方法由于切割是随机的所以需要用ensemble的方法来得到一个收敛值蒙特卡洛方法即反复从头开始切然后平均每次切的结果。IForest由 t个iTreeIsolation Tree孤立树组成每个iTree是一个二叉树结构所以下面我们先说一下iTree树的构建然后再看iForest树的构建。
3 参数讲解 1n_estimators构建多少个itreeintoptional default100指定该森林中生成的随机树数量 2max_samples采样数自动是256intoptionaldefaultauto 用来训练随机数的样本数量即子采样的大小 1如果设置的是一个int常数那么就会从总样本 X 拉取 max_samples个样本生成一棵树 iTree 2如果设置的是一个float浮点数那么就会从总样本 X 拉取 max_samples*X.shape[0] 个样本X.shape[0] 表示总样本个数 3 如果设置的是 “auto”则max_samplesmin(256, n_samples)n_samples即总样本的数量 如果max_samples 值比提供的总样本的数量还大的话所有的样本都会用来构造数意思就是没有采样了构造的 n_estimators棵ITree使用的样本都是一样的即所有的样本。 3contaminationc(n)默认是0.1float in 0 0.5optionaldefault0.1取值范围为0 0.5表示异常数据占给定的数据集的比例就是数据集中污染的数量定义该参数值的作用是在决策函数中定义阈值。如果设置为“auto”则决策函数的阈值就和论文一样在版本0.20中有变换默认值从0.1变为0.22的auto。 4max_features最大特征数默认为1int or floatoptional指定从总样本X中抽取来训练每棵树iTree 的属性的数量默认只使用一个属性 如果设置为 int 整数则抽取 max_features 个属性 如果是float浮点数则抽取 max_features *X.shape[1] 个属性 5bootstrapbooleanoptionaldefault False构建Tree时下次是否替换采样为True为替换则各个树可放回地对训练数据进行采样为False为不替换即执行不放回的采样 6n_jobsint or None, optional default None 在运行 fit() 和 predict() 函数时并行运行的作业数量。除了在 joblib.parallel_backend 上下文的情况下None表示为1设置为 -1 则表示使用所有可以使用的处理器 7behaviourstrdefaultold决策函数 decision_function 的行为可以是“old”和‘new’。设置为 behaviornew将会让 decision_function 去迎合其它异常检测算法的API这在未来将会设置为默认值。正如在 offset_ 属性文档中详细解释的那样decision_function 变得依赖于 contamination 参数以 0 作为其检测异常值的自然阈值。 New in version 0.20behaviour参数添加到了0.20版本中以实现后向兼容 behaviourold在0.20版本中以经弃用在0.22版本中将不能使用 behaviour参数将在0.22版本中弃用将在0.24版本中移除 8random_stateintRandomState instance or NoneoptionaldefaultNone 如果设置为 int 常数则该 random_state 参数值是用于随机数生成器的种子 如果设置为RandomState实例则该 random_state 就是一个随机数生成器 如果设置为None则该随机数生成器就是使用在 np.random中RandomState实例 9verboseintoptionaldefault0控制树构建过程的冗长性 10warm_startbooloptionaldefaultFalse当设置为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, high4, size(20, 2))#~~~~~~~~~训练模型~~~~~~~~~~~~·
clf IsolationForest( max_samples100,random_staterng, contaminationauto)
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, campplt.cm.Blues_r)
b1 plt.scatter(X_train[:, 0], X_train[:, 1], cgreen,s20, edgecolork)
b2 plt.scatter(X_test[:, 0], X_test[:, 1], cwhite,s20, edgecolork)
c plt.scatter(X_outliers[:, 0], X_outliers[:, 1], cred,s20, edgecolork)
plt.axis(tight)
plt.xlim((-5, 5))
plt.ylim((-5, 5))
plt.legend([b1, b2, c],[training observations,new regular observations, new abnormal observations],locupper left)
plt.show()
5 结果