Python+Sklearn实现异常检测
作者:Python数据开发 发布时间:2022-09-06 14:28:47
离群检测 与 新奇检测
很多应用场景都需要能够确定样本是否属于与现有的分布,或者应该被视为不同的分布。
离群检测(Outlier detection):训练数据包含离群值,这些离群值被定义为与其他观察值相差甚远的观察值。
新奇检测 (Novelty detection):训练数据没有离群点,需要观察新的样本是否包含离群点。
离群检测和新颖性检测都用于异常检测,其中人们对检测异常或不寻常的观察感兴趣。离群检测也称为无监督异常检测,新奇检测称为半监督异常检测。
在离群检测中离群值不能形成密集的集群,因为可以假设离群值位于低密度区域。相反在新颖性检测中,新颖性处于训练数据的低密度区域。
Sklearn 中支持的方法
如下图为scikit-learn 中异常值检测算法的比较,IsolationForest和LocalOutlierFactor在此处考虑的数据集上表现相当不错。而OneClassSVM对离群值很敏感,因此在离群值检测方面表现不佳。
但OneClassSVM仍可用于异常值检测,但需要微调其超参数nu以处理异常值并防止过度拟合。SGDOneClassSVM提供了复杂度更低的实现。而EllipticEnvelope假设数据是高斯分布的并学习一个椭圆。
ensemble.IsolationForest
neighbors.LocalOutlierFactor
svm.OneClassSVM
linear_model.SGDOneClassSVM
covariance.EllipticEnvelope
孤立森林 IsolationForest
孤立森林(Isolation Forest)是一种异常值检测算法。它通过建立多棵决策树,并在每棵树中随机选取一个特征将数据集划分为两个子集来实现异常值检测。与其他决策树算法不同的是,孤立森林算法并不是用来预测目标变量的值的,而是用来预测数据点是否是异常值。
为了计算出每个数据点是否是异常值,孤立森林算法对每个数据点计算出一个分数,称为异常分数。数据点的异常分数越低,说明它越可能是一个异常值。通常情况下,我们可以设定一个阈值,如果数据点的异常分数低于这个阈值,就认为这是一个异常值。
关键参数:
n_estimators:学习器个数
max_samples:采样最大样本个数
max_features:采样最大特征个数
from sklearn.ensemble import IsolationForest
X = [[-1.1], [0.3], [0.5], [100]]
clf = IsolationForest(random_state=0).fit(X)
# 预测特定样本是否为异常值
# 对于每个观察值,返回 (+1 或 -1) 分别代表正常样本和异常值
clf.predict([[0.1], [0], [90]])
Local Outlier Factor
Local Outlier Factor (LOF) 是一种用于检测数据集中异常或异常数据点的算法。LOF 背后的基本思想是测量给定数据点与其相邻数据点的局部偏差。如果一个点与其相邻点有显着差异,则将其视为异常值。一个点被视为离群值的程度通过称为局部离群值因子的度量来量化。
首先确定该点邻居的密度,密度计算方法是将给定距离内的邻居数除以具有该距离的球体的体积。较高邻居密度的点被认为比具有较低邻居密度的点更不离群。然后将一个点的 LOF 计算为该点与其相邻点的密度之比。具有高 LOF 值的点被认为是异常值。
关键参数:
n_neighbors:最近邻样本个数
metric:距离计算方法
import numpy as np
from sklearn.neighbors import LocalOutlierFactor
X = [[-1.1], [0.2], [101.1], [0.3]]
clf = LocalOutlierFactor(n_neighbors=2)
# 异常/离群值返回 -1,离群值返回 +1
clf.fit_predict(X)
OneClassSVM
OneClassSVM是一种用于检测异常点的算法,是一种无监督学习算法。决策边界将数据点分为两类:内点和外点。非离群点是与训练集中的大多数点相似的点,而离群点是与训练集中的大多数点显着不同的点。
为了学习决策边界,OneClassSVM最大化边界和内点之间的距离,最终找到合适的超平面。这个超平面可以最大化内点和决策边界之间的边距。一旦学习了决策边界,就可以使用它来将新点分类为内点或异常点。
关键参数:
kernel:SVM内核类型
nu:训练误差分数的上限
from sklearn.svm import OneClassSVM
X = [[0], [0.44], [0.45], [0.46], [1]]
clf = OneClassSVM(gamma='auto').fit(X)
# 异常/离群值返回 -1,离群值返回 +1
clf.predict(X)
在实际使用中OneClassSVM速度较慢,因此可以考虑使用随机梯度下降求解线性的SVM来代替,也就是SGDOneClassSVM。
Elliptic Envelope
椭圆包络(Elliptic Envelope)是一种检测数据集中异常或异常数据点的方法。它是一种无监督学习方法,通过将椭圆拟合到训练集中的数据点来工作,但假设大多数点遵循高斯分布。
为了拟合椭圆,椭圆包络估计数据点的均值和协方差,并使用这些估计值来确定椭圆的形状和方向。一旦学习了椭圆,它就可以用来将新点分类为内点或异常点。
import numpy as np
from sklearn.covariance import EllipticEnvelope
true_cov = np.array([[.8, .3],
[.3, .4]])
X = np.random.RandomState(0).multivariate_normal(mean=[0, 0],
cov=true_cov,
size=500)
cov = EllipticEnvelope(random_state=0).fit(X)
# predict returns 1 for an inlier and -1 for an outlier
cov.predict([[0, 0],
[3, 3]])
来源:https://blog.csdn.net/m0_59596937/article/details/128403378


猜你喜欢
- 前言这几年对运维人员来说最大的变化可能就是公有云的出现了,我相信可能很多小伙伴公司业务就跑在公有云上, 因为公司业务关系,我个人
- 本文实例为大家分享了js实现酷炫倒计时动画的具体代码,供大家参考,具体内容如下前段时间和朋友去音乐餐厅吃饭,中间有个活动,然后看到他们软件公
- WEB程序员的技能要求: Web程序员不光要对 后端程序(如 php,jsp,asp.net)语言知识,对程序设计架构知识,数据库
- validator库参数校验若干实用技巧在web开发中一个不可避免的环节就是对请求参数进行校验,通常我们会在代码中定义与请求参数相对应的模型
- 不用库,写了很久,一直出bug,到网上一搜,可以直接输入之后,eval(str)即可得到结果!eval程序如下:s=input("
- 1、preferences->Java->Code Style->Code Formatter->Show... ,
- 官网下载先去官网下载MySQL链接跳转的是mysql的下载地址:https://dev.mysql.com/downloads/mysql/
- 1.环境设置1.1gradio安装需要安装 gradio,安装办法就是 pip install gradio2.ffmpeg安装再次需要加入
- 对于某些项目来说,单页面不能很好的满足需求,所以需要将vue-cli创建的单页面项目改为多页面项目。需要修改以下几个文件:1、下载依赖glo
- 深度学习中,模型训练一般都需要很长的时间,由于很多原因,导致模型中断训练,下面介绍继续断点训练的方法。方法一:载入模型时,不必指定迭代次数,
- 这个目前还是有个别无法显示,翻了下msdn貌似没看到更好的解决方案,暂时放弃继续研究,有晓得完全解决的朋友不妨回复说一声。 先附bat创建畸
- selenium操作chrome浏览器需要有ChromeDriver驱动来协助。webdriver中关浏览器关闭有两个方法,一个叫quit,
- 推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列(的一种结构
- 运行的时候,有时候会出现语法错误: IndentationError: unexpected indent可以用如下方法
- 简介:记录一下关于 Python 环境软件包的一些安装步骤1、升级 Python 到 2.7.10( 默认 2.6.6 )shell >
- 本文实例总结了python选择排序算法。分享给大家供大家参考。具体如下:代码1:def ssort(V):#V is the list to
- MySQL批量插入数据脚本#!/bin/bashi=1;MAX_INSERT_ROW_COUNT=$1;while [ $i -le $MA
- 在网站的一些应用中需要提供用户直接打印页面的功能,最明显的就是电子优惠券,商家根据网站提供的模板输入内容,然后生成优惠券页面,用户打印这个页
- 例:公司员工采取三个轮班制度:凌晨0:00到早上8:00为第一班,早上8:00到下午4:00为第二班,下午4:00到晚上12:00为第三班。
- 今天接到一个小需求,就是想在windows环境下,上传压缩文件到linux指定的目录位置并且解压出来,然后我想了一下,这个可以用python