古老的spc也可以用机器学习(二)-孤立森林算法

阿里云2000元红包!本站用户参与享受九折优惠!

算法原理

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

作为传统SPC异常检测中的一个非常不错的补充,特别是针对有子组的情况下异常检测更灵敏。

iForest 适用与连续数据(Continuous numerical data)的异常检测,将异常定义为“容易被孤立的离群点 (more likely to be separated)”——可以理解为分布稀疏且离密度高的群体较远的点。用统计学来解释,在数据空间里面,分布稀疏的区域表示数据发生在此区域的概率很低,因而可以认为落在这些区域里的数据是异常的。


孤立森林算法原理

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

算法步骤

用ensemble的方法来得到一个收敛值(蒙特卡洛方法),即反复从头开始切,然后平均每次切的结果。iForest 由t个iTree(Isolation Tree)孤立树 组成,每个iTree是一个二叉树结构,其实现步骤如下:

  • 从训练数据中随机选择Ψ个点样本点作为subsample,放入树的根节点。
  • 机指定一个维度(attribute),在当前节点数据中随机产生一个切割点p——切割点产生于当前节点数据中指定维度的最大值和最小值之间。
  • 3以此切割点生成了一个超平面,然后将当前节点数据空间划分为2个子空间:把指定维度里小于p的数据放在当前节点的左孩子,把大于等于p的数据放在当前节点的右孩子。
  • 4在孩子节点中递归步骤2和3,不断构造新的孩子节点,直到 孩子节点中只有一个数据(无法再继续切割) 或 孩子节点已到达限定高度 。

孤立森林Python实现算法如下:

1、导入模块和算法拟合

<pre style=”box-sizing: border-box; margin: 0px 0px 1rem; padding: 0px; border: none; outline: none; -webkit-tap-highlight-color: transparent; font-family: SFMono-Regular, Menlo, Monaco, Consolas, “Liberation Mono”, “Courier New”, monospace; font-size: 14px; overflow: auto; display: block; color: rgb(33, 37, 41); -webkit-font-smoothing: antialiased; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 300; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;”> `from sklearn.ensemble import IsolationForest
import pandas as pd
y=[470,509,500,511,435,489,483,483,482,483,504,472,464,481,501,581,507,558,569,467,382,464,482,474,482,478,477,536,485,502,489,507,432,507,470,482,485,482,505,470,487,476]
y = pd.DataFrame(y)

fit the model

clf = IsolationForest(contamination=0.05)
clf.fit(y)`
</pre>

上面算法中的参数contamination=0.05表示占总数的5%为异常

1、导入模块和算法拟合

<pre style=”box-sizing: border-box; margin: 0px 0px 1rem; padding: 0px; border: none; outline: none; -webkit-tap-highlight-color: transparent; font-family: SFMono-Regular, Menlo, Monaco, Consolas, “Liberation Mono”, “Courier New”, monospace; font-size: 14px; overflow: auto; display: block; color: rgb(33, 37, 41); -webkit-font-smoothing: antialiased; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 300; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;”> `y[‘fcst’] = clf.predict(y)
label0 = y[y.fcst==1][‘fcst’].count()
label1 = y[y.fcst==-1][‘fcst’].count()
if label0>label1:#正常的多
y.loc[y[‘fcst’] == 1, ‘isAbnormal’] = 0
y.loc[y[‘fcst’] == -1, ‘isAbnormal’] = 1
else:
y.loc[y[‘fcst’] == 1, ‘isAbnormal’] = 1
y.loc[y[‘fcst’] == -1, ‘isAbnormal’] = 0

y.columns = [‘data’,’fcst’,’isAbnormal’]
y[‘isAbnormal’]=y[‘isAbnormal’].astype(int)
y = y[[‘data’,’isAbnormal’]]`
</pre>

字段fcst记录了预测的分类结果,有两个分类-1和1,-1的是异常值,为了我们的结果的通用是,0表示正常,1表示异常,上面的代码进行转换,默认多的分类是正常,少的分类是异常。

结果如下:


孤立森林算法原理

至此,我们已经完成了一种机器学习(孤立森林算法)的异常检测。

SPC系统实现:

接下来看看我们在SPC系统上的实现。

我们把孤立森林算法得到的异常点,直接显示在SPC控制图上,请看下图。也可以选择不显示。


SPC控制图的孤立森林算法异常检测

这样我们就可以在SPC控制图上显示其他异常判定算法的异常判定结果了。现在知道机器学习怎么和SPC结合在一起如何使用了吧。
如果你想了解上面的功能的测试,

下方链接可以在线体验和上图完成一样的功能。

http://www.simplespc.cn/demos/single1.php

https://www.jianshu.com/p/fbb6153f55fc

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论