确定点是否“离平均值太远”的算法

机器算法验证 异常值 质量控制
2022-03-27 04:55:07

长话短说,我收集了大约 30 个脚本,用于处理数据集并将它们放入数据库中。这些脚本报告它们的运行时间以及发生在单独数据库中的任何错误。我编写了另一个脚本,每天都通过这个数据库,并为每个脚本确定是否发生错误。它还会在 30 天前检查每个脚本的运行时间并取平均值。

我获取当前脚本的运行时间,看看它是否比平均值大 3 个标准差。如果是,我报告运行时间与平均水平相差太远。

这是执行此类任务的正确方法吗?我觉得好像我得到了太多“运行时间与平均水平相差太远”的错误。增加样本量会有所帮助,还是不适用 3 个标准差规则?我假设 99% 的数据位于 3 个标准差以内,并且检测异常值的可靠方法(一个需要“长时间”运行的脚本)将是使用这种方法。

2个回答

正如理查德指出的那样,三西格玛“规则”仅适用于正态分布(钟形曲线),这绝对不适用,因为您的运行时不能为负数:

数正态分布可能更准确,因为它至少只允许正运行时并且可能有点道理,无论如何:

但是,不要对您的运行时做出不同的“参数”假设(假设一些函数,您可以改用非参数方法。特别是,如果您有很多以前的运行,为什么不只看经验 CDF?这个只是一个函数,对于给定的x,为您提供f(x) = 小于给定值的先前看到的样本的比例。如果您希望通知 1% 的运行,只需查找耗时较长的运行超过之前运行的 99%(经验分布的第 99 个百分位)。

当值的分布是高斯(也称为“正态”)分布时,只有 1% 的样本超出 3 个标准偏差的“规则”有效。我不知道你的运行时间会得到什么分布。但它们很可能不是 Normal(它们不能小于零)。此外,不同的脚本可能有不同的分布——混合起来确实会破坏“正常性”。我不会说运行时间会不时变化的方式。

您应该查看每个脚本运行时的分布——获取大样本的直方图。然后才开始考虑均值和标准差。我希望这个邮件列表中的某个人可以建议对运行时数据进行转换,这可能会产生正态分布。

同时:如何查看每批次的最长运行时间?或者一个简单的(ASCII 风格)图形对于发现问题非常有帮助。当我在 1990 年代监视我们的网络性能时,我曾经使用如下的愚蠢的 UNIX shell 脚本。

: Display flipped histogram on ASCII display
sort -n|uniq -c|awk '{for(i=2;i<=NF;i++)printf("%s\t",$i);
mpl=85-NF*8;
if($1>=mpl)plot=mpl; else plot=$1;
for(i=1;i<=plot;i++)printf("="); print ""}'