Python+Sklearn实现异常检测

   2023-02-09 学习力0
核心提示:目录离群检测 与 新奇检测Sklearn 中支持的方法孤立森林 IsolationForestLocal Outlier FactorOneClassSVMElliptic Envelope离群检测 与 新奇检测很多应用场景都需要能够确定样本是否属于与现有的分布,或者应该被视为不同的分布。离群检测(Outlier detectio

离群检测 与 新奇检测

很多应用场景都需要能够确定样本是否属于与现有的分布,或者应该被视为不同的分布。

  • 离群检测(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
 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 如何在Abaqus的python中调用Matlab程序
    目录1. 确定版本信息2. 备份python3. 设置环境变量4. 安装程序5. 调试运行参考资料Abaqus2018操作系统Win10 64位Python版本2.7(路径C:\SIMULIA\CAE\2018\win_b64\tools\SMApy\python2.7)2. 备份python将上述的“python2.7”文件夹复制出来,避免因操作错误
    03-16
  • SICP:复数的直角和极坐标的表示(Python实现)
    SICP:复数的直角和极坐标的表示(Python实现)
    数据抽象屏障是控制复杂性的强有力工具,然而这种类型的数据抽象还不够强大有力。从一个另一个角度看,对于一个数据对象可能存在多种有用的表示方式,且我们希望所设计的系统能够处理多种表示形式。比如,复数就可以表示为两种几乎等价的形式:直角坐标形式(
    03-16
  • [个人发展] 我做了一个可以永远谈论任何事情的女士对话AI(TypeScript,Python)
    [个人发展] 我做了一个可以永远谈论任何事情的
    在个人发展中对话式人工智能服务 Eveki我做了虚构角色1这是一项以人工智能为特色的服务,可以再现并享受自然对话。这一次,作为第一个艾小姐发表了。请先尝试实物。服务概览与人工智能对话基本上只需输入您的信息是。对话是用女士的语言进行的,就像人类一样
    03-08
  • ruby写爬虫 ruby python
    ruby写爬虫 ruby python
    http://www.javaeye.com/topic/545160爬虫性能比较http://www.rubyrailways.com/data-extraction-for-web-20-screen-scraping-in-rubyrails/srcapihttp://huacnlee.com/blog/ruby-scrapi-collect-koubei  2009年4月22日 星期三用ruby写的一个网络爬虫程序前
    03-08
  • sf02_选择排序算法Java Python rust 实现
    Java 实现package common;public class SimpleArithmetic {/** * 选择排序 * 输入整形数组:a[n] 【4、5、3、7】 * 1. 取数组编号为i(i属于[0 , n-2])的数组值 a[i],即第一重循环 * 2. 假定a[i]为数组a[k](k属于[i,n-1])中的最小值a[min],即执行初始化 min =i
    02-09
  • Python vs Ruby: 谁是最好的 web 开发语言?
    Python 和 Ruby 都是目前用来开发 websites、web-based apps 和 web services 的流行编程语言之一。 这两种语言在许多方面有相似之处。它们都是高级的面向对象的编程语言,都是交互式脚本语言、都提供标准库且支持持久化。但是,Python 和 Ruby 的解决方法却
    02-09
  • 详解Python手写数字识别模型的构建与使用
    详解Python手写数字识别模型的构建与使用
    目录一:手写数字模型构建与保存1 加载数据集2 特征数据 标签数据3 训练集 测试集4 数据流图 输入层5 隐藏层6 损失函数7 梯度下降算法8 输出损失值 9 模型 保存与使用10 完整源码分享二:手写数字模型使用与测试一:手写数字模型构建与保存1 加载数据集# 1加
  • Python asyncore socket客户端实现方法详解
    Python asyncore socket客户端实现方法详解
    目录介绍1.定义类并且继承 asyncore.dispatcher2.实现类中的回调代码调用父类方法创建socket对象连接服务器3.创建对象并且执行asyncore.loop进入运行循环服务端示例代码运行结果注意介绍asyncore库是python的一个标准库,提供了以异步的方式写入套接字服务的
  • Python基础教程之while循环用法讲解 Python中的while循环
    Python基础教程之while循环用法讲解 Python中的
    目录1.while 循环2.无限循环3、while 循环使用 else 语句4、简单语句组附小练习:总结1.while 循环Python 中 while 语句的一般形式:while 判断条件(condition):    执行语句(statements)……执行流程图如下:同样需要注意冒号和缩进。另外,在 Python 中
  • Python异常与错误处理详细讲解 python的异常
    基础知识优先使用异常捕获LBYL(look before you leap): 在执行一个可能出错的操作时,先做一些关键的条件判断,仅当满足条件时才进行操作。EAFP(eaiser to ask for forgiveness than permission): 不做事前检查,直接执行操作。后者更优: 代码简洁,效率更高
点击排行