数据驱动应用(五):基于时间序列数据的异常识别模型

1. 概述

大型集群系统中,可能存在软件问题和硬件问题导致的系统故障,严重影响了系统的高可用性。这就要求7*24小时,对系统不间断监控。这就意味着需要不间断地监控大量时间序列数据,以便检测系统潜在的故障和异常现象。然而,实际当中的系统异常很多,且不容易发现;从而导致人工方式监控方式效率很低。

异常场景本质上是一个或者多个数据点;数据点一般在系统运行过程中产生,且能反应系统的功能是否正常,多以日志形式呈现。当系统功能发生异常时,就会产生异常数据。快速高效地发现这些异常值,对于快速止损具有重要意义。对此,我们提出一种基于时间序列的异常识别模型,用来及时发现异常。

对于多数系统,一般都有成功率、流量等指标,故障发生时,这些指标也会出现响应的异常。我们将系统成功率、流量统一称为特征值变量,并对其进行建模,从而方便后续其它特征变量的扩展。为了更好地感知这些特征变量的突变,需要对特征变量进行计算处理或者空间转换。那么异常识别问题就转换为以下两个问题:

  • 特征变量的计算处理和转换
  • 突变的判断

针对这两个关键问题,我们将在下文中进行建模和分析。

2. 异常识别

如下图,通过计算器进行特征变量的计算处理和转换,通过异常检测器来判断数值的突变,从而解决上面的两个问题。其中,异常检测器由比较器和决策器组成。
数据驱动应用(五):基于时间序列数据的异常识别模型
对于给定时间序列二维矩阵X={xtmRt0,m0}X=\{x^m_t∈R:∀t≥0, ∀m≥0\}xtmx_t^mtt时刻的第m个指标的真实数据,utmu_t^m表示时间ttxtmx_t^m的计算值,ytmy_t^m为第m个指标的输出结果,yty_t为整体预测结果。

xtmx_t^m通过计算器得到计算值utmu_t^m,然后xtmx_t^mutmu_t^m分别作为比较器的输入,得到第m个指标的输出ytmy_t^myt1y_t^1,yt2y_t^2ytmy_t^m作为决策器的输入得到yty_tyty_t是一个二元值,可以用TRUE(表示输出数据正常),FALSE(表示输入数据异常)表示。下面对计算器和检测器进行说明。

2.1 计算器

计算器用来对输入值xtmx_t^m 进行计算或者空间转换,从而得到特征变量的计算值utmu_t^m。一般情况下,特征变量具有趋势性、周期性等特征。基于这些特征,计算值的获取,可以使用以下三种方式:累计窗口均值计算器、基于趋势性的环比计算器、基于周期性的同比计算器。

2.1.1 累积窗口均值计算器

输入值为xtx_t(为了方便省略指标参数m),如果直接只用单个点xtx_t的抖动来判断,受噪声影响较大。因此,使用累积窗口均值的方式:

u(t)=xt+xt1+...+xtw+1w(1) u(t)={\dfrac{x_t+x_{t-1}+...+x_{t-w+1}}{w}} \tag{1}

其中,ww为累计窗口的大小。通过窗口平滑之后,会过滤掉尖刺等噪声。

2.1.2 基于趋势性的计算器

为了描述数据的趋势性,引入环比类算法。对xtx_t进行空间转换,得到环比,再使用检测器进行检测。

u(t)=xt+xt1+...+xtw+1xtw+xtw1+...+xt2w+1(2)u(t)={\dfrac{x_t+x_{t-1}+...+x_{t-w+1}}{x_{t-w}+x_{t-w-1}+...+x_{t-2w+1}}} \tag{2}

其中,分子为当前窗口ww内的数据,分母为上一窗口ww内数据。通过窗口ww对数据进行平滑。

2.1.3 基于周期性的计算器

为了描述数据的周期性,引入同比算法。当同比值过大或者过小时,认为发生故障。同比公式如下:

u(t)=xt+xt1+...+xtw+1xtkT+xtkT1+...+xtkTw+1(3)u(t)={\dfrac{x_t+x_{t-1}+...+x_{t-w+1}}{x_{t-kT}+x_{t-kT-1}+...+x_{t-kT-w+1}}} \tag{3}

其中TT为周期,kk表示第几个周期。一般选取kk1730,来表示昨天、上周、上个月。

2.1.4 其他类型计算器

计算器还可以使用其他算法,包括:

  • 统计类算法:包括同比、环比算法的改进,或者其他统计算法。此时,计算器的输出结果为预测值,预测值和输入值进行比较即可。
  • 时序型算法:包含ARIMA、Holter-Winter等时序型算法。计算器的输出结果为预测值。
  • 机器学习:根据有监督、无监督、深度学习(LSTM)等算法,训练出的模型即为计算器。此时,计算器的输出结果一般为归一化的值,根据归一化的值进行比较。

这些算法,在这里不再做深入研究和阐述。

2.2 异常检测器

当数据出现异常时,计算值会出现较大偏差,该偏差由异常检测器来判断。异常检测器由比较器和决策器组成,计算值和真实值通过该模块后,得到最终预测结果。

2.2.1 比较器

比较器的本质是求解如下公式的过程:

f(xtm,utm;hm)  =  boolean(4)f(x^m_t,u^m_t;h^m)\ \ = \ \ boolean \tag{4}

其中,xtmx^m_t为真实值,uu为计算值,hmh^m为阈值参数,booleanboolean为结果TRUE/FALSE。真实值已知,计算值通过计算器得到;剩下的阈值参数hmh^m,则需要根据故障发生时的实际值进行参数估计。

很多场景下,该公式还可以简化为:f(utm;hm)  =  booleanf(u^m_t;h^m)\ \ = \ \ boolean ,即计算值直接和阈值比较即可。

2.2.1.1 比较器种类

比较器有两种:相对值比较器和绝对值比较器。给定计算值utmu^m_t和输入值xtmx^m_t,得到绝对值比较器:

f=xtmutm  opretor  hm(5)f= x_t^m−u_t^m\ \ opretor \ \ h^m \tag{5}

其中,opretoropretor为比较操作符,比如> < >= <=。由于utu_txtx_t得到,所以很多情况下公式可以简化为 $ u_t^m \ \ opretor \ \ h_t^m$,即确定计算值的阈值即可。

对于一些场景来说,需要捕获特征变量的相对性。因此,引入相对值比较器:

f=xtmutmutm  opretor  hm(6) f={\dfrac{x_t^m−u_t^m}{u_t^m}}\ \ opretor \ \ h^m \tag{6}

通过对相对值比较器进行阈值处理,既可以检测异常值,同时还能对期望值进行归一化。

2.2.1.2 比较器阈值hh的选取

一般情况下,阈值参数决定了异常检测模块的敏感度。最优阈值的选择,取决于数据分布的性质以及先验数据。一般情况下,阈值的选取方法为

  • 方法一:跟踪一组故障数据和正常数据,根据经验估计阈值。
  • 方法二:跟踪一组故障数据和正常数据,根据经验,并结合3σ准则确定,来确定阈值。(特征变量或者特征变量的组合,服从正态分布)

2.2.2 决策器

如下公式,基于逻辑操作符,对比较器结果进行合并.

  • 方式一:逻辑组合

yt=yt1  &  yt2  &  yt3  &  ...  ytm(7) y_t=y_t^1 \ \ \&| \ \ y_t^2 \ \ \&| \ \ y_t^3 \ \ \&| \ \ ... \ \ y_t^m \tag{7}

其中,|表示逻辑或操作,&\&表示逻辑与操作。

  • 方式二:权重设置法

    yt=k1yt1  +  k2yt2  +  k3yt3  +  ...  kmytm(8)y_t=k_1*y_t^1 \ \ + \ \ k_2*y_t^2 \ \ + \ \ k_3*y_t^3 \ \ + \ \ ... \ \ k_m* y_t^m \tag{8}

其中,kmk_m为系数,这种方式一般适合基本无负样本的场景,参数的确定需要使用层次分析法,将在后面的文章进行说明。

3. 故障止损

上面主要阐述了异常识别的方式。如果条件过于严格,刚开始并不容易被识别出来;如果条件过松,可能导致误识别。对此,我们将止损策略分为两级:

  • 级别一:预警。对于不能完全确定故障发生的场景,使用级别一。
  • 级别二:预警+止损(踢IDC)。对于能确定IDC故障的场景,使用级别二。

4. 实际场景应用

下面通过一个规则的场景,进行举例说明。假如存在如下异常场景:
数据驱动应用(五):基于时间序列数据的异常识别模型

体现在模型中,则级别一(预警)的模型图
数据驱动应用(五):基于时间序列数据的异常识别模型
级别二(预警+踢IDC)的模型图:
数据驱动应用(五):基于时间序列数据的异常识别模型
最终,得到故障识别规则:

  • 级别一触发条件: u1<h1    (u5<h5  &  u6<h6  &  u7<h7)u_1<h_1 \ \ | \ \ (u5<h5 \ \ \& \ \ u6<h6 \ \ \& \ \ u7<h7 )
  • 级别二触发条件:u1<h2  &  u3>h3u_1<h_2 \ \ \& \ \ u_3>h_3​

其中,h1,h2,h3,h5,h6,h7h_1, h_2,h_3,h_5,h_6,h_7为阈值参数。需要结合经验和实际数据估计得到。

5. 小结

本文主要基于时间序列的数据,提出了异常场景识别模型,并重点对基于规则的识别进行了说明。

参考