异常检测——task01

一、异常检测

1.1 概念

异常检测是指识别出与正常数据不同的数据,与预期行为差异大的数据。因此异常检测一般都是不平衡的分类或聚类。

1.2 典型应用场景

其应用背景有很多,这里主要介绍故障检测。故障是指:当系统的某个特征参数发生了不可接受的偏移时,称系统发生了故障。故障检测就是判断系统是否发生了故障并判断故障的类型和硬件位置;

1.3 故障检测的简要介绍

故障可以分为两类:一类是预期故障,就是在故障模式库中存在的故障;另一类是非预期故障,这类故障客观存在,但是故障模式库中没有记录。前者往往存在对应的监测记录、特征描述和处理方法等先验信息,而后者则缺乏对应的先验信息,一般只有少量测试数据 (Test Data),没有对应的训练数据 (Training Data)。

预期故障的故障检测方法大体分为三类:基于模型的故障诊断方法、基于知识的故障诊断方法和数据驱动的故障诊断方法。

  • 基于模型:基于模型的故障诊断方法所需要的先验信息全部来源于已知的模型结构和模型参数。它假设输入 / 输出数据符合某种模型结构,比如状态空间模型结构,而且模型的参数是已知的。具体的方法有故障检测滤波器 、诊断观测器 、对偶空间法等。基于模型的方法可以直接用于检测非预期故障,但是无法隔离非预期故障,因为基于模型的诊断方法大多认为所有的故障都是预期的
  • 基于知识 :基于知识的故障诊断方法所需要的先验信息全部来源于知识规则库。它假设能够获得比较完善的知识规则库和对应的数据库。具体的方法有专家系统、人工神经网络和有向图等等。这些方法不需要诊断对象的精确动态模型,其核心思想就是将工程师、操作者以及维修人员所掌握的知识转换成监控诊断的规则,并且研制出故障诊断的在线集成化专家系统。其难点在于知识库的构建。
  • 数据驱动 :数据驱动的故障诊断方法所需要的先验信息全部来源于离线训练数据。它假设数据的输入 / 输出模型的结构和参数是未知的,但是能够获得用于训练的正常数据。具体的方法包括多元统计分析,主元分析 (PCA, Principal Component Analysis) ,典型相关分析(CCA , Canonical Correlation Analysis)、偏最小二乘 (PLS, Partial Least SquareRegression ) 等等。这些方法直接以监控数据为基础,利用数据处理、多元统计和模式识别的技术进行故障诊断。

二、异常检测常用方法

这里引用一下别人的分类方法:原地址是https://blog.csdn.net/cyanPhoenix/article/details/112498721
大概可以分为这样3类。

2.1 基于度量准则的单分类器分类方法

2.1.1 统计学方法

也就是一种基于模型的方法,对数据的正常性做出假定。它们假定正常的数据对象由⼀个统计模型产⽣,而不遵守该模型的数据是异常点。统计学⽅法的有效性⾼度依赖于对给定数据所做的统计模型假定是否成立。
异常检测的统计学⽅法的⼀般思想是:学习⼀个拟合给定数据集的⽣成模型,然后识别该模型低概率区域中的对象,把它们作为异常点。
然而,这一概率测度本身也是一种度量准则。感觉有点类似于贝叶斯统计方法,先给出一个先验的统计模型,再根据后验信息判断是不是异常的。

2.1.2 基于相似度的方法

  • 基于集群(簇)的检测,如DBSCAN等聚类算法。DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法。与划分和层次聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪声的空间数据库中发现任意形状的聚类。
  • 基于距离的度量,如k近邻算法。k近邻算法的基本思路是对每一个点,计算其与最近k个相邻点的距离,通过距离的大小来判断。
    它是否为离群点
  • 基于密度的度量,如LOF(局部离群因⼦)算法。局部离群因子(LOF)算法与k近邻类似,不同的是它以相对于其邻居的局部密度偏差而不是距离来进行度量。它将相邻点之间的距离进一步转化为“邻域”,从而得到邻域中点的数量(即密度),认为密度远低于其邻居的样本为异常值。

2.2 基于多个分类器的集成学习方法

集成学习方法的基本思路是多个分类器的投票。通过构建多个子分类器并将多个子分类器通过一个规则结合起来共同完成学习任务的学习方法。(参考链接https://blog.csdn.net/yingfengfeixiang/article/details/79729436)
目前集成学习方法包含两类:

  • 个体学习器间存在依赖关系、必须串行生成的序列化方法。(代表:Boosting)Boosting先初始从训练集中训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续得到更多的关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,知道基学习器数目达到预先设定的值T,最终将T个基学习器进行加权结合。从偏差-方差的角度,Boosting更关注降低偏差。偏差指的是算法期望预测与真实预测之间的偏差程度,返佣了模型本身的泛化能力。
  • 个体学习器间不存在强依赖关系、可同时生成的并行化方法。(代表:Bagging)Bagging的样本采样基于自助采样法(bootstrap sampling)。采样出T个含有m个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合。典型方法是孤立森林法。

2.3 基于树模型的学习方法

在有标签的情况下,可以使⽤树模型(gbdt,xgboost等)进⾏分类,缺点是异常检测场景下数据标签是不均衡的,但是利⽤机器学习算法的好处是可以构造不同特征。

三、异常检测常用相关库的使用探索

3.1 异常检测常用相关库的配置

安装的anaconda,python 3.8。
自带sklearn==0.23.2。
pip安装pyod,选择清华源一键安装
pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple
安装的pyod版本是0.8.5。

3.2 常用相关库的介绍

Scikit-learn:
Scikit-learn是一个Python语言的开源机器学习库。它具有各种分类,回归和聚类算法。也包含了一些异常检测算法,例如LOF和孤立森林。根据链接https://scikit-learn.org/dev/versions.html可下载不同版本的官方文档介绍。
例子,鸢尾花数据的knn

#调用模块
from sklearn.datasets import load_iris
data = load_iris()
#导入数据和标签
data_X = load_data.data
data_y = load.data.target
#导入模块
from sklearn.model_selection import train_test_split
from sklearn import datasets
#k近邻函数
from sklearn.neighbors import KNeighborsClassifier
iris = datasets.load_iris()
#导入数据和标签
iris_X = iris.data
iris_y = iris.target
#划分为训练集和测试集数据
X_train, X_test, y_train, y_test = train_test_split(iris_X, iris_y, test_size=0.3)
#print(y_train)
#设置knn分类器
knn = KNeighborsClassifier()
#进行训练
knn.fit(X_train,y_train)
#使用训练好的knn进行数据预测
print(knn.predict(X_test))
print(y_test)

Python Outlier Detection(PyOD)
特别需要注意的是,异常检测算法基本都是无监督学习,所以只需要X(输入数据),而不需要y(标签)。PyOD的使用方法和Sklearn中聚类分析很像,它的检测器(detector)均有统一的API。所有的PyOD检测器clf均有统一的API以便使用,完整的API使用参考可以查阅(API CheatSheet - pyod 0.6.8 documentation):

  • fit(X): 用数据X来“训练/拟合”检测器clf。即在初始化检测器clf后,用X来“训练”它。
  • fit_predict_score(X, y): 用数据X来训练检测器clf,并预测X的预测值,并在真实标签y上进行评估。此处的y只是用于评估,而非训练
  • decision_function(X): 在检测器clf被fit后,可以通过该函数来预测未知数据的异常程度,返回值为原始分数,并非0和1。返回分数越高,则该数据点的异常程度越高
  • predict(X): 在检测器clf被fit后,可以通过该函数来预测未知数据的异常标签,返回值为二分类标签(0为正常点,1为异常点)
  • predict_proba(X): 在检测器clf被fit后,预测未知数据的异常概率,返回该点是异常点概率

当检测器clf被初始化且fit(X)函数被执行后,clf就会生成两个重要的属性:

  • decision_scores: 数据X上的异常打分,分数越高,则该数据点的异常程度越高
  • labels_: 数据X上的异常标签,返回值为二分类标签(0为正常点,1为异常点)

不难看出,当我们初始化一个检测器clf后,可以直接用数据X来“训练”clf,之后我们便可以得到X的异常分值(clf.decision_scores)以及异常标签(clf.labels_)。当clf被训练后(当fit函数被执行后),我们可以使用decision_function()和predict()函数来对未知数据进行训练。

from pyod.models.knn import KNN   # imprt kNN分类器
import sklearn
import pyod
import numpy as np

# 训练一个kNN检测器
clf_name = 'kNN'
clf = KNN() # 初始化检测器clf

# 通过np创建一个toy数据
X1 = np.random.randn(200, 20)
X2 = np.random.rand(40,20)*5
X_train = np.r_[X1,X2]



clf.fit(X_train) # 使用X_train训练检测器clf

# 返回训练数据X_train上的异常标签和异常分值
y_train_pred = clf.labels_  # 返回训练数据上的分类标签 (0: 正常值, 1: 异常值)
y_train_scores = clf.decision_scores_  # 返回训练数据上的异常值 (分值越大越异常)

y_train_pred
#array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 #      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
#       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
#       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
#       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 #      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 #      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 #      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 #     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
#       0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1,
  #     0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0])

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值