异常检测(1)—初识异常检测

2023-05-16

1.概念

异常一般是指与标准值(预期值)有偏离的样本点,也就是跟绝大部分数据“长的不一样” 。异常往往是“有价值”的事情,我们对异常的成因感兴趣 。
在这里插入图片描述

2.类别

  • 有监督:数据集有标签
  • 无监督:数据集无标签(异常检测往往是在无监督模式下进行的,获取的数据都是无标签的
  • 半监督:数据集只有单一类别(正例)有标签,没有异常实例参与训练

3.应用

  • 金融行业反欺诈、信用卡诈骗检测:把欺诈或者金融风险当作异常
  • 罕见病检测:把罕见病当作异常,比如罕见早期的阿尔兹海默症
  • 入侵检测:把网络流量中的入侵当作异常
  • 机器故障检测:实时检测发现或预测机器故障
  • 图结构、群体检测:比如检测疫情的爆发点等

4.方法

(1)传统方法

  • 基于统计学的方法:拟合给定数据集的生成模型,并对它进行学习,该模型低频率区域的对象为异常数据,把他们作为异常点。(正常的数据对象符合一定的数据模型,而不遵守该模型的数据是异常的)
    数据正态分布图
    如图所示,数据集中的样本符合正态分布,当x的正态分布值小于设定的某个阈值时,就可以认为这个样本是异常的,如上图,设定阈值为,满足的样本x都可以被视为异常点。
    更多可参考统计学方法
  • 线性模型:如PCA,对数据集进行降维,计算特征向量,降维后的数据在很大程度上保留了原始数据的特征,异常样本点距离特征向量的距离比较远,对这个距离设置一个阈值,超过此阈值的数据点被视为异常点。
  • 基于相似度的方法:此方法适用于数据点聚集程度高、离群点较少的情况,需要对每个数据点进行计算,因此计算开销大,不适用于数据量大、维度高的数据。
    • 基于集群的检测:如DBSCAN等聚类方法,在聚类时,异常点不属于任何一个簇。该方法将数据点划分为一个个对应的簇,那些不能被归为某一个簇的数据点被视为异常点。这类算法对簇个数的选择高度敏感,数量选择不当可能造成较多正常值被划为离群点或成小簇的离群点被归为正常。因此对于每一个数据集需要设置特定的参数,才可以保证聚类的效果,在数据集之间的通用性较差。聚类的主要目的通常是为了寻找成簇的数据,而将异常值和噪声一同作为无价值的数据而忽略或丢弃,在专门的异常点检测中使用较少。
    • 基于距离的度量方法:如KNN方法,异常点到其临近的前K个点的距离比正常数据点要大。k近邻算法的基本思路是对每一个点,计算其与最近k个相邻点的距离,通过距离的大小来判断它是否为离群点。在这里,离群距离大小对k的取值高度敏感。如果k太小(例如1),则少量的邻近离群点可能导致较低的离群点得分;如果k太大,则点数少于k的簇中所有的对象可能都成了离群点。为了使模型更加稳定,距离值的计算通常使用k个最近邻的平平均距离。
    • 基于密度的度量方法:如LOF(局部离群因子)方法,异常点周围点的密度较低。相对于其邻居的局部密度偏差而不是距离来进行度量。它将相邻点之间的距离进一步转化为“邻域”,从而得到邻域中点的数量(即密度),认为密度远低于其邻居的样本为异常值。

(2)集成方法

集成算法是将多个基检测器的输出结合起来(与bagging类似),一些算法在数据集的某些子集上表现很好,一些算法在其他子集上表现很好,然后集合起来,使得输出更具鲁棒性。
孤立森林:孤立森林是用一个随机超平面切割数据空间(数据集),切一次可以生成两个子空间。然后继续用随机超平面来切割每个子空间并循环,直到每个子空间只有一个数据点为止。直观上来讲,那些具有高密度的簇需要被切很多次才会将其分离,而那些低密度的点很快就被单独分配到一个子空间了。孤立森林认为这些很快被孤立的点就是异常点。
孤立森林
如上图,d点最早被分割开,所以d点较大概率为异常点。

(3)机器学习方法

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

5.常用库:PyOD、Sklearn、TODS

  • PyOD:2019年开发的专门用于异常检测的库,包含30多种异常检测算法,从经典模型到深度学习模型一应俱全,用法和Sklearn的一样。
  • TODS:与PyOD类似,包含多种时间序列上的异常检测。
  • Sklearn: 分类(Classification)、回归(Regression)、聚类(Clustering)、降维(Dimensionality Reduction)、模型选择(Model Selextion)、特征工程(Preprocessing)

6.应用

#导库
from pyod.models.knn import KNN
#generate_data样本生成函数
from pyod.utils.data import generate_data,evaluate_print
from pyod.utils.example import visualize
#准备数据
#contamination异常数据的百分比,n_train训练集的数量,n_test测试集的数量,n_features产生数据的特征数
X_train,y_train,X_test, y_test = generate_data(n_train=500,n_test=100,n_features=2,contamination=0.1)
#KNN检测器
clf_name='KNN'
clf=KNN()#初始化检测器
clf.fit(X_train)#训练检测器模型
#得到训练集的预测标签和异常值得分
y_train_pred=clf.labels_#返回训练集上的分类标签(0为正常值,1为异常值)
y_train_scores=clf.decision_scores_#返回训练数据上的异常值(值越大越异常)
#在测试集上进行训练
y_test_pred = clf.predict(X_test) #返回测试集上的分类标签 
y_test_scores = clf.decision_function(X_test)#异常值(值越大越异常)
#使用ROC和Precision @ Rank n评估预测
print("\nOn Training Data:")
evaluate_print(clf_name, y_train, y_train_scores)
print("\nOn Test Data:")
evaluate_print(clf_name, y_test, y_test_scores)

运行结果:

On Training Data:
KNN ROC:0.9974, precision @ rank n:0.98

On Test Data:
KNN ROC:1.0, precision @ rank n:1.0
#可视化所有示例
visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,
          y_test_pred, show_figure=True, save_figure=False)

运行结果:在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异常检测(1)—初识异常检测 的相关文章

随机推荐

  • 一致性哈希算法

    1 各位看官老爷 xff0c 请移步大佬博客 https www zsythink net archives 1182 2 goalng的脚本测试详见 https xie infoq cn article 78043810ecc807d18
  • git重命名远程分支名称

    例如 xff0c 已经在远程分支的master创建了一个名为feature add device的分支 xff0c 现在想将其更名为hotfix add device 1 重命名远程分支对应的本地分支 span class token fu
  • golang: 密码中允许出现数字、大写字母、小写字母、特殊字符,但至少包含其中2种且长度在8-16之间(四种符号任意满足三种即可)

    要求 密码中允许出现数字 大写字母 小写字母 特殊字符 xff08 64 amp xff09 xff0c 但至少包含其中2种且长度在8 16之间 xff08 四种符号任意满足三种即可 xff09 span class token keywo
  • golang生成分组树状结构

    1 需求 获取分组导航树 2 实现 span class token keyword package span main span class token keyword import span span class token punct
  • 蓝桥杯快速通关篇,pwm方波输出

    pwm方波输出 文章目录 pwm方波输出前言pwm是什么蓝桥桥杯是怎么考pwm输出的具体步骤官方库中的标准例程 修改代码时钟和GPIO输出频率的初始化不同占空比的pwm波输出验证程序是否工作 总结 xff08 重要 xff09 调用 xff
  • python实现文件断点下载

    1 需求 实现文件的断点下载 2 实现 xff1a span class token comment usr bin python span span class token comment encoding 61 utf 8 span s
  • shell脚本移动文件

    需求 移动 iotdata data edge ota file store 下的所有文件到 iotdata data edge download ota目录下 并删除旧目录 shell命令 span class token functio
  • golang字符串列表操作(求包含、交集、并集、差集)

    span class token keyword func span span class token function ContainsString span span class token punctuation span src s
  • golang获取postgres或clickhouse连接

    span class token keyword package span edgedb span class token keyword import span span class token punctuation span span
  • grpc-gateway插件:让客户端通过调http接口来远程调用grpc服务

    背景 xff1a 公司内部各服务 java pyhton go 想调取中台数据中心数据 xff0c 中台有两种服务搭建选择 xff1a 1 REST http请求 2 RPC 远程过程调用 实现及遇到的坑 使用Go将HTTP JSON转编码
  • ubuntu安装和卸载python3.8

    背景 xff1a 工作中 xff0c 可能会分配虚拟机给到开发者 xff0c 开发者需要在上面调试 xff0c 开发 xff0c 打包等操作 xff0c 依赖python环境 操作 网上安装步骤很多 xff0c 但很多文章描述的不够清晰 x
  • golang单例模式加载服务配置

    golang中单例模式体现在很多地方 xff0c 比如init函数 xff0c 当包被导入的时候只会被执行一次 实现单例模式有很多种方式 xff0c 这里给出几种简单的实现 xff1a 互斥锁 对全局共享变量加锁 xff0c 如果该变量不是
  • go面试题

    1 json包在使用的时候 xff0c 结构体里的变量不加tag能不能正常转成json里的字段 xff1f 如果变量首字母小写 xff0c 则为private 无论如何不能转 xff0c 因为取不到反射信息 如果变量首字母大写 xff0c
  • golang windows弹窗功能实现

    代码示例 span class token keyword package span main span class token keyword import span span class token punctuation span s
  • golang获取windows系统有线活跃网卡及IP配置

    代码 span class token keyword package span network span class token keyword import span span class token punctuation span
  • !!!Chapter 2 The Physical Layer

    2 1 The Theoretical Basis for Data Communication Fourier Analysis Any reasonably behaved periodic function g t with peri
  • 启动golang项目编译的exe可执行文件获取windows管理员权限(UAC)

    背景 xff1a go代码启动以后里面涉及到修改ip地址等操作 xff0c 需要管理员权限 打包好的exe文件双击执行默认是没有管理员权限的 xff0c 那么修改ip就会提示需要管理员权限 解决方法1 xff1a 右键以管理员权限运行exe
  • k8s外部访问pod内部容器的端口-NodePort

    一 如何从外部网络访问 Kubernetes的Pod IP和Cluster IP都只能在集群内部访问 xff0c 而我们通常需要从外部网络上访问集群中的某些服务 xff0c Kubernetes提供了下述几种方式来为集群提供外部流量入口 二
  • python断点下载文件

    使用pytohn编码实现文件的断点下载 span class token keyword import span os span class token keyword import span json span class token k
  • 异常检测(1)—初识异常检测

    1 概念 异常一般是指与标准值 xff08 预期值 xff09 有偏离的样本点 xff0c 也就是跟绝大部分数据 长的不一样 异常往往是 有价值 的事情 xff0c 我们对异常的成因感兴趣 2 类别 有监督 xff1a 数据集有标签无监督