时间序列中的异常值检测:如何减少误报?

机器算法验证 时间序列 异常值 计算统计
2022-03-24 03:44:37

我正在尝试自动执行时间序列中的异常值检测,并且我使用了 Rob Hyndman在此处提出的解决方案的修改。

比如说,我测量来自不同国家/地区的网站的每日访问量。对于一些每日访问量为数百或数千的国家,我的方法似乎是合理的。

然而,如果一个国家每天只有 1 或 2 次访问,则算法的限制非常窄(例如 1 ± 0.001),因此 2 次访问被视为异常值。我怎样才能自动检测到这种情况,我怎样才能处理它们来识别异常值?我不想设置手动阈值,例如每天 100 次访问。

谢谢!

4个回答

不要对小的离散计数抱有太大期望。从 1 次访问到 2 次访问是 100% 的增长,从 0 到 1 次访问是无限增长。在低级别,您可能正在处理零膨胀模型,并且那里也可能非常嘈杂。

根据我的经验,像这样混合大小计数的计数数据会导致您的小计数出现两个问题:1)它们太粗糙而无法做很多事情,2)它们是由不同的过程生成的。(想想小型的农村邮局与大城市的邮局)。因此,您至少需要将您的建模一分为二:针对较大的计数做您成功做的事情,并针对较小的计数做一些不同的事情——更粗略和更近似。但不要期望太多的小数目。

好消息是,根据定义,大数据包括您的更多交易,因此您更好的模型涵盖更多数据,即使它可能无法涵盖您的大部分网站。

(我说“建模”是通用的,但是异常值检测当然是假设一个特定的模型并找到该模型假设极不可能的点。)

时间序列中的每个值都是概率分布中的一个样本。您需要首先找到概率分布是什么,然后定义稀有这个词在该分布中的含义。

因此计算经验 cdf,并计算 95% 置信区间。每当发生该区域之外的事情时,根据定义,您就知道这一定是罕见的事件。

您遇到了这个问题,因为您的数据远非正态分布。如果分布高度不对称,有隆起、隆起或太长/太短的尾巴,您会遇到问题。一个好主意是在使用您的方法之前应用像 Box Cox 或 Yeo-Johnson 这样的转换。在您的示例中,如果您使用 F(x) = log(1+x) ,则可以避免不同幅度问题,并且可以使用以下方法转换回来: exp(z) -1

您可以使用几个过程来自动为 Box-Cox 转换找到一个好的 lambda。我个人使用 R 中 AID 包中 boxcoxnc 函数的所有方法的中位数。如果您的数据不是严格正数,则需要在使用之前添加 1 或其他正数。

在特定的置信水平上检测离群值是一回事,而放置第二个规范会进一步限制对离群值的接受是另一回事。我曾经被问到以下问题“AUTOBOX 能否在预先指定的置信水平上检测到 xx 个单位的平均偏移”。基本上需要的是双重测试。AUTOBOX 是我帮助开发的一款软件,您可能会发现它具有成本效益,因为没有免费软件实现了这种双重测试。

谢谢尼克:我使用电平转换作为“异常值”的一个特定示例,或者通常是经验确定的确定性影响。其他形式的“异常值”是脉冲、季节性脉冲和本地时间趋势以及特定组合,例如到新水平的瞬时变化。主要的一点是,可能有两个假设在起作用,反映了统计意义和现实世界的意义。最初引起我注意这个问题的客户对两者都感兴趣。