Python+Sklearn实现异常检测

 更新时间:2022年12月22日 08:56:42   作者:Python数据开发  
这篇文章主要为大家详细介绍了Python如何利用Sklearn实现异常检测,文中的示例代码讲解详细,对我们学习Python有一定的帮助,感兴趣的可以跟随小编一起学习一下

离群检测 与 新奇检测

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

  • 离群检测(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]])  

到此这篇关于Python+Sklearn实现异常检测的文章就介绍到这了,更多相关Python Sklearn异常检测内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一篇文章学会两种将python打包成exe的方式

    一篇文章学会两种将python打包成exe的方式

    最近有部分小伙伴问我,python 写的项目可不可以打包成exe程序,放到没有python环境上的电脑中执行? 答案当然是可以的,下面这篇文章主要给大家介绍了如何通过一篇文章学会两种将pyton打包成exe的方式,需要的朋友可以参考下
    2021-11-11
  • 在Python中使用列表生成式的教程

    在Python中使用列表生成式的教程

    这篇文章主要介绍了在Python中使用列表生成式的教程,列表生成式是Python具有的重要特性,需要的朋友可以参考下
    2015-04-04
  •  python中字符串的常见操作总结(二)

     python中字符串的常见操作总结(二)

    这篇文章主要介绍了python中字符串的常见操作,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • 解决nohup重定向python输出到文件不成功的问题

    解决nohup重定向python输出到文件不成功的问题

    今天小编就为大家分享一篇解决nohup重定向python输出到文件不成功的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • pytorch 多个反向传播操作

    pytorch 多个反向传播操作

    这篇文章主要介绍了pytorch 多个反向传播操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • python实现画循环圆

    python实现画循环圆

    今天小编就为大家分享一篇python实现画循环圆,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python获取当前用户的主目录路径方法(推荐)

    python获取当前用户的主目录路径方法(推荐)

    下面小编就为大家带来一篇python获取当前用户的主目录路径方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 初学python数组的处理代码

    初学python数组的处理代码

    初学python数组的处理代码,学习python的朋友可以参考下。
    2011-01-01
  • python如何制作英文字典

    python如何制作英文字典

    这篇文章主要为大家详细介绍了python如何制作英文字典,添加单词的意思,查询,退出,建立单词文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • linux安装python修改默认python版本方法

    linux安装python修改默认python版本方法

    在本文中我们给大家总结了关于linux安装python修改默认python版本的方法和相关知识点,需要的读者们参考下。
    2019-03-03

最新评论