博客专栏

EEPW首页 > 博客 > 独家 | 在Python中使用广义极端学生化偏差(GESD)进行异常检测

独家 | 在Python中使用广义极端学生化偏差(GESD)进行异常检测

发布人:数据派THU 时间:2021-06-16 来源:工程师 发布文章

作者:Shaleen Swarup

翻译:欧阳锦

校对:王可汗

本文从理论和实践角度介绍了使用广义极端学生化偏差(GESD)进行异常检测的方法,展示了Python代码示例和相关源码。

关键字:Python 异常值检测 ESD


异常检测在生活中起着非常重要的作用。通常,异常数据可能与某种问题或罕见事件有关,例如 ****欺诈、医疗问题、结构缺陷、设备故障等。这种联系使得能够挑选出哪些数据点可以被视为异常值是非常有趣的,因为从商业角度识别这些事件通常是十分有趣的事情。

此外,许多统计方法对异常值的存在很敏感。例如,平均值和标准差的计算可能会被单个严重不准确的数据点所影响。检查异常值应该是任何数据分析的常规部分,并且应该检查潜在的异常值以查看它们是否可能是错误的数据。

什么是异常值检测

任何发现数据集异常值的过程都可以被称为异常检测;也就是检测那些不合群的事物。这些异常可能是异常的网络流量,fritz上的一个传感器,或者只是分析前识别要清理的数据。

清理的数据

https://www.bmc.com/blogs/data-normalization/

基于不同方案或方法的多种技术可以用来识别异常。例如,图形的方法(箱线图、散点图);基于距离的方案(最近邻算法、聚类算法);统计方法(GESD、基于四分位数的技术)等等。每种方案都有其优缺点,其效果都取决于实际用例。

在本文中,我们将重点关注GESD(广义极端学生化偏差)并在Python中实现一个简单的示例以更好地了解它的原理。在开始之前,我想说明,这篇文章深受我的探索性数据分析教授Edward McFowland和Bhavesh Bhatt在YouTube上的机器学习和统计教程的讲座的启发。

机器学习和统计教程

https://www.youtube.com/channel/UC8ofcOdHNINiPrBA9D59Vaw

什么是广义极端学生化偏差(Generalized Extreme Studentized Deviate)

GESD是一种简单的统计方法,用于检测遵循近似正态分布的单变量数据集中的一个或多个异常值。统计方法假设常规数据遵循某种统计模型(或分布),而不遵循模型(或分布)的数据则是异常值。

GESD克服了Grubbs检验和Tietjen-Moore检验的主要限制:即必须明确确定疑似异常值的数量k。如果没有正确指定k,则可能会扰乱这些测试的结论。而GESD测试只要求确定疑似异常值数量的上限。

给定上限r,GESD测试基本上执行r个单独的测试:一个异常值的测试,两个异常值的测试,依此类推直到r个异常值。

GESD测试定义在以下假设上:

H0:数据集中没有异常值

Ha:数据集中最多有r个异常值

GESM的检验统计量公式如下:

1.png

GESD的检验统计量

这里,x_bar和σ分别表示样本均值和样本标准差。

在GESD中,我们删去使得 | xi - x_bar | 最大化的观测值。然后,用n-1个观察值重新计算上述统计量。我们重复这个过程,直到r个观测值被移除。我们由此得到r统计量R1, R2 ……, Rr。通过代码示例,这个过程将变得更加清晰。

对应于r检验统计量,由以下公式计算r的临界值:

2.png

临界值计算

其中 tp, ν 是具有ν自由度的t分布的100p百分点,并且

t分布

https://www.itl.nist.gov/div898/handbook/eda/section3/eda3664.htm

3.png

我们的显著性水平将用α表示。

异常值的数量是通过找到能满足Ri > λi的最大的i来确定的。

Rosner的模拟研究表明,该近似临界值对于样本数量n ≥ 25非常准确,对于n ≥ 15也相当准确。

请注意,尽管GESD本质上是依序使用Grubbs测试而实现的,但仍有一些重要区别:

Grubbs测试

https://www.itl.nist.gov/div898/handbook/eda/section3/eda35h1.htm

GESD测试会根据被测试的异常值的数量对临界值进行适当的调整,而依序使用Grubbs测试的则没有这样的调整。

如果遮蔽效应明显,Grubbs 测试的依次使用可能会过早停止。

现在再巩固一下理论部分,在Python中实现GESD以了解它的实际工作原理吧。

首先,模拟我们的数据。这里我们创建了0到1之间的100个随机值。数据的散点图如下所示。

4.png5.png

现在,我们特意在数据中放入一些异常值进行识别。

6.png

有异常值的数据

现在我们将创建单独的函数来计算检验统计量和临界值。

计算检验统计量的函数如下:

7.png

计算临界值的函数如下:

8.png

下面这个函数将所有内容汇总在一起并执行r次以识别异常值的数量。对于每次迭代,我们使用上面的函数来计算使得|xi - x_bar| 最大化的检验统计量,并计算其相应的临界值,然后从我们的数据中删除这个观测值以进行下一次迭代。

9.png

在我们的数据上以5%的显着性水平和具有7个异常值上限的情况调用这个函数会产生以下结果:

10.png

可以看到一共进行了7次检验。异常值的数量是通过找到满足Ri > λi的最大的i来确定的。对于此示例,检验统计量大于临界值(在显着性水平为5%时)的最大异常值数为3。因此,我们得出结论,该数据集中有3个异常值。

代码链接:

https://gist.github.com/shaleenswarup/77c711ac5bade7c8735fd309d94348ef#file-gistfile1-py

这就是Python中使用GESD进行异常检测的实现。希望本文对您实现这种在数据中查找异常值的简单而有效的方法有所帮助。想查看更多项目,请查看作者的 Github 个人资料。

作者的 Github 个人资料

https://github.com/shaleenswarup

引用

1. bmc | Anomaly Detection with Machine Learning: An Introduction by Jonathan Johnson

2. Anomaly detection using PCA from datascience904

https://datascience904.wordpress.com/2019/10/14/anomaly-detection-using-pca/

3. Generalized ESD Test for Outliers from Engineering Statistics

https://www.itl.nist.gov/div898/handbook/eda/section3/eda35h3.htm

原文标题:

Anomaly Detection with GESD (Generalized Extreme Studentized Deviate) in Python

原文链接:

https://towardsdatascience.com/anomaly-detection-with-generalized-extreme-studentized-deviate-in-python-f350075900e2

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

电路相关文章:电路分析基础


pic相关文章:pic是什么




关键词: Python

相关推荐

技术专区

关闭