质量管理异常判定方法(SPC统计过程控制整合机器学习算法)
大家都很清楚SPC的中文叫统计过程控制,它的作用是发现过程数据中的异常行为,SPC有8种以上的判异规则,每一中判异规则对应可能的异常原因,非常实用。并且我们在传统的SPC的基础上,又对SPC进行了一些创新,可以看下面两篇文章。
《原来古老的SPC控制图可以这样玩创新的》和《原来SPC应用如此简单,有了它工作不再困难》
SPC只是异常判定的其中一种方法,最近大数据、机器学习应用越来越广泛,而机器学习算法的一个常见应用就算异常检测,接下来介绍不同的机器学习算法来进行异常检测,包括算法基本原理、系统实现和应用。
1、K均值(K-Mean)异常判定
K-mean(k均值)是一种聚类分析方法。
“ 聚类分析(英语:Cluster analysis)亦称为群集分析,是对于统计数据分析的一门技术,在许多领域受到广泛应用,包括机器学习,数据挖掘,模式识别,图像分析以及生物信息,顾客分类,文章分类等。聚类是把相似的对象通过静态分类的方法分成不同的组别或者更多的子集(subset),这样让在同一个子集中的成员对象都有相似的一些属性,常见的包括在坐标系中更加短的空间距离等。一般把数据聚类归纳为一种非监督式学习。”
K均值算法过程如下:
- 首先我们选择一些类/组,并随机初始化它们各自的中心点。中心点是与每个数据点向量长度相同的位置。这需要我们提前预知类的数量(即中心点的数量)。
- 计算每个数据点到中心点的距离,数据点距离哪个中心点最近就划分到哪一类中。
- 计算每一类中中心点作为新的中心点。
- 重复以上步骤,直到每一类中心在每次迭代后变化不大为止。也可以多次随机初始化中心点,然后选择运行结果最好的一个。
随机选择2个点(k=2)C1和C2,将剩下的所有点,根据距离C1和C2的距离的远近,划分给C1或者C2
根据获得的两类点,重新计算两类点中的质心(到该类所有点的距离最短)重新将所有的点归到两个新的质心的其中之一。
重复上面的过程,直到每一类中心在每次迭代后变化不大为止。
k均值Python实现算法如下:
简单一点,我们用一维数据来演示(检测数据很多是一维的)。
1)导入机器学习模块(这里我们使用了scikit-learn)
import pandas as pd import numpy as np from sklearn.cluster import KMeans
2)算法实现
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] km = KMeans(n_clusters=2) km.fit(y) y['fcst'] = km.predict(y)
输入一个y,定义分成两类(自动一类正常,一类不正常),
字段fcst记录了预测的分类结果,有两个分类0和1,但我们不知道哪一类才算正常,我们一个合理的假定,分类中多的是正常的,少的是异常的。
3)异常判定的处理
label0 = y[y.fcst==0]['fcst'].count() label1 = y[y.fcst==1]['fcst'].count() if label1<=label0: y['isAbnormal ']=y['fcst'] else: y.loc[y['fcst'] == 0, 'isAbnormal'] = 1 y.loc[y['fcst'] == 1, 'isAbnormal'] = 0 y.columns = ['data','fcst','isAbnormal'] y['isAbnormal']= y['isAbnormal'].astype(int) y = y[['data','isAbnormal']]
记录分类为1的数量和分类为0的数量,最终用字段isAbnormal记录是否异常,0为正常,1为异常。
结果如下:
至此,完成了一种机器学习中的K均值的异常检测。
2、孤立森林算法异常判定
算法原理
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、导入模块和算法拟合
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)
上面算法中的参数contamination=0.05表示占总数的5%为异常
1、导入模块和算法拟合
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']]
字段fcst记录了预测的分类结果,有两个分类-1和1,-1的是异常值,为了我们的结果的通用是,0表示正常,1表示异常,上面的代码进行转换,默认多的分类是正常,少的分类是异常。
结果如下:
至此,完成了一种机器学习(孤立森林算法)的异常检测。
3、支持向量机(SVM)异常判定
用二分类支持向量机算法进行异常检测。支持向量机简单描述一下,不做过多解释。
“ 支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。”
二分类支持向量机Python实现算法如下:
简单一点,我们用一维数据来演示(检测数据很多是一维的)。
1)导入机器学习模块(这里我们使用了scikit-learn的svm中的OneClassSVM模块)
from sklearn.svm import OneClassSVM import pandas as pd
2)算法实现
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) svm = OneClassSVM() svm.fit(y) y['fcst'] = svm.predict(y)
输入一个y,定义分成两类(自动一类正常,一类不正常),
字段fcst记录了预测的分类结果,有两个分类0和1,但我们不知道哪一类才算正常,我们一个合理的假定,分类中多的是正常的,少的是异常的。
3)异常判定的处理
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']]
记录分类为1的数量和分类为0的数量,最终用字段isAbnormal记录是否异常,0为正常,1为异常。
结果如下:
至此,完成了一种机器学习支持向量机SVM的异常检测。
4.和SPC系统整合
接下来看看我们在SPC系统上的实现。
我们把支持向量机、k均值、孤立森林等机器学习算法得到的异常点,直接显示在SPC控制图上,请看下图。也可以选择不显示(看起来异常判定结果不太理想)。
这样我们就可以在SPC控制图上显示其他异常判定算法的异常判定结果了。现在知道机器学习怎么和SPC结合在一起如何使用了吧。
下方链接可以在线体验和上图完成一样的功能。