去除极端样本的迭代过程

机器算法验证 异常值
2022-03-18 17:27:01

我的样本遵循重尾分布。我使用一个过程来检测和删除“极端”样本,如下所示:

  1. 测量样本的平均值和标准偏差。
  2. 删除高于平均值加上 4 个标准差的样本。
  3. 从第 1 步开始重复 - 总共 3 次。

如果没有极端样本,则上述过程不删除;如果有很多,那么它们会扭曲均值/std.dev,但是,多次迭代会解决这个问题。

对于我的问题,上述算法删除了 0-5% 的样本,经验测试表明它运行良好并且看起来相当稳健。

但是,这个过程合理吗?它有一个正式的名称来查找它吗?

请注意,我不能只找到我们拒绝样本的“最佳”标准偏差数,因为整个过程需要针对多个数据集自动化并作为实时系统的一部分运行。数据集相似但不完全相同:有时它们很小并且没有异常值(丢失样本并不奢侈);有时它们很大,需要删除的极端示例的数量各不相同,而且可能非常高。

数据代表用户操作(每种操作类型一个变量),我们需要比较多组用户(不同的细分)。然而,许多“用户”实际上是机器人,它们通常(但不总是)多次执行相同的操作(比人类做的次数多得多)。公平地说,我们混合了两种我们无法真正区分的分布,即人类用户和机器人。在我们移除尽可能多的机器人后,我们关心人类用户的行为差异。从长远来看,我们将为机器人构建一个分类器,但现在我们正在寻求一些快速的解决方案。

2个回答

您的方法的问题是您开始假设您的数据是正态分布的,而您已经知道它不是。一些异常值检测技术是相似的(它是合理的),但做出相同的假设。

您可能更喜欢MAD (中值绝对偏差)估计,而不是使用平均值和标准差,因为它是用于对数据进行阈值化的更稳健的偏差估计。另一种可能性是Tukey 的异常值检测算法。

不过,最重要的是,您指出您的数据可能是双峰的(用户和机器人)。我最熟悉标准的单峰方法。对于这种情况,您可能需要一些技术,例如 GMM 或核密度估计。我用谷歌搜索了一下,发现这篇论文看起来很有趣,很适合你的问题。

最后,还有一些用于异常值检测的技术,例如与分布无关的支持向量机,并且可以“开箱即用”工作,只要提供足够的数据。

只是注意警告!要非常小心你实现你提到的算法的方式。就个人而言,我对此有点怀疑。

原因是维度的诅咒。在高维问题中,由于所有点都位于边界上,因此它们看起来都像异常值。

作为您算法的一个简单反例,假设您在第一次运行中丢掉了 10 个点(指标为 4 个标准差 (sd))。在第二次运行时,您的标准差会缩小,因为您已经抛弃了极值点。现在第二次迭代的 4.sd 值会变小,因此你最终会扔掉更多的点。如果分布看起来像从原点衰减的正弦曲线,您可能最终会以极端为借口丢弃大部分点。

如果您认为我的分析是错误的(很可能是错误的),我将不胜感激您对我为什么错误地思考这个问题的看法