Amazon Redshift 中时间序列异常值检测的中值绝对偏差

Jos*_*eak 6 postgresql redshift

语境

我的任务是尝试检测 Amazon Redshift (PostgreSQL) 系统中时间序列数据中的异常值。也称为办公室周围的公共假期探测器。我一直使用的方法采用前 N 个数据点的窗口平均值,我还有一个窗口标准偏差,然后获取有关前 N 个点的统计数据并将以下内容应用于当前数据点:

(x0 - avg(x1:xN)) / stddev(x1:xN) > threshold
Run Code Online (Sandbox Code Playgroud)

因此,窗口长度阈值已经足够使用,但这种方法不是一个稳健的方法,因为在广告活动之后我们有了显着的增长,然后该系列大大偏离了运行平均值和标准差阈值,一切都是异常值。

减少窗口长度可以使其更快地适应这些变化,但它没有那么好的长期模型。

增加这种增长的阈值意味着我们之前检测到的异常值将不再被检测到。

这些相关问题在 R 中提供了建议,但答案经常提到中值绝对偏差作为一种稳健的方法:

https://en.wikipedia.org/wiki/Median_absolute_deviation

太长了;博士

如何在 Amazon Redshift 中对时间序列数据集实施中值绝对偏差?

我不确定我是否遗漏了该方法的一些基本知识,但我希望它仅适用于窗口,而不适用于整个数据集。尽管中值窗口函数不允许使用框架子句。

如果不是这种方法,那么请为我指出 Amazon Redshift 中更复杂的异常值检测查询的正确方向,我将不胜感激。

小智 4

我相信这对于 CTE 或子查询来说是非常可行的!

MAD 可以通过组合几个 Redshift 函数来计算:

  • 值列表的中位数
  • 每个值与中位数之间的差的绝对值
  • 这些值的中位数

我以以下形式写了这篇文章:

WITH
medians AS (
  SELECT
    t.values,
    MEDIAN(t.values) OVER () as median_value,
    ABS(t.values-MEDIAN(t.values) OVER ()) AS absolute_deviation
  FROM table AS t
  GROUP BY t.values
)
SELECT
  MEDIAN(absolute_deviation) OVER () AS median_absolute_deviation
FROM medians
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助