我应该使用什么算法来检测时间序列上的异常?

机器算法验证 机器学习 时间序列 Python 计算统计 异常检测
2022-01-17 00:17:40

背景

我在网络运营中心工作,我们监控计算机系统及其性能。要监控的关键指标之一是当前连接到我们服务器的访问者\客户的数量。为了使其可见,我们(运营团队)收集诸如时间序列数据之类的指标并绘制图表。Graphite允许我们这样做,它有一个非常丰富的 API,我用它来构建警报系统,以在突然下降(大部分)和其他变化发生时通知我们的团队。目前,我已经根据平均值设置了一个静态阈值,但由于白天和一周内的负载不同(季节性因素),它不能很好地工作(有很多误报)。

它看起来像这样: 每个系统的用户数

实际数据(一个指标的示例,15 分钟时间范围;第一个数字是用户数,第二个 - 时间戳):

[{"target": "metric_name", "datapoints": [[175562.0, 1431803460], [176125.0, 1431803520], [176125.0, 1431803580], [175710.0, 1431803640], [175710.0, 1431803700], [175733.0, 1431803760], [175733.0, 1431803820], [175839.0, 1431803880], [175839.0, 1431803940], [175245.0, 1431804000], [175217.0, 1431804060], [175629.0, 1431804120], [175104.0, 1431804180], [175104.0, 1431804240], [175505.0, 1431804300]]}]

我想要完成的事情

我创建了一个 Python 脚本,它接收最近的数据点,将它们与历史平均值进行比较,并在发生突然变化或下降时发出警报。由于季节性,“静态”阈值无法正常工作,脚本会生成误报警报。我想改进警报算法以使其更精确,并使其在不不断调整警报阈值的情况下工作。

我需要什么建议和我发现的东西

通过谷歌搜索,我发现我正在寻找用于异常检测的机器学习算法(无监督算法)。进一步的调查表明,它们有很多,很难理解哪一个适用于我的案例。由于我有限的数学知识,我无法阅读复杂的学术论文,我正在寻找对该领域初学者来说简单的东西。

我喜欢 Python 并且对 R 有点熟悉,因此我很乐意看到这些语言的示例。请推荐一本好书或文章,这将帮助我解决我的问题。谢谢你的时间,请原谅我这么长的描述

有用的链接

类似的问题:

外部资源:

4个回答

我认为关键是图表中的“意外”限定符。为了检测意外情况,您需要了解预期情况。

我将从一个简单的时间序列模型开始,例如 AR(p) 或 ARMA(p,q)。适合数据,适当添加季节性。例如,您的 SAR(1)(24) 模型可能是: $y_{t}=c+\phi y_{t-1}+\Phi_{24}y_{t-24}+\Phi_{25}y_{ t-25}+\varepsilon_t$,其中 $t$ 是以小时为单位的时间。因此,您将预测下一小时的图表。每当预测错误 $e_t=y_t-\hat y_t$ 是“太大”时,您都会发出警报。yt=c+ϕyt1+Φ24yt24+Φ25yt25+εt, where t is time in hours. So, you'd be predicting the graph for the next hour. Whenever the prediction error et=yty^t is "too big" you throw an alert.

当您估计模型时,您将获得误差 $\varepsilon_t$ 的方差 $\sigma_\varepsilon$。根据您的分布假设(例如正态),您可以根据概率设置阈值,例如 $|e_t|<3\sigma_\varepsilon$ 为 99.7% 或单边 $e_t>3\sigma_\varepsilon$。σε of the error εt. Depending on your distributional assumptions, such as normal, you can set the threshold based on the probability, such as |et|<3σε for 99.7% or one-sided et>3σε.

游客数量可能相当持久,但季节性很强。尝试季节性虚拟变量而不是乘法季节性可能会更好,然后您可以尝试 ARMAX,其中 X 代表外生变量,可以是假期虚拟变量、小时虚拟变量、周末虚拟变量等。

在 Netflix 技术博客上有一篇关于他们的鲁棒异常检测工具 (RAD) 的文章。 http://techblog.netflix.com/2015/02/rad-outlier-detection-on-big-data.html

它处理季节性和非常大量的数据集,因此它可能符合您的要求。代码是开源的 Java 和 Apache Pig https://github.com/Netflix/Surus/blob/master/resources/examples/pig/rad.pig

底层算法基于健壮的 PCA - 请参阅此处的原始论文:http: //statweb.stanford.edu/~candes/papers/RobustPCA.pdf

开源包中的大多数异常值检测算法都是针对频率较低的业务时间序列数据,日/周/月频率数据。这些数据似乎是在几分钟内捕获的专业领域,所以我不确定开源异常值检测是否会有所帮助。您可以尝试使这种方法适应您的数据。

下面我概述了一些可用的开源包方法R

  1. tsoutliers在 arima 框架内实现Chen 和 Liu 的异常值检测算法。在这个网站上看到我之前的问题。很棒的方法,但速度很慢,不确定它是否能够处理像你这样的高频数据。如我之前的问题/帖子中所述,它具有检测所有类型的异常值的优点。
  2. Twitter 的异常检测:使用Rosner算法来检测基于时间序列的异常。该算法分解时间序列,然后检测异常。在我个人看来,这在检测时间序列中的异常值方面并不高效和准确。
  3. 预测包中的tsoutlier:在分解时间序列然后检测异常值方面类似于twitter的算法。只会检测附加异常值或脉冲。

有一些商业软件包有专门的方法来尝试和检测异常。另一个经典的方法是Tsay 的时间序列异常值检测算法,类似于 Chen 和 Liu 的方法,它检测不同类型的异常值。我最近还偶然发现了这个名为metafor的商业软件解决方案,它可能更适合您的数据。

希望这会有所帮助

其他答案似乎没有提到的是,您的问题听起来像是changepoint detection变化点检测的想法是,您正在寻找数据中在属性(例如均值、方差)方面存在显着差异的段。这可以通过使用最大似然估计来实现,其中对于 $m$ 变化点,似然函数是m changepoints the likelihood function is

L(m,τ1:m,θ1:(m+1))=i=1m+1p(y(τi1+1):τiθi)

其中 $y_1,\dots,y_n$ 是您的数据,$1 < \tau_1 <\dots<\tau_m<n$ 是标记变化的边界点,概率分布 $p$ 由 $\theta_i$ 参数化每个 $第 i$ 段。这可以很容易地推广到各种情况。存在许多算法来查找参数,包括查找未知的 $m$。还有一些软件可用于估计此类模型,例如R 包。如果您想了解更多信息,可以查看以下出版物及其提供的参考资料:y1,,yn is your data, 1<τ1<<τm<n are the boundary points marking the changes, and probability distributions p are parametrized by θi for each i-th segment. This can be easily generalized to vide variety of situations. A number of algorithms exist to find the parameters, including finding the unknown m. There is also software that is available to estimating such models, e.g. changepoint

Rebecca Killick 和 Idris A. Eckley。(2013 年)changepoint:一个用于 Changepoint 分析的 R 包。(在线论文)

Eckley, IA, Fearnhead, P. 和 Killick, R. (2011)变化点模型分析。[in:]贝叶斯时间序列模型,编辑。D. Barber,AT Cemgil 和 S. Chiappa,剑桥大学出版社。