老铁们,大家好,相信还有很多朋友对于时间序列异常值检测和时间序列数据需要做哪些检验的相关问题不太懂,没关系,今天就由我来为大家分享分享时间序列异常值检测以及时间序列数据需要做哪些检验的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
本文目录
一、异常检测(四)——基于相似度的 ***
1、“异常”通常是一个主观的判断,什么样的数据被认为是“异常”的,需要结合业务背景和环境来具体分析确定。实际上,数据通常嵌入在大量的噪声中,而我们所说的”异常值“通常指具有特定业务意义的那一类特殊的异常值。噪声可以视作特性较弱的异常值,没有被分析的价值。
2、在普通的数据处理中,我们通常保留正常的数据,而对噪声和异常值的特性则基本忽略。但在异常检测中,我们弱化了“噪声”和“正常数据”之间的区别,专注于那些具有有价值特性的异常值。在基于相似度的 *** 中,主要思想是异常点与正常点不同。
3、基于距离的 *** 是一种常见的异常检测算法,它基于最邻距离来定义异常值。此类 *** 不仅适用于多维数值数据,在其他领域,例如分类数据,文本数据,时间序列数据序列数据也有广泛的应用。
4、基于距离的异常检测有这样一个前提假设,即异常点的近邻距离要远大于正常点。解决问题的最简单的 *** 是使用嵌套循环。之一层循环遍历每个数据,第二层循环进行异常判断,需要计算当前点与其他点的距离,一旦已识别出多余个数据点与当前点的距离在之内,则将该点自动标记为非异常值。这样计算的时间复杂度为,当数据量较大时,这样计算并不划算。因此需要修剪 *** 以加快距离计算。
5、在基于单元格的技术中,数据空间被划分为单元格,单元格的宽度是阈值D和数据维度数的函数。具体地说,每个维度被划分成宽度最多为单元格。在给定的单元以及相邻的单元中存在的数据点满足某些特性,这些特性可以让数据被更有效的处理
6、以二维情况为例,此时网格间的距离为,需要记住的一点是,网格单元的数量基于数据空间的分区,并且与数据的数量点无关。这是决定该 *** 在低维数据上的效率的重要因素,在这种情况下,网格单元的数量可能不多。另一方面,此 *** 不适用于更高维的数据。对于给定的单元格,其邻居被定义为通过最多1个单元间的边界可从该单元到达的单元格的 *** 。请注意,在一个角上接触的两个单元格也是邻居。邻居是通过跨越2个或者3个边界而获得的那些单元格。上图中显示了标记为的特定单元格及其和邻居集。显然,内部单元具有8个邻居和40个邻居。然后,可以立即观察到以下的几种性质:
7、此过程的之一步是将部分数据点直接标记为非异常值(如果由于之一个规则而导致他们的单元格包含个点以上)。此外,此类单元格的所有相邻单元格仅包含非异常值。为了充分利用之一条规则的修剪能力,确定每个单元格及其邻居中点的总和。如果总数大于,则这些点也都标记为非离群点。
8、接下来,利用第二条规则的修剪能力。对于包含至少一个数据点的每个单元格,计算其中的点数及其和邻居的总和。如果该数字不超过,则将单元格中的所有点标记为离群值。此时,许多单元可能被标记为异常值或非异常值。
9、对于此时仍未标记为异常值或非异常值的单元格中的数据点需要明确计算其最近邻距离。即使对于这样的数据点,通过使用单元格结构也可以更快地计算出个最近邻的距离。考虑到目前为止尚未被标记为异常值或非异常值的单元格。这样的单元可能同时包含异常值和非异常值。单元格中数据点的不确定性主要存在于该单元格的邻居中的点集。无法通过规则知道的邻居中的点是否在阈值距离内,为了确定单元中数据点与其邻居中的点集在阈值距离内的点数,需要进行显式距离计算。对于那些在和中不超过个且距离小于的数据点,则声明为异常值。需要注意,仅需要对单元中的点到单元的邻居中的点执行显式距离计算。这是因为已知邻居中的所有点到中任何点的距离都小于,并且已知中的所有点与上任何点的距离至少为。因此,可以在距离计算中实现额外的节省。
10、对于一个给定数据集,基于索引的 *** 利用多维索引结构(如树、树)来搜索每个数据对象在半径范围内的相邻点。设是一个异常值在其-邻域内允许含有对象的最多个数,若发现某个数据对象的-邻域内出现甚至更多个相邻点,则判定对象不是异常值。该算法时间复杂度在最坏情况下为其中是数据集维数,是数据集包含对象的个数。该算法在数据集的维数增加时具有较好的扩展性,但是时间复杂度的估算仅考虑了搜索时间,而构造索引的任务本身就需要密集复杂的计算量。
11、基于密度的算法主要有局部离群因子(LocalOutlierFactor,LOF),以及LOCI、CLOF等基于LOF的改进算法。下面我们以LOF为例来进行详细的介绍和实践。
12、基于距离的检测适用于各个集群的密度较为均匀的情况。在下图中,离群点B容易被检出,而若要检测出较为接近集群的离群点A,则可能会将一些集群边缘的点当作离群点丢弃。而LOF等基于密度的算法则可以较好地适应密度不同的集群情况。
13、那么,这个基于密度的度量值是怎么得来的呢?还是要从距离的计算开始。类似k近邻的思路,首先我们也需要来定义一个“k-距离”。
14、对于数据集D中的某一个对象o,与其距离最近的k个相邻点的最远距离表示为k-distance(p),定义为给定点p和数据集D中对象o之间的距离d(p,o),满足:
15、由k-距离,我们扩展到一个点的 *** ——到对象o的距离小于等于k-距离的所有点的 *** ,我们称之为k-邻域:。
16、在二维平面上展示出来的话,对象o的k-邻域实际上就是以对象o为圆心、k-距离为半径围成的圆形区域。就是说,k-邻域已经从“距离”这个概念延伸到“空间”了。
17、有了邻域的概念,我们可以按照到对象o的距离远近,将数据集D内的点按照到o的距离分为两类:
18、给定点p关于对象o的可达距离用数学公式可以表示为:。
19、这样的分类处理可以简化后续的计算,同时让得到的数值区分度更高。
20、我们可以将“密度”直观地理解为点的聚集程度,就是说,点与点之间距离越短,则密度越大。在这里,我们使用数据集D中给定点p与对象o的k-邻域内所有点的可达距离平均值的倒数(注意,不是导数)来定义局部可达密度。
21、 给定点p的局部可达密度计算公式为:
22、由公式可以看出,这里是对给定点p进行度量,计算其邻域内的所有对象o到给定点p的可达距离平均值。给定点p的局部可达密度越高,越可能与其邻域内的点属于同一簇;密度越低,越可能是离群点。
23、表示点p的邻域内其他点的局部可达密度与点p的局部可达密度之比的平均数。如果这个比值越接近1,说明o的邻域点密度差不多,o可能和邻域同属一簇;如果这个比值小于1,说明o的密度高于其邻域点密度,o为密集点;如果这个比值大于1,说明o的密度小于其邻域点密度,o可能是异常点。
24、最终得出的LOF数值,就是我们所需要的离群点分数。在sklearn中有LocalOutlierFactor库,可以直接调用。下面来直观感受一下LOF的图像呈现效果。
25、 LocalOutlierFactor库可以用于对单个数据集进行无监督的离群检测,也可以基于已有的正常数据集对新数据集进行新颖性检测。在这里我们进行单个数据集的无监督离群检测。
26、首先构造一个含有集群和离群点的数据集。该数据集包含两个密度不同的正态分布集群和一些离群点。但是,这里我们手工对数据点的标注其实是不准确的,可能有一些随机点会散落在集群内部,而一些集群点由于正态分布的特性,会与其余点的距离相对远一些。在这里我们无法进行区分,所以按照生成方式统一将它们标记为“集群内部的点”或者“离群点”。
27、然后使用LocalOutlierFactor库对构造数据集进行训练,得到训练的标签和训练分数(局部离群值)。为了便于图形化展示,这里对训练分数进行了一些转换。
28、可以看出,模型成功区分出了大部分的离群点,一些因为随机原因散落在集群内部的“离群点”也被识别为集群内部的点,但是一些与集群略为分散的“集群点”则被识别为离群点。
29、 同时可以看出,模型对于不同密度的集群有着较好的区分度,对于低密度集群与高密度集群使用了不同的密度阈值来区分是否离群点。
30、 因此,我们从直观上可以得到一个印象,即基于LOF模型的离群点识别在某些情况下,可能比基于某种统计学分布规则的识别更加符合实际情况。
二、时序异常检测算法
1、 STL表示基于损失的季节性分解的过程。该技术能够将时间序列信号分解为三个部分:季节性变化(seasonal)、趋势变化(trend)和剩余部分(residue)。
2、顾名思义,这种 *** 适用于季节性的时间序列,这是比较常见的情况。
3、这里不太明显的地方是,我们为了得到更可靠的异常检测结果,使用了绝对中位偏差。该 *** 目前更好的实现是 Twitter的异常检测库,它使用了 Generalized Extreme Student Deviation(广义的 ESD算法)测试残差点是否是一个离群点。
4、该 *** 的优点在于其简单性和健壮性。它可以处理很多不同的情况,并且所有的异常情况仍然可以直观解释。
5、它主要擅长于附加的异常值检测。如果想要检测一些水平变化,则可以对移动平均信号进行分析。
6、该 *** 的缺点是在调整选项方面过于死板。你所能做的只有通过显著性水平来调整置信区间。
7、当信号特征发生了剧烈变化时,该 *** 就失效了。例如,跟踪原本对公众是关闭状态的,却突然对公众开放的网站用户数量。在这种情况下,就应该分别跟踪在启动开放之前和开放之后发生的异常。
8、分类回归树(CART)是目前最稳健、最有效的机器学习技术之一。它也可以应用于异常检测问题。
9、分类树学习的更流行实现是 xgboost库。
10、这种 *** 的优点是它不受信号结构的任何约束,而且可以引入许多的特征参数进行学习,以获得更为复杂的模型。
11、该 *** 的缺点是会出现越来越多的特征,这很快会影响到整体的计算性能。在这种情况下,你应该有意识地选择有效特征。
12、自回归移动平均模型(ARIMA)是一种设计上非常简单的 *** ,但其效果足够强大,可以预测信号并发现其中的异常。
13、该 *** 的思路是从过去的几个数据点来生成下一个数据点的预测,在过程中添加一些随机变量(通常是添加白噪声)。以此类推,预测得到的数据点可以用来生成新的预测。很明显:它会使得后续预测信号数据更平滑。
14、使用这种 *** 最困难的部分是选择差异数量、自动回归数量和预测误差系数。
15、该 *** 的另一个障碍是信号经过差分后应该是固定的。也就是说,这意味着信号不应该依赖于时间,这是一个比较显著的限制。
16、异常检测是利用离群点来建立一个经过调整的信号模型,然后利用 t-统计量来检验该模型是否比原模型能更好的拟合数据。
17、该 *** 更受欢迎的实现是 R语言中的 tsoutliers包。在这种情况下,你可以找到适合信号的 ARIMA模型,它可以检测出所有类型的异常。
18、指数平滑 *** 与 ARIMA *** 非常相似。基本的指数模型等价于 ARIMA(0, 1, 1)模型。
19、从异常检测的角度来看,最有趣的 *** 是 Holt-Winters季节性 *** 。该 *** 需要定义季节性周期,比如周、月、年等等。
20、如果需要跟踪多个季节周期,比如同时跟踪周和年周期,那么应该只选择一个。通常是选择最短的那个:所以这里我们就应该选择周季节。
21、这显然是该 *** 的一个缺点,它会大大影响整体的预测范围。
22、和使用 STL或 CARTs *** 一样,我们可以通过统计学 *** 对离群值进行统计来实现异常检测。
23、与 CART *** 一样,神经 *** 有两种应用方式:监督学习和无监督学习。
24、我们处理的数据是时间序列,所以最适合的神经 *** 类型是 LSTM。如果构建得当,这种循环神经 *** 将可以建模实现时间序列中最复杂的依赖关系,包括高级的季节性依赖关系。
25、如果存在多个时间序列相互耦合,该 *** 也非常有用。
三、大数据科学家需要掌握的几种异常值检测 ***
异常值检测与告警一直是工业界非常关注的问题,自动准确地检测出系统的异常值,不仅可以节约大量的人力物力,还能尽早发现系统的异常情况,挽回不必要的损失。个推也非常重视大数据中的异常值检测,例如在运维部门的流量管理业务中,个推很早便展开了对异常值检测的实践,也因此积累了较为丰富的经验。本文将从以下几个方面介绍异常值检测。
异常值,故名思议就是不同于正常值的值。在数学上,可以用离群点来表述,这样便可以将异常值检测问题转化为数学问题来求解。
异常值检测在很多场景都有广泛的应用,比如:
互联网上某些服务器的访问量,可能具有周期性或趋势性:一般情况下都是相对平稳的,但是当受到某些黑客攻击后,其访问量可能发生显著的变化,及早发现这些异常变化对企业而言有着很好的预防告警作用。
正常账户中,用户的转账行为一般属于低频事件,但在某些金融诈骗案中,一些嫌犯的账户就可能会出现高频的转账行为,异常检测系统如果能发现这些异常行为,及时采取相关措施,则会规避不少损失。
一个运行中的流水线,可能会装有不同的传感器用来监测运行中的机器,这些传感器数据就反应了机器运行的状态,这些实时的监测数据具有数据量大、维度广的特点,用人工盯着看的话成本会非常高,高效的自动异常检测算法将能很好地解决这一问题。
本文主要将异常值检测 *** 分为两大类:一类是基于统计的异常值检测,另一类是基于模型的异常值检测。
常见的基于统计的异常值检测 *** 有以下2种,一种是基于3σ法则,一种是基于箱体图。
3σ法则是指在样本服从正态分布时,一般可认为小于μ-3σ或者大于μ+3σ的样本值为异常样本,其中μ为样本均值,σ为样本标准差。在实际使用中,我们虽然不知道样本的真实分布,但只要真实分布与正太分布相差不是太大,该经验法则在大部分情况下便是适用的。
箱体图也是一种比较常见的异常值检测 *** ,一般取所有样本的25%分位点Q1和75%分位点Q3,两者之间的距离为箱体的长度IQR,可认为小于Q1-1.5IQR或者大于Q3+1.5IQR的样本值为异常样本。
基于统计的异常检测往往具有计算简单、有坚实的统计学基础等特点,但缺点也非常明显,例如需要大量的样本数据进行统计,难以对高维样本数据进行异常值检测等。
通常可将异常值检测看作是一个二分类问题,即将所有样本分为正常样本和异常样本,但这和常规的二分类问题又有所区别,常规的二分类一般要求正负样本是均衡的,如果正负样本不均匀的话,训练结果往往会不太好。但在异常值检测问题中,往往面临着正(正常值)负(异常值)样本不均匀的问题,异常值通常比正常值要少得多,因此需要对常规的二分类模型做一些改进。
基于模型的异常值检测一般可分为有监督模型异常值检测和无监督模型异常值检测,比较典型的有监督模型如oneclassSVM、基于神经 *** 的自编码器等。 oneclassSVM就是在经典的SVM基础上改进而来,它用一个超球面替代了超平面,超球面以内的值为正常值,超球面以外的值为异常值。
基于神经 *** 的自编码器结构如下图所示。
将正常样本用于模型训练,输入与输出之间的损失函数可采用常见的均方误差,因此检测过程中,当正常样本输入时,均方误差会较小,当异常样本输入时,均方误差会较大,设置合适的阈值便可将异常样本检测出来。但该 *** 也有缺点,就是对于训练样本比较相近的正常样本判别较好,但若正常样本与训练样本相差较大,则可能会导致模型误判。
无监督模型的异常值检测是异常值检测中的主流 *** ,因为异常值的标注成本往往较高,另外异常值的产生往往无法预料,因此有些异常值可能在过去的样本中根本没有出现过,这将导致某些异常样本无法标注,这也是有监督模型的局限性所在。较为常见的无监督异常值检测模型有密度聚类(DBSCAN)、IsolationForest(IF)、RadomCutForest(RCF)等,其中DBSCAN是一种典型的无监督聚类 *** ,对某些类型的异常值检测也能起到不错的效果。该算法原理网上资料较多,本文不作详细介绍。
IF算法最早由南京大学人工智能学院院长周志华的团队提出,是一种非常高效的异常值检测 *** ,该 *** 不需要对样本数据做任何先验的假设,只需基于这样一个事实——异常值只是少数,并且它们具有与正常值非常不同的属性值。与随机森林由大量决策树组成一样,IsolationForest也由大量的树组成。IsolationForest中的树叫isolation tree,简称iTree。iTree树和决策树不太一样,其构建过程也比决策树简单,因为其中就是一个完全随机的过程。
假设数据集有N条数据,构建一颗iTree时,从N条数据中均匀抽样(一般是无放回抽样)出n个样本出来,作为这颗树的训练样本。
在样本中,随机选一个特征,并在这个特征的所有值范围内(最小值与更大值之间)随机选一个值,对样本进行二叉划分,将样本中小于该值的划分到节点的左边,大于等于该值的划分到节点的右边。
这样得到了一个分裂条件和左、右两边的数据集,然后分别在左右两边的数据集上重复上面的过程,直至达到终止条件。终止条件有两个,一个是数据本身不可再分(只包括一个样本,或者全部样本相同),另外一个是树的高度达到log2(n)。不同于决策树,iTree在算法里面已经限制了树的高度。不限制虽然也可行,但出于效率考虑,算法一般要求高度达到log2(n)深度即可。
把所有的iTree树构建好了,就可以对测试数据进行预测了。预测的过程就是把测试数据在iTree树上沿对应的条件分支往下走,直到达到叶子节点,并记录这过程中经过的路径长度h(x),即从根节点,穿过中间的节点,最后到达叶子节点,所走过的边的数量(path length)。最后,将h(x)带入公式,其中E(.)表示计算期望,c(n)表示当样本数量为n时,路径长度的平均值,从而便可计算出每条待测数据的异常分数s(Anomaly Score)。异常分数s具有如下性质:
1)如果分数s越接近1,则该样本是异常值的可能性越高;
2)如果分数s越接近0,则该样本是正常值的可能性越高;
RCF算法与IF算法思想上是比较类似的,前者可以看成是在IF算法上做了一些改进。针对IF算法中没有考虑到的时间序列因素,RCF算法考虑了该因素,并且在数据样本采样策略上作出了一些改进,使得异常值检测相对IF算法变得更加准确和高效,并能更好地应用于流式数据检测。
上图展示了IF算法和RCF算法对于异常值检测的异同。我们可以看出原始数据中有两个突变异常数据值,对于后一个较大的突变异常值,IF算法和RCF算法都检测了出来,但对于前一个较小的突变异常值,IF算法没有检测出来,而RCF算法依然检测了出来,这意味着RCF有更好的异常值检测性能。
理论还需结合实践,下面我们将以某应用从2016.08.16至2019.09.21的日活变化情况为例,对异常值检测的实际应用场景予以介绍:
从上图中可以看出该应用的日活存在着一些显著的异常值(比如红色圆圈部分),这些异常值可能由于活动促销或者更新迭代出现bug导致日活出现了比较明显的波动。下面分别用基于统计的 *** 和基于模型的 *** 对该日活序列数据进行异常值检测。
从图中可以看出,对于较大的突变异常值,3σ法则和RCF算法都能较好地检测出来,但对于较小的突变异常值,RCF算法则要表现得更好。
上文为大家讲解了异常值检测的 *** 原理以及应用实践。综合来看,异常值检测算法多种多样,每一种都有自己的优缺点和适用范围,很难直接判断哪一种异常检测算法是更佳的,具体在实战中,我们需要根据自身业务的特点,比如对计算量的要求、对异常值的容忍度等,选择合适的异常值检测算法。
接下来,个推也会结合自身实践,在大数据异常检测方面不断深耕,继续优化算法模型在不同业务场景中的性能,持续为开发者们分享前沿的理念与最新的实践方案。
OK,关于时间序列异常值检测和时间序列数据需要做哪些检验的内容到此结束了,希望对大家有所帮助。