学习笔记:多维时间序列异常检测(一)


本文包含的内容:什么是时间序列和时间序列分解模型?如何做时序异常检测、时序预测和根因分析?为什么需要AMA?

异常检测是在数据中发现与预期行为不符的模式。对于决策者而言,在检测到异常时采取必要的积极行动可以避免和减少损失。异常检测在许多行业中发挥着至关重要的作用,例如金融行业的欺诈检测、医院的健康监控、制造业、能源电力、运输、航空和汽车行业的故障检测和操作环境监控 、IT环境的智能运维(AIOps)、商业企业运营指标监控等。

什么是时间序列(Time Series)?时间序列是按时间顺序索引的一系列数据点。

什么是时间序列分解模型(Decomposition of additive time series)?时间序列分解模型将时间序列分成多个组件的任务,将观察结果分为趋势部分、周期/季节部分和随机残差部分。时间序列异常检测则是基于分解模型,识别与大多数数据集明显不同的观察结果的过程。如图,红线是原始时间序列,蓝线是基准线(周期+趋势)组成部分,紫色点是原始时间序列之上的异常点。

 

微软云Azure提供多种异常检测方案,其中Azure Stream Analytics(ASA)或Azure Data Explorer(ADX)可以用于实时分析和检测。ASA适用于连续或流数据实时分析。ADX适用于按需或交互式的近实时分析,可以对大量流数据进行数据探索、周期性分解,即席分析、仪表板以及从近实时到历史数据的根本原因分析。与异常检测相关的功能如下:

  • ADX提供了基于时间序列分解模型的函数进行时序数据预测,预测对于预防性维护、资源计划等情况很有用
  • ADX提供自动检测时序季节/周期的功能,可以自动检测时序中的周期时间段,或者用于验证指标的周期时间段
  • ADX提供分解功能,自动将每个时间序列分解为季节,趋势,残差和基线部分
  • ADX提供异常检测功能,基于增强周期性分解模型检测尖峰(Spike)和低谷(Dip),基于分段线性回归检测水平转化或趋势变化的变化点(change point)
  • ADX提供2个通用筛选函数,有限脉冲响应(FIR)筛选器用于计算时序的移动平均值、差异;无限脉冲响应(IIR)筛选器用于指数平滑与累计求和
  • ADX异常检测分析可以找到一组时序上的异常点,并对异常进行根因分析(RCA)

 

下面以ADX为例,简要说明时间序列分解模型、异常检测、时序预测和根因分析的大概过程,具体函数及其参数请参考文档。

1. 时间序列分解模型

  时间序列分解模型在时序数据处理领域众所周知,ADX基于时序分解模型实现了时序预测和异常检测。我们使用函数series_decompose()函数来创建分解模型。下面以一个Web服务流量为例,将其观察结果分解为趋势、季节和随机残差和基准线部分。

 

 

 如图所示,我们可以通过不同颜色看到各个部分。

o   红色线:原始观测数据

  

 o   蓝色线:基准线部分(季节+趋势)

  

 o   青色线:季节/周期

 

 

 

 o   褐色线:趋势

 

 

 o   深蓝色线:随机残差

 

 

 

2.  时间序列异常检测

  使用函数series_decompose_anomalies()可以查找一组时间序列上的异常点。 检测过程主要分两步,首先调用series_decompose()构建分解模型,然后在随机残差部分上运行series_outliers()函数使用Tukey隔离测试算法计算残余部分每个点的异常分数,高于异常阈值默认为1.5(可调)或低于-1.5表示轻微异常上升或下降, 高于3.0或低于-3.0则表示严重异常。

 

 

同样,我们可以通过不同颜色更清晰的看到每一部分,这里只插入了异常数据点和异常分数部分,其它请参看时序分解模型部分。从上面综合叠加图上可以看到观测数据中异常点与基准线的差距,其差距大小即异常严重程度强弱,也反映在了下面对应的异常分数图中。

  •   异常数据点

  • 异常分数

3. 时序预测

  如何预测一组时间序列下一个时间周期中的值或走势?可以调用series_decompose_forecast()函数进行预测,过程分2步,首先调用series_decompose()构建分解模型,然后针对每个时序,将其基线分量外推到要预测的将来时间段。下面语句预测下一周的Web服务流量,其中红色为实际观测数据,蓝色为基准线和预测结果。

  

4. 根因分析

  检测出时间序列异常数据点之后,需要进行进一步诊断分析,才可以发现异常的业务活动,并及时缓解或解决异常问题。诊断过程通常比较复杂和耗时,也需要业务领域专家花较多精力进行分析。

  ADX中的机器学习插件,可以简化诊断操作并缩短发现根本原因的时间。ADX提供3个机器学习插件,autocluster、basket和diffpatterns。三个插件实现的都是聚类算法,autocluster、basket对单一记录集进行聚类,diffpatterns对两个记录集合的差进行聚类,下面举例说明。

 本示例使用的是一周服务异常日志数据,包含时间戳以及区域、缩放单元、部署ID、追踪点、服务主机等维度。

 

  使用下面KQL脚本进行异常检测。KQL首先将数据按照10分钟间隔序列化,计算出每间隔异常数量。然后调用series_decompose_anomalies()函数进行异常检测,并使用anomalychart()函数进行可视化。通过观察异常图表,可以清楚地发现工作日及周末每日的模式。工作日午间左右服务数量增加,晚间服务数量下降,周末数量持续低平。尖峰数据点分布在周一下午、周二下午、周四和周五的下午。

 

 

  以星期二下午出现的第二个高峰为例,用下面查询进一步诊断和验证它是否是尖峰异常。我们用更高的分辨率围绕峰值绘制图表,以便研究它的边界。

  

从 15:00 到 15:02 出现了两分钟尖峰。 使用以下KQL查询统计出此两分钟时段内的异常数为972,并查看20个产生尖峰的样本数据。

 

   定位出现异常的服务,行业专家可以很快着手去解决问题。如何定位异常是由哪些服务产生?故障数占比情况如何?此处可以采用 autocluster() 或basket()机器学习插件,二者都是用非监督学习聚类算法进行多维挖掘,autocluster()采用的是自研专有算法,basket()使用了经典的Apriori算法。

  从autocluster()聚类的结果可以发现,细分片段0  (SegmentId=0)贡献了异常记录总数的65.74%,共享4个维度。后面的细分片段(Segment)占比都相对较少。业务专家可以根据此分析结果,推断细分片段Segment 0对应的服务是导致尖峰异常的原因。

  使用basket()函数步骤和结果类似,此处不赘述。

  

    autocluster() 或basket()机器学习插件是单一数据集聚类分析。单一数据集聚类的局限性在于它是无监督学习,即在没有标签的情况下对单个记录集进行的聚类,因此提取出的模式并不清楚选取的记录是异常记录还是全局记录。

   diffpattern() 机器学习插件采用监督学习算法,它突破了此限制。diffpattern()采用两个记录集,并从中提取两个不同的细分片段(Segment)。通常一组包含异常的记录集,另外一组是参考记录集,即基准线。两个记录集根据时间戳被分别标注为“异常Anomaly”和“基准线Baseline”。

  

  

  调用diffpattern()可以找到了造成异常的主要细分片段,你会发现这个结果和austocluster()的结果一样。这个segment在2分钟的异常区间数量占了65.74%,而在8分钟的基准线中只占了1.7%,差了64.04%,看上去这和异常尖峰有关。下面一步进行验证。

  

 

  从上面这张图可以看到,星期二下午的高峰正是diffpatterns() 插件所发现的细分分段所导致。

 

总结:

  至此,我们了解了时间序列、时间序列分解模型、时序异常检测、时序预测和时序异常根因分析等。

  您会发现,对业务专家来说,多维时序异常的根因分析复杂而耗时。有没有一套端到端AI方案自动处理这样繁重和重复的工作,让业务专家无需花很长时间和精力进行时序异常诊断,而只需要关注解决业务问题,加快价值实现速度? 答案:Azure Metrics Advisor (AMA)。

  下一篇将走进AMA,敬请关注。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM