异常检测-时序异常检测建模

摘要:虽然计算机软硬件的快速发展已经极大提升了应用程序的可靠性,可是在大型集群中仍然存在大量的软件错误和硬件故障。系统要求7x24小时不间断运行,所以,对这些系统进行持续监控相当重要。这就要求咱们就被从系统中持续采集系统运行日志,业务运行日志的能力,并能快速的分析和监控当前状态曲线的异常,一旦发现异常,能第一时间将信息送到相关人员手中。html

文章系列连接

  • SLS机器学习介绍(01):时序统计建模node

  • SLS机器学习介绍(02):时序聚类建模算法

  • SLS机器学习介绍(03):时序异常检测建模sql

  • SLS机器学习介绍(04):规则模式挖掘小程序


  • SLS机器学习最佳实战:时序异常检测和报警微信

摘要与背景

虽然计算机软硬件的快速发展已经极大提升了应用程序的可靠性,可是在大型集群中仍然存在大量的软件错误和硬件故障。系统要求7x24小时不间断运行,所以,对这些系统进行持续监控相当重要。这就要求咱们就被从系统中持续采集系统运行日志,业务运行日志的能力,并能快速的分析和监控当前状态曲线的异常,一旦发现异常,能第一时间将信息送到相关人员手中。所以,使用机器学习和数据挖掘的手段对系统自动化进行异常检测相当重要。网络

让咱们来看时序数据的一些常见异常:机器学习

  1. 延时的毛刺:在对读写敏感的场景中,常常会有IO毛刺问题困扰,这些毛刺每每被平均难以经过肉眼或P99等监控方法发现ide



2.业务系统调用量异常:以云服务提供的API为例,因各类缘由会有一个短暂的Burst和降低。对于重要接口能够在监控系统上发现,但当咱们面向几百个接口的监控时也会力不从心函数



3.水位上升:新版本发布后,各个指标的形态与历史吻合,可是总体的平均水位有拔高



当业务组合(B)复杂,部署规模(N)变大后,依靠传统的人眼+依赖同比环比等绝对值算法来判断就捉襟见肘了,如下咱们提供对这一类问题的分类与解法。

Scale=BNNumberOfSeriesData

异常类型概述

一般说的异常大体分为异常值、波动值、异常时间序列等几种状况:

  • 异常值(Outlier)

    • 给定输入时间序列x,异常值是时间戳值对(t,xt),其中观测值xt与该时间序列的指望值(E(xt))不一样。

  • 波动点(Change Point)

    • 给定输入时间序列x,波动点是指在某个时间t,其状态在这个时间序列上表现出与t先后的值不一样的特性。

  • 断层异常(Breakout)

    • 时序系统中某一时刻的值比前一时刻的值陡增或者陡降不少。

  • 异常时间序列(Anomalous Time Series)

    • 给定一组时间序列X=xi,异常时间序列xiX是在X上与大多数时间序列值不一致的部分。

PS:上述概括的异常均是针对单条时序曲线的形态异常,在工做交流中,发现网络流量的同窗不只要关注流量数值的大小异常、增量异常,同时还要考虑在必定的窗口期内,针对单业务线的各个网络包成分的异常,这些特定场景的异常须要设计特定的算法进行判别。在此不展开讨论,作异常的同窗能够私下钉钉我,多多交流!

开源异常检测系统

  • 这里添加了一些我在调研中找到的异常检测算法包,有Java版本、R版本供各位同窗参考使用

算法 具体描述
EGADS ExtremeLow 密度模型异常值 EGADS基于密度的异常检测
EGADS CP EGADS中波动点检测
EGADS KSigmaModel 异常值 EGADS中经典的KSigma模型
Extreme R异常值 开源的异常值检测、阈值绝对值和残差检测异常
Twitter Outliter 基于广义的ESD方法的Twitter R语言异常检测库
BreakOut Twitter CP Twitter一个基于ESD统计检测来实现变点检测的R语言库
Change Pt1-2-3 R R语言版本的变点检测库

异常检测方法

对时序曲线进行大体的概括整理后,能够发现,单条曲线形态大体能够分红以下三个场景:

  • 数据无规律波动,可是正常稳定状况下,时序数据大体在一个稳定的区间内波动,一般能够设计一组不一样等级的阈值,进行阈值的异常报警;

  • 数据长期波动幅度较大,可是正常状况下,短时间内数据波动幅度较小,总体展示出较为平稳的上涨或者降低,这里对应的异常就是断层异常,是否在某个时刻数据陡增或者陡降;

  • 数据有明显的规律性和周期性,经过学习周期变化、涨幅变化获得最终异常数据;

本文围绕着异常检测、变点检测、断层检测这三个主题进行展开,这一期主要利用基于预测的方法进行异常检测。这其中主要展开关于ARMA、Holt Winters和STL模型集中讨论。


基于预测的异常检测



针对单条时序数据,能够利用这篇文章中的方法进行建模预测SLS机器学习介绍(01):时序统计建模,根据预测出来的时序曲线和历史数据求出时序的残差,对残差序列建模,利用KSigma或者分位数等方法进行异常检测。

数据平滑

以网络流量曲线为例,该曲线局部都懂的很厉害,若对原始数据建模,则会吸取很很大的噪音,影响模型的效果,能够先用平滑函数对数据进行平滑处理。下图中,蓝色曲线是原始的网络流量数据,紫色是通过长度为5的矩形窗口平滑以后的结果。

* | select ts_smooth_fir( stamp, val, 'rectangle', 5, 1, 'avg') limit 1000

为了让你们有对比的看清楚平滑的效果,上图中两条曲线是画在不一样的Y轴坐标系下的。先将两条曲线绘制在同一个Y轴下面,计算对应的点的残差序列,能够较好的找到异常的点。以下图中的红色圆圈标记出来的结果。

阈值检测

  • 为了不单点抖动产生的误报,须要将求取累积的窗口均值进行阈值判别

  • 具体的累积就是经过窗口进行操做

ˆx(t)=xt+xt1+...+xtw+1w

  • 同时业务同窗能够根据本身的接受范围对阈值进行分级设置,不一样的阈值对应不一样的操做

KSigma异常检测

假设数据集由一个正太分布产生,该分布能够用 N(μ,σ)表示,其中μ是序列的均值,σ是序列的标准差,数据落在(μ3σ,μ+3σ)以外的几率仅有0.27%,落在(μ4σ,μ+4σ)以外的区域的几率仅有0.01%,能够根据对业务的理解和时序曲线,找到合适的K值用来做为不一样级别的异常报警。

分位数(Box Plot)异常检测

箱型图,是一种用做显示一组数据分散状况资料的统计图。主要用于反映原始数据分布的特征,还能够进行多组数据分布特征的比较,其绘制方法是:先找出一组数据的最大值、最小值、中位数和上下两个四分位数。经过不一样分位数来划分异常值和疑似异常值。


平台实验结果

* | select ts_predicate_simple(stamp, val, 6, 1, 'avg') from log limit 500
* | select ts_predicate_arma(stamp, val, 5, 2, 6, 1, 'avg') from log limit 500


基于统计的异常检测

变点的描述


使用数学的方法描述上述情况,给定时序数据,z1,z2,...,zn,若是τ,使得z1,z2,...,zτ在某统计特性上区别于zτ+1,zτ+2,...,zn,则τ就是咱们须要寻找的Change Ponit。

  • 以均值为统计特性,去分析存在变点的条件:

zt={μ1if1tτ1μ2ifτ2<≤τ2......μk+1ifτk<tτk+1=n

1. 查找单个变点的模型

假设,时间序列的分布遵循以下模型:

Zt|θtN(θt,1)

其中,θt可使用一个分段函数进行描述,设计相关的算法找到分段函数的分段点。咱们使用以下模型进行求解:

LR=maxτ{l(z1:τ)+l(zτ+1:n)l(z1:n)}

给定一个惩罚系数,当LR>λ时,去求取以下参数:

τ=argmax{l(z1:τ)+l(zτ+1:n)l(z1:n)}

2. 查找多个变点的模型

假设,时序数据中存在多个变点,这里假设为k个,τ=(τ0,τ1,...,τk+1),这里τ0=0τk+1=n,能够获得以下定义:

mink,τk+1i=1[l(zτi1:τi)]+λf(k)

针对上述问题,其解空间巨大:

  • 对于含有N个点的时序数据,存在2N1中可能性

  • 若k是已知的,这组合的空间也是巨大的Ck1n1

经常使用的方法

局部峰值点检测策略

针对上述流程图的说明:

  • 务必确保滤波以后的序列是平滑的,由于一阶差分对噪声数据很敏感,若噪声未能很好的过滤掉,会产生太多的候选点,影响查找效率

  • 寻找局部峰值点

  • 均值漂移策略:须要肯定窗口的大小,具体的计算公式以下所示:

ˆx(t)=xt+xt1+...+xtw+1xtw+xtw1+...+xt2w+1

EDM(E-Divisive with Medians)

EDM算法是由Twitter在2014年提出来,具体细节介绍请见论文《Leveraging Cloud Data to Mitigate User Experience from ‘Breaking Bad’》。这里仅仅简单的描述下该算法的特色和原理。

  • 算法特色

    • EDM使用E-statstics统计方法来检测平均值的差别,一般,EDM算法也能够用于检测给定时间序列中的分布的变化状况。

    • EDM使用较为鲁棒的统计指标,并经过组合测试的方法进行显著性的检验。

    • EDM算法是非参数的,不少云端数据并不遵循简单意义上的正太分布,具备较好的适用性。

  • 算法原理

    • if forwardMove = 1 then

    • end

    • else

    • end

    • forwardMove = 1 - forwardMove

    • Perform ForwardUpdate

    • Perform BackwardUpdate

    • for 1jσdo

    • end

    • Insert |ZiZj+σ|to TAB

    • for i+1jσdo

    • end

    • Insert |ZiZj|to TA

    • Insert |Zi+σZj+σ|to TB

    • Parameters: Z,σ,D

    • Let TA,TB,TABbe interval trees with 2Dleaf nodes

    • // Initialize within distance trees

    • for iiσdo

    • end

    • // Initialize between distance tree

    • for 1iσdo

    • end

    • =approxmedian

    • bestStat=τ(kτ)k(2m1m2m3)

    • bestLoc=σ

    • τ=σ

    • forwardMove = 0

    • // Update trees

    • while τnσdo

    • end

    • return bestLoc

  • 其中关于BackwardUpdate和ForwardUpdate等具体操做请详见论文

  • 涉及具体参数的选择等问题论文中有简单的说明,并经过实验不断调试理解

PELT(Pruned Exact Linear Time)

PELT算法是优化有了由Yao和Jackson提出的最优划分方法(The Optimal Partitioning Method),该方法的目标是最小化以下目标:

m+1i=1[C(y(τi1+1):τi)+β)]

F(s)等于上式,对于y1:s序列中,存在Γs={τ:0=τ0<τ1<τ1<...<τm<τm+1=s}是待检测出来的变点集合,令F(0)=β,能够获得以下的表达式:

F(s)=minτΓs{m+1i=1[C(y(τi1+1:τi))+β]}

F(s)=mint{minτΓtmi=1[C(y(τi1+1):τi)+β+C(y(t+1):n)+β}

F(s)=mint{F(t)+C(y(t+1):n)+β}

  • 根据上述公式推导,获得以下的算法描述(Optimal Partitioning)




    • Let n=length of data and set F(0)=βcp(0)=NULL

    • A set of data of the form, (y1,y2,...,yn)where yiR

    • A measure of fit C(.)dependent on the data

    • A penalty constant βwhich does not depend on the number or location of changepoints

    • Input

    • Initialise:

    • Interate for τ=1,2,...,n

    • Output the change points recorded in cp(n)

    1. Calculate F(τ)=min0τ<τ[F(τ)+C(y(τ+1):τ)+β]

    2. Let τ=arg{min0τ<τ[F(τ)+C(y(τ+1):τ)+β]}

    3. Set cp(τ)=(cp(τ,τ))

  • PELT是将上述算法修改称线性时间,其中设计到一些推论证实,具体的请参照论文《Optimal detection of changepoints with a linear computational cost》


折点描述

在物理学中,折点是不可导点,这代表该店没有切线,因此也不会有速度,在到折点以前,一定要通过一个减速阶段,将速度变成零,而后在向另外一个方向加速。

在时序描述中,要发现数据中的尖刺点,同时也要发现时序中的断层点(或者解释成突增、突降点检测)。

1. 峰值分位数检测

将原始时序数据x(t)通过平滑后,求序列的一阶差分序列xdiff(t),利用以下方法寻找异常值:

  • 使用KSigma方法找到时序中的异常点

  • 使用Quantile方法找到时序中的峰值点

2. 均值漂移检测

给定检测窗口长度w,经过下式能够计算t{2w,N}以前每一个点的均值漂移值。

r(t)=xt+xt1+...+xtw+1xtw+xtw1+...+xt2w+1

根据检测出来r(t)值,利用KSigma异常检测方法,能够较好的获得时序中的断层点信息。


平台实验结果
  • 调用命令

* | select ts_cp_detect(stamp, val, 1.0, 1, 'avg') limit 500
* | select ts_breakout_detect(stamp, val, 5, 1, 'avg') limit 500

硬广时间

日志进阶

阿里云日志服务针对日志提供了完整的解决方案,如下相关功能是日志进阶的必备良药:

  1. 机器学习语法与函数: https://help.aliyun.com/document_detail/93024.html

  2. 日志上下文查询:https://help.aliyun.com/document_detail/48148.html

  3. 快速查询:https://help.aliyun.com/document_detail/88985.html

  4. 实时分析:https://help.aliyun.com/document_detail/53608.html

  5. 快速分析:https://help.aliyun.com/document_detail/66275.html

  6. 基于日志设置告警:https://help.aliyun.com/document_detail/48162.html

  7. 配置大盘:https://help.aliyun.com/document_detail/69313.html

更多日志进阶内容能够参考:日志服务学习路径。


联系咱们

纠错或者帮助文档以及最佳实践贡献,请联系:悟冥
问题咨询请加钉钉群:



参考文献

  1. Leveraging Cloud Data to Mitigate User Experience from ‘Breaking Bad’

  2. An Algorithm for Optimal Partitioning of Data on an Interval

  3. Optimal detection of changepoints with a linear computational cost

  4. Introduction to optimal changepoint detection algorithms

  5. Survey of Peaks/Valleys identification in Time Series

  6. Box Plot: Display of Distribution

  7. 箱形图

【云栖快讯】阿里巴巴小程序繁星计划,20亿补贴第一弹云应用当即开通购买,限量从速!  

详情请点击


本文分享自微信公众号 - SQL数据分析(dianwu_dw)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索