大规模时间序列数据自动异常检测架构
来源:互联网 发布:淘宝网显示不正常 编辑:程序博客网 时间:2024/06/07 00:42
Yahoo大规模时列数据异常检测技术及其高性能可伸缩架构
本文已经在InfoQ首发
本文是Yahoo在ACM国际会议上发布的一篇关于时序数据自动异常检测上的学术论文,对在智能监控尤其是趋势预测、异常数据监测和报警等方面的技术同学具有一定研究和参考价值,以下是中文翻译,部分内容进行了删改,附录是该论文的英文原文,方便读者查阅。由于笔者知识有限,内容翻译不恰当之处欢迎批评指正共同讨论。
作者介绍
彭冬 Andrew(微博@AndrewPD,微信 justAstriver)
新浪微博广告业务部架构师,目前负责广告核心引擎基础架构、Hubble系统、D+ 商业数据平台建设及基础架构团队管理工作。关注于计算广告、大数据、人工智能、高可用系统架构设计。 Innovation and Open, Technical,Extremely Perfect
关键词 : 智能监控 EGADS 故障检测 机器学习 Yahoo 趋势预测 模型
1. 摘要
本文介绍了大规模时序数据自动异常检测的通用和可扩展框架。能够在早期检测到系统异常,无论在维护用户数据一致性方面,还是在保护企业免受恶意攻击都发挥着非常关键的作用。现有技术在异常检测方法受到可扩展性和易用性上都存在很大问题。我们在雅虎(EGADS)的系统设计了基于异常检测和预测模型构建的异常过滤层,用于准确地进行时序数据的异常检测。我们比较我们的方法与其他异常检测系统对实时和合成数据的不同时间序列特征。EGADS框架在精度和召回率提高了50%~60%。
2. 简介
虽然计算硬件和软件的快速发展已经极大提高了应用程序的可靠性,但是在大型集群中仍然存在大量的软件错误和硬件故障。系统要求7*24小时不间断运行,因此,对这些系统的持续监控就至关重要。从数据分析的角度来看,这意味着不间断地监视大量的时间序列数据,以便检测潜在的故障或异常现象。由于实际中的系统异常或者软件BUG可能会非常多,通过人工监控几乎是不可能的,因此非常有必要使用机器学习和数据挖掘技术进行自动化异常检测。
异常值本质上是一个数据点。通常,大多数应用程序中的数据是由一个或多个反映系统功能的程序产生的。当底层应用程序以不正常的方式运行时,它会产生异常值。快速高效地发现这些异常值非常具有价值,比如在:入侵检测,信用卡欺诈,传感器事件,医疗诊断,执法等。
我们在雅虎的系统被称为EGADS,它可以准确和可扩展地检测时间序列异常。 EGADS将预测、异常检测和警报分为三个单独的组件,允许人员将自己的模型添加到任何组件中。本文重点介绍后两个组件。
EGADS是第一个灵活、准确、可扩展和可扩展的异常检测综合系统。 EGADS框架与异常检测基准数据一起开源,帮助学者和行业合作开发新的异常检测模型。在雅虎,EGADS每天被许多团队用于数百万次的时间序列异常检测工作。
整体架构
EGADS框架由三个主要部分组成:时间序列建模模块(TMM),异常检测模块(ADM)和报警模块(AM)。给定一个时间序列,TMM组件模拟产生时间序列,由ADM和AM组件进行消费处理,分别计算误差并过滤不感兴趣的异常。这些组件在第3和4节中有详细描述。
EGADS被构建为一个框架,可以轻松地集成到现有的监控基础设施中。在雅虎,我们的内部雅虎监控服务(YMS)每秒处理数百万个数据点。因此,对YMS进行可扩展,精准和自动化的异常检测至关重要。接下来我们将详细描述YMS的具体细节。
2.1系统集成
EGADS作为独立平台运行,可用作大型系统中的库。因此,设计EGADS和内部雅虎监控服务(YMS)之间的接口至关重要。 EGADS与YMS的集成架构图如图1所示。
此外,异常检测,还需要几个支撑组件来驱动完成。首先,所有的异常检测模型都是离线批处理(batch)生产的,然后应用到实时环境(real time)。其中批处理由三个步骤组成:
- 监测(即监视的时间序列数据)数据批量存储在Hadoop集群上
- 批量模型生成器针对这些数据运行,并为目标时间序列构建模型
- 模型存储在模型数据库中
然后在线实时流使用这些存储的模型,具体步骤如下:
- 数据流入Storm进行流式处理
- 集群中的一个模块调用EGADS ADM,根据存储在模型数据库中的模型来评估输入数据点
- 如果存在异常,则将其发送到由组合规则和其他包含特定逻辑组成的辅助规则流(见第4节)
- 根据规则,如果异常是警报事件,则生成事件,存储在状态数据库中,并转发到警报路由系统
- 警报路由系统应用路由配置规则将警报发送给相应的处理人员
2.2 可扩展性
EGADS的监控需要每秒分析超过百万级数据点,亿级别时间序列。要求在CPU负载,I/O和内存占用方面具有可扩展性,并且数据点的处理需要尽可能高效。这意味着需要预先计算尽可能多的模型。从磁盘读取模型是不切实际的会降低性能,因此模型应该存储在内存中。另一方面,为了控制成本,模型应尽可能小。
异常检测算法
在本节中,我们给出了EGADS支持的异常检测算法。目前,EGADS能够检测出三类异常:
- 异常值:给定输入时间序列x,异常值是时间戳值对(
t ,xt ),其中观测值xt 与该时间序列的期望值(即E(xt ))不同 - 波动点(Change Points):给定输入时间序列
x ,波动点是指在某个时间t ,其状态(行为)在这个时间序列上表现出与t 前后的值不同 - 异常时间序列:给定一组时间序列
X={xi} ,异常时间序列xj∈X 是在X 上与大多数时间序列值不一致的部分
在以下部分中,我们给出了EGADS当前用于检测上述异常类型的方法。
3.1 异常检测
检测异常值是许多监控应用中最重要的功能。EGADS提供了两类用于检测输出的算法,这些在本节中进行了描述。
3.1.1 插件方法
EGADS中异常值检测的第一类方法称为插件方法。为了模拟输入时间序列的正常行为,可以业务和时序数据的特点来插入大量的时间序列模型和预测模型(例如ARIMA,指数平滑,Kalman滤波,状态空间模型等)。这就是为什么我们将这个总体策略称为插件方法。应该注意的是,所有这些模型都在EGADS中用于时间序列预测,这是我们框架的另一个特征;然而,由于本文的重点是异常检测,更多关于EGADS的建模和预测特征的细节我们不进行更深入的讨论。
我们提出的插件框架由两个主要组件组成:时间序列建模模块(TMM)和异常检测模块(ADM)。给定时间序列
给定预测值
相对误差
通过对相对误差进行阈值处理,可以检测异常值,同时对所期望值的幅度进行归一化。虽然这些阈值确定了异常检测模块的敏感度,然而,很难确定异常检测的最佳度量。事实上,给定时间序列的最优度量的选择取决于时间序列的性质以及TMM性能。例如,如果我们处理一个非常规则的时间序列,我们有一个准确的模型,使用预测误差进行异常检测可能就足够了,因为它预期是正常分布的。在其他情况下,最佳度量可能在预测误差和相对误差之间存在某种差异。因此,EGADS默认跟踪一组偏差度量,使用系统的人可以创建自己的错误度量。在第4节中描述的警报模块(AM)中使用这些错误度量以及其他功能(如时间序列特征)来了解用户的偏好并过滤不重要的异常。
3.1.2 基于分解的方法
EGADS中第二类异常值检测方法是基于时间序列分解的思想,在时间序列分析中,通常将时间序列分解为:趋势、季节性和噪声的三个要素。通过监测噪声分量,可以捕获异常值。更准确地说,如果点
3.2 变点检测
在一些文献里有提到一种基于时间窗口的变点检测技术,在EGADS中,目前采用基于模型的方法。在这些方法中,时间序列的预期行为通过3.1.1节中提到的建模技术建模。我们结合3.1.1节中描述的插件方法来计算输入时间序列的残差序列(或模型预测的偏差)。然后我们对残差系列应用绝对变化点检测的方法来检测残差分布。我们使用内核密度估计(Kernel Density Estimation)非参数估计残差分布和Kullback-Leibler(KL距离,常用来衡量两个概率分布的距离)来测量分布变化。
3.3 检测异常时间序列
EGADS支持的另一类异常检测技术涉及检测异常时间序列。异常时间序列
报警
异常检测的最终目标是产生准确和及时的警报。 EGADS通过两阶段过程实现这一点,首先通过阈值选择产生一组候选异常,然后对给定的规则过滤不相关的异常。
4.1 阈值选择
阈值选择的作用是根据异常检测模块(ADM)产生的偏差度量选择合适的阈值。目前,EGADS基于以下两种阈值选择算法实现:
(a)Kσ 偏差
(b)密度分布
第一种方法是参数化的,并假定数据正态分布,有明确的平均值和标准偏差。依靠高斯分布,并根据为“3sigma规则”(即:其中99.73%的样本位于平均值的三个标准偏差之内。因此,根据Kσ中的K值,可以确定在时间t观测样品的可能性。根据所需的敏感度,可以测量给定的样品是否在K = 2或1的所有样品的95.45%或68.27%之内。请注意,这里的假设是我们的偏差度量是正态分布的。第二种方法是非参数的,并且对于偏差度量不是正态分布的情况是有用的。基本思想是找到偏差度量分布的低密度区域。一种方法是使用诸如局部离群因子(LOF)的算法。通过将对象的局部密度与其邻居的局部密度进行比较,可以识别具有相似密度的区域,以及具有比邻居密度明显更低的密度的点,这些点被认为是异常值。
4.2 过滤
过滤是传递给应用的最后阶段的处理。虽然作为过滤阶段的输入的候选异常在统计上是显著的,但并不是所有异常都与特定用例相关。例如,一些应用对时间序列中的尖峰感兴趣,而其他应用对下降感兴趣,而其他应用对变化点感兴趣。 EGADS提供了一个简单直观的界面,允许用户标记时间序列的哪些区域是异常的。然后,该反馈被EGADS与时间序列和模型特征一起用于训练一个分类器,该分类器预测异常图2显示了样本时间序列的特征曲线。请注意,以dc开始的指标是在时间序列上经过调整后(即删除趋势和季节性数据后)得到的。在第6.2节中,我们将看看这些时间序列特征如何影响模型性能。
实验研究
6.1数据
用于实验的数据集由1:1的合成和真实数据混合而成。我们已经创建了一个合成的时间序列生成工具,该工具随着框架和基准数据的开放。使用该工具,通过指定长度,幅度,异常数,异常类型,异常大小,噪声水平,趋势和季节性来生成合成时间序列。真实数据集使用了雅虎会员登录数据(YML)。合成和真实数据在时间序列都包含3000个数据点,YML数据包含了3个月的数据点。除非另有说明,所有实验均以1000次随机选取的时间序列进行,结果取平均值。还要注意,合成和真实数据都有异常标签,方便测量精度和召回率。
6.2建模实验
时间序列建模(由EGADS中的TMM组件捕获)是异常检测的基本部分。通常情况下,异常检测与底层时间序列模型一样好。由于大量的候选模型,模型选择变得至关重要,并且取决于时间序列特征和可用资源。在下面的实验中,我们展示了时间序列特征对模型性能的影响,并显示了精度,实验中使用的模型和误差度量分别参见表2和3。
6.2.1时间序列特征和性能
为了证明时间序列特征对模型性能的影响,我们比较了不同模型的时间序列与不同特征的误差度量(见4.2节)。图3显示了时间序列特征在模型行为中起着重要作用。例如,季节性模式的Olympic模型在数据集上表现不佳,没有季节性和强劲趋势。 EGADS能够跟踪历史时间序列特征和模型性能,使用这些历史信息,EGADS选择由表3中描述的误差度量判断的最佳模型(给定时间序列特征)。实际上,基于数据特征进行模型选择比针对每个模型执行交叉验证要快得多。
6.2.2时序模型的可扩展性
如第2节所述,时序模型需要高性能技术以支持大规模(例如每秒数百万点)数据流的实时计算,因此需要在模型大小、训练时间和准确性之间进行权衡。 这种权衡在图4(a)和4(b)中可以看出。 例如,从图中可以看出,季节性天性模型很快训练,但是具有较大的存储要求和较高的平均误差。 在雅虎,首先设定了资源和模型训练时间的目标,然后选择相应的模型。 换句话说,目标是将资源和模型建立时间限制下使得表3中的错误减到最小。
6.3异常检测实验
在本节中,我们比较了开源系统与EGADS,参考的开源系统如表4所示。
在图5显示了对6.1节中描述的数据的测试结果,比较方法采用:
结果可以看出,没有一个最佳的异常检测模型能适合所有业务场景,不同的算法需要结合检测不同类型的异常来确定。例如,Twitter在数据集
6.4异常过滤实验
异常的重要性往往取决于实际应用场景。具体来说,一些用户可能对展示恶意攻击的时间序列行为感兴趣,而其他用户可能对收入有兴趣。
为了解决这个要求,过滤阶段扫描所有模型的所有异常
结论
异常检测是许多具有故障应用的实时监控系统的核心部分, 检测,欺诈检测,网络入侵检测等等。尽管它至关重要,但实际上实施全自动异常检测系统是一项具有挑战性的任务,这些挑战通常导致解决方案不是可扩展的或高度专业化的,也导致了较高的误报率。
在本文中,我们介绍了EGADS,雅虎实现的通用异常检测系统,对不同的Yahoo属性进行数百万个时间序列进行自动监控和警报。正如我们在本文中所描述的,Hadoop上的EGADS的并行架构以及它通过Storm的流处理机制使得它能够在雅虎的数百万个时序数据集上执行实时异常检测。此外,EGADS采用不同的时间序列建模和异常检测算法来处理不同的监控场景。通过将这一组算法与机器学习机制结合在警报模块中,EGADS自动适应对用户重要的异常检测用例。所有这些功能都有效地创建了一个功能强大的异常检测框架,它是通用的和可扩展的。我们对真实和综合数据集的展示实验表明,与其竞争对手的解决方案相比,我们的框架具有优越的适用性。
EGADS的设计本质上是可扩展的,为系统中插入新的模型和算法提供了一种简单的机制。我们的框架及其所有数据集都已经开源。
原文地址:Generic and Scalable Framework for Automated Time-series Anomaly Detection
- 大规模时间序列数据自动异常检测架构
- hivemall之时间序列数据异常检测
- 深度学习应用于时间序列数据的异常检测
- 时间序列异常事件检测
- 时间序列异常检测机制的研究
- 大规模数据分析架构
- 2017 Top 15 Python 数据科学类库;时间序列异常点检测;如何加入开源项目
- 基于时间序列的异常检测C++实现
- 离群点检测与序列数据异常检测以及异常检测大杀器-iForest
- 异常数据检测
- 【数据挖掘】异常检测
- 异常数据点检测
- Predix平台上通过分类器实现时间序列的实时异常检测
- 基于时间序列的异常检测系统的实现思路之一
- 时间序列数据挖掘
- 时间序列数据评估
- 时间序列数据存储
- [转]数据分析与处理之一:大规模数据分析架构
- Git常用命令总结
- 学习笔记-Java swing
- 机器学习LR模型,在面试中经常被问到的问题
- Fiddler域名重定向设置
- 【HDU 1029】Ignatius and the Princess IV (动态规划)
- 大规模时间序列数据自动异常检测架构
- Lua和C++的交互
- 就
- java内存模型详解(JMM)
- 2705: [SDOI2012]Longge的问题 欧拉函数
- AJAX学习
- 内存的管理艺术(基于C语言)2
- java服务1
- 位图的实现以及应用