如何向现有数据添加异常值?

机器算法验证 r 数据挖掘 异常值 相似之处
2022-03-30 08:31:11

我想测试一些用于异常值检测的相似性度量。我从 UCI 存储库中获得了一些数据,例如:Breast-Cancer

是否有一种聪明的方法可以将人工异常值添加到现有数据中?

谢谢你。

3个回答

您可以向现有数据对象添加随机噪声,即将给定百分比的数据条目更改为数据范围内的随机值,或者在两个数据对象之间交换一些条目(这不会改变该维度中的值分布)。这种方法常用于测试算法的鲁棒性。在您的情况下,它也可能很有用。

此处描述了该方法:Assessing data mining results via swap randomization

也许这篇论文很有用:用于聚类和异常值分析的合成数据生成器

有两种常见的方法:

  1. 通过随机化方法将异常值添加到真实数据中。

  2. 为了获得一个稀有类,将一个类下采样到所需的稀疏度(通常,这应该 <<1%)

对于 1 有一些变体 - 修改单个属性,绘制每个属性,但来自不同的实例等;就个人而言,我完全不相信这些方法因为它们模拟了数据稀释的特定效果,因此通常支持围绕相同异常值概念设计的算法。当您的真正异常值不是由这种非常特殊的错误引起时,在此类数据集上表现良好的方法通常会失败。

对于 2,您将不得不面对一个事实,即某些数据集太难了。一个类比其他类更罕见的事实并不意味着它们真的是异常值即使您将其下采样到极端。另外,这种方法也很幼稚:它假设多数类不包含异常值。在我见过的任何真实数据集中,每个班级也会在班级内有异常值所以不要指望你的方法能够在这些数据集上达到 90%。如果你能从 70% 提高到 80%,那么你的方法已经很有效了。任何超过 80% 的值都可能表明存在一些偏见恕我直言。

在查看异常值检测论文时,我认为任何高于 0.80 的结果都是可疑的:要么数据集为算法设计的太多,要么系统地调整算法参数以找到可能的最佳结果,要么结果完全是假的.

在我看到使用 WBC 数据集的大多数情况下,他们将癌症类别下采样到 10 个实例。但是,您不应该告诉您的算法获得前 10 个结果。在真实场景中,您不知道要找到 10 个异常值...

正如评论已经讨论的那样,异常值通常被认为与模型有关。但这并没有说明它们是如何生成的:它们可能是模型描述的过程中的罕见事件(大约 10⁹ 标准正态分布数中的 1 个将 < -6),或者它们可以由以下过程生成不包含在您的模型中。

通常,人们并不关心前者,因为该模型对他们来说已经足够了。

但是对于后者,您只能模拟您对生成过程有所了解的事物。如果你想要意想不到的罕见事件,除了收集数据并等待它们发生之外别无他法。恕我直言,在不讨论底层流程/问题/任务(不仅是模型)的情况下讨论这个是没有意义的。您无法给出典型的异常值正是这些事物的本质。您需要讨论异常值生成过程与模型和问题的相关性。恕我直言,没有免费的午餐定理非常适用于异常值检测。

推荐阅读 ;-) “机器学习八卦杂志”论文,其中几份仍然在网上流传