网络KPI异常检测之时序分解算法

举报
chenjinge 发表于 2020/06/05 09:10:37 2020/06/05
【摘要】 如何去发现时间序列中的规律、找出其中的异常点呢?接下来,我们将揭开这些问题的面纱。

时间序列数据伴随着我们的生活和工作。从牙牙学语时的“1, 2, 3, 4, 5, ……”到房价的走势变化,从金融领域的刷卡记录到运维领域的核心网性能指标。时间序列中的规律能加深我们对事物和场景的认识,时间序列中的异常能提醒我们某些部分可能出现问题。那么如何去发现时间序列中的规律、找出其中的异常点呢?接下来,我们将揭开这些问题的面纱。



           
一、什么是异常          

直观上讲,异常就是现实与心理预期产生较大差距的特殊情形。如2020年春节的新型肺炎(COVID-19,coronavirus disease 2019),可以看到2月12日有一个明显的确诊病例的升高,这就是一个异常点,如下图:



  
 

从统计上讲,严重偏离预期的点,常见的可以通过3-sigma准则来判定。


从数学上讲,它就是一个分段函数:

image.png


那么我们有哪些方法来发现异常呢?异常分析的方法有很多,在本文中,我们主要讲解时间序列分解的算法。接下来,我们先从时间序列的定义开始讲起。


                    
二、什么是时间序列          


前面章节,我们列举了生活和工作中的一些时间序列的例子,但是并没有给出定义。在本节中,我们将首先给出时间序列的定义,然后给出时间序列的分类方法,最后再给大家展示常见的时间序列。


>>>>    

1. 时间序列的定义



时间序列是不同时间点的一系列变量所组成的有序序列。例如北京市2013年4月每日的平均气温就构成了一个时间序列,为了方便,我们一般认为序列中相邻元素具有相同的时间间隔。


时间序列可以分为确定的和随机的。例如,一个1990年出生的人,从1990年到1999年年龄可以表述为{0,1,2,…,9},这个序列并没有任何随机因素。这是一个确定性的时间序列。现实生活中我们所面对的序列更多的是掺杂了随机因素的时间序列,例如气温、销售量等等,这些是带有随机性的例子。我们说的时间序列一般是指带有随机性的。


那么对于随机性的时间序列,又如何进行分类呢?



>>>>  

2. 时间序列的分类



从研究对象上分,时间序列分为一元时间序列和多元时间序列,如新冠肺炎例子中,只看确诊病例的变化,它是一元时间序列。如果把确诊病例和疑似病例联合起来看,它是一个多元时间序列。


从时间参数上分,时间序列分为离散时间的时间序列和连续时间的时间序列。例如气温变化曲线,通常是按照天、小时进行预测、计算的,这个采集的时间是离散的,因此,它是一个离散时间的时间序列。再如花粉在水中呈现不规则的运动,它无时无刻不在运动,它是一个连续时间的时间序列,这就是大家众所周知的布朗运动。在我们的工作中,我们一般遇到的都是离散时间的时间序列。


从统计特征上分,时间序列分为平稳时间序列和非平稳时间序列。平稳序列从直观上讲,均值和标准差不随着时间发生变化,而非平稳序列均值或者标准差一般会随着时间发生变化。下面两个图分别给出平稳序列和非平稳序列的例子。



   
>>>>    

3. 常见的时间序列


在本节,我们将给大家列举一些常见的时间序列,让大家对常见的时间序列有一个直观的概念。





   


           


           
三、时间序列的分解          


前面给大家讲了异常和时间序列的概念,本章将给大家讲解时间序列分解技术。


   
>>>>    

1. 目的


  

时间序列分解是探索时序变化规律的一种方法,主要探索周期性和趋势性。基于时序分解的结果,我们可以进行后续的时间预测和异常检测。



 
>>>>  

2. 主要组成部分


在时间序列分析中,我们经常要关注趋势和周期。因此,一般地,我们将时序分成三个部分:趋势部分、周期部分和残差部分。结合下图CO2含量的例子(见下图)对这三个主要部分进行解释:


1)趋势部分:展示了CO2含量逐年增加;

2)周期部分:反应了一年中CO2含量是周期波动的;

3)残差部分:趋势和周期部分不能解释的部分。



   
>>>>    

3. 时序分解模型


时间序列分解基于分解模型的假设。通常,我们会考虑以下两种模型:

image.png


在一个时间序列中,加法模型假设周期、趋势和残差三个部分是可加的,而乘法模型假设周期、趋势和残差三个部分是乘积关系。虽然加法模型在形式上差异很大,但是他们之间是可以相互转化的, 乘法模型经过log变换后即可变成加法模型,数学表达如下:

image.png


那么在使用中,加法模型和乘法模型该如何进行选择呢?


加法模型适用于以下场景:

1)当周期性不随着趋势发生变化时,首选加法模型,如下图(a);

2)当目标存在负值时,应选择加法模型;


乘法模型适用于以下场景:

1)周期随着随时发生变化时,首选乘法模型,如下图(b);

2)经济数据,首选乘法模型(增长率、可解释)。


image.png


另外,当我们不清楚选择哪个模型时,可以两个模型都使用,选择误差最小的那一个。


由于乘法模型与加法模型可以相互转化,我们后面仅以加法模型来进行介绍。


   
>>>>    

4. 时序分解算法


基于周期、趋势分解的时序分解算法主要有经典时序分解算法、Holt-Winters算法和STL算法。经典时序分解算法起源于20世纪20年代,方法较简单。Holt-Winters算法于1960年由Holt的学生 Peter Winters 提出,能够适应随着时间变化的季节项。STL(Seasonal and Trend decomposition using Loess)分解法,由Cleveland 等于1990年提出,比较通用,且较为稳健。三者之间的关系,如下图所示:



4.1.  经典时序分解算法


经典时序分解算法是最简单的一种分解算法,它是很多其他分解算法的基础。该算法基于“季节部分不随着时间发生变化”这一假设,且需要知道序列的周期。另外,该算法基于滑动平均技术。


其中,m=2k+1. 也就是说,时刻t的趋势项的估计值可以通过前后k个时刻内的平均值得到。阶数 m 越大,趋势越光滑。由上面的公式可以看出,m一般取奇数,这保证了对称性。但是在很多场景下,周期是偶数,例如一年有4个季度,则周期为4,是偶数。此时,需要做先做一个4阶滑动平均(4-MA),再对所得结果做一个2阶滑动平均(2-MA),整个过程记为2×4-MA 。这样处理后的结果是对称的,即加权的滑动平均,数学表达如下:


下面我们将讲解经典时序分解算法的计算步骤。


假设一个序列的周期为m,经典时序分解算法的步骤如下:


经典时序分解算法虽然简单、应用广泛,但是也存在一些问题:


1)无法估计序列最前面几个和最后面几个的趋势和周期部分,例如若m=4,则无法估计前2个和后2个观测的趋势和周期的部分;

2)严重依赖“季节性部分每个周期都是相同的”这一假设;

3)过度光滑趋势部分。


4.2.  Holt-Winters算法

在上一节中,我们介绍了经典时序分解算法,但是它严重依赖“季节性部分每个周期都是相同的”这一假设。为了能够适应季节部分随时间发生变化,Holt-Winters算法被提出。Holt-Winters算法是基于简单指数光滑技术。首先,我们先介绍简单指数光滑技术。


简单指数光滑的思想主要是以下两点:

1)对未来的预测:用当前的水平对下一时刻的点进行预测;

2)当前水平的估计:使用当前时刻的观测值和预测值(基于历史观测数据的预测值,即上一时刻的水平)的加权平均作为当前水平的估计。


简单指数光滑的模型比较简单,如下:


Holt-Winters算法是简单指数光滑在趋势(可理解为水平的变化率)和季节性上的推广,主要包括水平(前文中的趋势项)、趋势项和季节项三个部分。



4.3.  STL算法


STL(Seasonal and Trend decomposition using Loess)是一个非常通用的、稳健性强的时序分解方法,其中Loess是一种估算非线性关系的方法。STL分解法由 Cleveland et al. (1990) 提出。


STL算法中最主要的是局部光滑技术 (locally weighted scatterplot smoothing, LOWESS or LOESS),有时也称为局部多项式回归拟合。它是对两维散点图进行平滑的常用方法,它结合了传统线性回归的简洁性和非线性回归的灵活性。当要估计某个响应变量值时,先从其预测点附近取一个数据子集(如下图点  是要预测的点,选取周围的点   来进行拟合),然后对该子集进行线性回归或二次回归,回归时采用加权最小二乘法(如下图,采用的是高斯核进行加权),即越靠近估计点的值其权重越大,最后利用得到的局部回归模型来估计响应变量的值。用这种方法进行逐点运算得到整条拟合曲线。



STL算法的主要环节包含内循环、外循环和季节项后平滑三个部分:


1)内循环:







2)外循环:

外循环主要作用则是引入了一个稳健性权重项,以控制数据中异常值产生的影响,这一项将会考虑到下一阶段内循环的临近权重中去。


3)季节项后平滑:

趋势分量和季节分量都是在内循环中得到的。循环完后,季节项将出现一定程度的毛刺现象,因为在内循环中平滑时是在每一个截口中进行的,因此,在按照时间序列重排后,就无法保证相邻时段的平滑了,为此,还需要进行季节项的后平滑,后平滑基于局部二次拟合,并且不再需要在loess中进行稳健性迭代。

            
           
四、异常判断的准则          

对于异常的判断,我们常用的有 n-sigma 准则和boxplot准则(箱线图准则)。那这些准备是如何计算的,有哪些区别和联系呢?


>>>>  

1. n-sigma准则



n-sigma准则有计算简单、效率高且有很强的理论支撑,但是需要近似正态的假设,且均值和标准差的计算用到了全部的数据,因此,受异常点的影响较大。


>>>>  

2. boxplot 准则



为了降低异常点的影响,boxplot准则被提出。boxplot(箱线图)是一种用作显示一组数据分散情况的统计图,经常用于异常检测。BoxPlot的核心在于计算一组数据的中位数、两个四分位数、上限和下限,基于这些统计值画出箱线图。



根据上面的统计值就可以画出下面的图,超过上限的点或这个低于下限的点都可以认为是异常点。



从上面的计算上可以看出,boxplot对异常点是稳健的。



           
五、基于时序分解的异常检测算法          

在前面的章节,我们了解了时序分解的算法,也学习了异常判断的准则,那么如何基于时序分解进行异常检测呢?在本章,我们将首先给出异常检测算法的原理,再给出基于时序分解的异常检测算法步骤。


>>>>  

1. 异常检测算法原理


回顾一下异常的定义,它是一个分段函数:



我们可以看到预测值(拟合值)和阈值是不知道的。对于预测值,我们可以通过找规律来猜这个预测值是多少,本章我们可以通过时序分解找周期和趋势的规律,进而得到预测值。对于阈值,我们可以看到阈值是针对真实值和预测值的差值设置的,目的是把异常值找到,因此我们只要找到正常值的残差和异常值的残差的边界即可。而我们n-sigma准则和boxplot准则就可以根据残差把边界找出来,即阈值。这个思考和实现的过程示意图如下:



>>>>  

2. 基于时序分解的异常检测算法


本节我们给出基于“STL算法+boxplot准则”的异常检测算法,详细步骤如下:



           

  Demo代码下载地址 



作者:胡大海

来源:公众号【网络人工智能园地】


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。