Python 离群值检测算法--ECOD

[复制链接]
作者: Andrew Timmons | 时间: 2024-5-2 16:54:35 | 其他|
0 231

1968

主题

1968

帖子

5904

积分

研究生

Rank: 9Rank: 9Rank: 9

积分
5904
发表于 2024-5-2 16:54:35| 显示全部楼层 |阅读模式
基于经验累积分布的离群值检测(ECOD)是一种直观的方法,通过测量罕见事件在分布中的位置来识别异常值。
ECOD首先以非参数方式估计变量的分布,然后将所有维度的估计尾部概率相乘,得出观测值的异常得分。ECOD假设变量独立,并且可以估算出每个变量的经验累积分布。虽然变量独立的假设可能过于严格,但这并不是新的假设,因为前一章中的HBOS也做了同样的假设,并且已被证明是有效的。

ECOD 的优势是什么?
ECOD 作者证实了它优于其他流行的基线检测方法。由于 ECOD 无需调整超参数,因此在处理大量数据时速度很快。在一台标准的个人笔记本电脑上处理一个包含一百万个观测值和一万个特征的大型数据集只需要大约两个小时。

另一个 ECOD 的优点是易于解释。您可以通过它检查多个尾部概率对最终离群值的影响。

ECOD 如何工作?
许多读者熟悉参数分布,但不熟悉非参数分布。我将介绍什么是参数分布和非参数分布,并谈谈非参数分布的形成。然后,我将介绍 ECOD 算法,然后比较 ECOD 和 HBOS。

理解经验累积分布函数
为了解释 "非参数 "和 "参数 "这两个术语,我们需要澄清几个相关术语 "群体"、"样本 "和 "估计值"。统计学的目标是了解我们感兴趣的 "总体"。均值、标准差和比例等量被称为描述总体的 "参数"。通常无法获得整个群体的所有数据,因此无法计算描述群体的参数。一个实用的解决方案是收集随机 "样本 "来描述总体。通过样本的分布,我们可以 "估计 "出描述总体分布的参数。

非参数方法假设不对群体分布的形状和参数做任何假设,而是根据样本经验进行估计。相比之下,参数方法则对基本人口的分布形状做出假设,如正态分布。

让我来演示一下非参数方法,并根据经验估计一个分布。我任意汇总了三个伽马分布和一个正态分布来生成一个不遵循任何特定形状的分布(见图1)。右尾部存在一些极端值。

# Create a distribution that is the combination of three other distributions from matplotlib import pyplot from numpy.random import normal, gamma from numpy import hstack shape, scale = 10, 2. s1 = gamma(shape, scale, 1000) s2 = gamma(shape * 2, scale * 2, 1000) s3 = normal(loc=0, scale=5, size=1000) sample = hstack((s1, s2, s3)) # plot the histogram pyplot.hist(sample, bins=50) pyplot.show

图(1)数据分布
为了根据经验估计分布情况,我使用 Python statmodels模块中的 ECDF来推导累积分布函数 (CDF),如图 (2) 所示。

# fit a cdf from statsmodels.distributions.empirical_distribution import ECDF sample_ecdf = ECDF(sample) # plot the cdf pyplot.plot(sample_ecdf.x, sample_ecdf.y) pyplot.show


在图 (2) 中,我选择了一些位置来显示累积概率,例如,X
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回列表 返回顶部