孤立森林

孤立森林(Isolation Forest)

怎么来切这个数据空间是iForest的设计核心思想

思路:

将整个数据划分为多个子集,在子集上进行异常检测的操作。iTree的建立是通过对训练集的递归分隔来建立的,直到所有的样本被孤立,或者树达到了指定的高度,树的高度限制l与子样本数量ψ的关系为l=ceiling(log2(ψ)),它近似等于树的平均高度。我们只关心路径长度较小的那些点,它们更有可能是异常点,而并不关心路径很长的正常点。获得t个iTree之后,iForest 训练就结束,然后我们可以用生成的iForest来评估测试数据了。对于一个训练数据x,我们令其遍历每一棵iTree,然后计算x最终落在每个树第几层(x在树的高度)。是另外一种高效的异常检测算法,它和随机森林类似,但每次选择划分属性和划分点(值)时都是随机的(每次节点都会随机选取一个特征),而不是根据信息增益或者基尼指数来选择。在建树过程中,如果一些样本很快就到达了叶子节点(即叶子到根的距离d很短),那么就被认为很有可能是异常点。因为那些路径d比较短的样本,都是因为距离主要的样本点分布中心比较远的。也就是说,可以通过计算样本在所有树中的平均路径长度来寻找异常点。在一棵树的根节点选取的属性为A,那么在根节点的子节点上选取的属性还是A吗?可能是A也可能是别的属性。

优点

对故障诊断来说,孤立森林所拥有的优点。
1.适用于连续数据,无监督学习,无需对未打标签的数据进行标记即可训练。
2.孤立树的独有特点使得孤立森林能够通过子采样建立局部模型,减小swamping和masking对模型效果的影响。其中的原因是:子采样可以控制每棵孤立树的数据量;每棵孤立树专门用来识别特定的子样本。

缺点

对故障诊断来说,孤立森林所拥有的缺点。
1.样本数较多会降低孤立森林孤立异常点的能力,因为正常样本会干扰隔离的过,降低隔离异常的能力。子采样就是在这种情况下被提出的。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest
rng=np.random.RandomState(42)
# 生成训练数据
X=0.3*rng.randn(100,2) # 100条二维数据
X_train=np.r_[X+2,X-2] # 200条数据(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(behaviour='new',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_test)
y_pred_outliers = clf.predict(X_outliers)
# 画图
xx, yy = np.meshgrid(np.linspace(-5, 5, 50), np.linspace(-5, 5, 50)) # 生成网络数据 https://www.cnblogs.com/lemonbit/p/7593898.html
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.title("IsolationForest")
plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r) # 等高线

b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white',
                 s=20, edgecolor='k')
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green',
                 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()

参考博客:

https://blog.csdn.net/u013709270/article/details/73436588
https://blog.csdn.net/extremebingo/article/details/80108247
https://www.jianshu.com/p/5af3c66e0410?utm_campaign=maleskine
https://www.cnblogs.com/wanghui-garcia/p/11475713.html程序
https://zhuanlan.zhihu.com/p/52282709
https://blog.csdn.net/ye1215172385/article/details/79762317 主要参数
https://blog.csdn.net/weixin_30905133/article/details/101564568 主要参数
https://www.jianshu.com/p/e408a010e424有注释的代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值