时间序列的异常检测是实际应用中的一个关键问题,尤其是在 IT 行业。我们没有采用传统的基于阈值的方法来实现异常检测,而是通过深度学习提出了一种无阈值方法:基于 LSTM 网络的基线(一个 LSTM 框架辅助几个优化步骤)和无监督检测(神经网络和多种机器学习算法的组合)协同综合分析时间序列。当时间序列显示出清晰的周期性形态的情况下基线表现良好,而无监督检测在效率要求高且周期性不太清晰的情况下表现出色。通过两个并行模块的互补设计,可以在不依赖阈值设定和调整的情况下实现无阈值异常检测。京东云内部实践证明,我们所提出的无阈值方法获得了准确的预测和可靠的检测。
在过去的几年中,aiops业界提出了各种解决异常检测问题的方法。机器学习 (ML) 和深度学习 (DL) 颇受欢迎。在传统的 ML 中,通常采用 K-means、基于密度的空间聚类和隔离森林 (IForest)等聚类方法。除了 ML,由于其强大的逼近能力,使用深度神经网络 (DNN) 进行时间序列预测和异常检测被越来越多的算法同学使用。多层感知器 (MLP) 是一种基本的 DNN 架构,用于评估时间序列上异常检测的性能。此外,循环神经网络 (RNN) 及其变体,如长短期记忆 (LSTM) 网络和门控循环单元 (GRU) 是解决与时间序列相关的问题的常用方法。
对于大多数上述用于解决异常检测的方法,一般是时间序列是否超出预定义的上限和下限。然而,固定阈值无法表征具有内在动态趋势变化的时间序列,从而导致异常分析不准确。此外,由于单个阈值无法涵盖所有异常情况,因此该方法也容易遗漏异常。此外,设置上限和下限的过程是一项复杂且重要的任务,总是需要为各种情况定义新的阈值,耗时长且迁移性差。
为了解决上述问题,我们介绍一种新方法,即通过 DL 进行无阈值异常检测。
我们的方法不需要预定义上限和下限,而是通过抽取一些易于调整的参数,在小范围内自动搜索适配不同场景的监控数据,进而实现无阈值异常检测:基于 LSTM 网络的基线模块(LnB)和无监督检测模块(UnD)。具体来说,LnB 生成基线,该基线能够以自适应和自动的方式表征时间序列的动态特征。 LnB 的框架是用 LSTM 网络构建的,长短周期识别方法是此框架的贡献之一,它引入了一种纠正机制,可以实现更准确的拟合,生成的基线描述了检测到的时间序列的主要特征,提供了替代传统阈值的限制。 UnD是一种DL和多种ML算法的合并模型,基于投票机制从各个角度检测到的时间序列是否正常。两个模块中的任何一个检测到异常表明发生了异常。两个模块的融合使我们所提出的方法能够以互补和全面的方式有效地分析具有不确定性或各种周期性的时间序列。
时间序列X=(x1, x2, ..., xt),我们的目标是确定下一步 xt+1 的值是否异常。历史值有助于模型学习指标当前和未来的状态,但与预测值距离越近的点对模型预测的影响越大。因此,我们选择使用时间序列 Xt-T:t 的序列,而不是取时间序列的单个步长或整个历史序列来进行异常检测。 T 是选择作为模型训练输入的序列长度。下图1为无阈值异常检测的总体框架包括两个阶段,即训练过程和在线检测。
LnB 和 UnD两个模块都可以单独完成异常检测。但是两个模块有不同的擅长方面,每个模块的结构差异为检测到的时间序列提供了不同维度的检测结果。其中,LnB将更长时期的历史数据输入到模块中,它可以很好地说明特定时间序列的长期行为,但是 LnB 对那些周期性不明确的指标的异常检测能力较弱。相反,UnD 从一个 DL 模型和多个 ML 模型中获得投票结果,对具有不确定性或各种周期性的时间序列具有更强的鲁棒性。此外,UnD 在输入的检测指标的历史数据不足的情况下提供了更合理的检测。
图 1 中的实线箭头表示前向流,而虚线箭头表示反向传播训练。在得到每个模块的检测结果后,根据为每个模块设置的损失函数分别对LnB和UnD进行反向传播训练,LnB和UnD都进行更新,即模型训练。在模型训练之后,LnB 学习生成一个自适应基线,同时,LnB为UnD赋予 基于无监督学习预测未来异常状态的能力。
在线检测不需要训练步骤,所以按入参格式输入时间序列,可直接得到检测结果。这训练和在线检测两个模块的详细介绍如下:
其中 f 表示模型学习所采用的网络,Ti 表示第 i 天的数据。 在训练阶段,a 和 b 会及时随着传入的指标数据自动更新,形成可适应的基线。在测试状态下,y ' final 是我们的最终预测。长短周期识别的重点是引入校正项,为历史上最有价值的“记忆”赋予更多的权重。
如上所述,有两种方法用于识别长短周期,即峰值检测和 SBD距离计算。每天的峰值数量、每天的峰值最大值以及每天第一和第二个最大值的残差是用于识别长短周期,除了这种峰值检查,SBD 是识别长短周期的替代方法。假设我们有两个输入序列 X 和 Y(在我们的例子中,14 天的数据被平均分成两部分)。两个序列的SBD结果可以根据以下等式计算,
其中 SBD 的范围从 0 到 2,在我们的案例中 s=0。 SBD 越小,说明两个序列属于同一周期的相似度越高。
最佳开始时间通过寻找不同时间粒度(如10s 和 1min)下的最佳开始时间来关注拟合精度。待检测的时间序列总是遵循一定的周期性,但根据我们的实验验证,在不同位置选择的开始时间可能会导致拟合精度不同。我们选取均方根误差 (RMSE) 用作优化搜索过程的目标函数:
其中 y' 代表预测结果,而 y 代表基本事实。 k 表示检测到的序列中的第 k 个起始位置。采用L-BFGS通过最小化目标函数实现自动搜索。
基线生成 LnB 的核心过程是基线生成。与RNN相比,LSTM包含了三个门,即遗忘门、输入门和输出门,这种门设计在识别历史中的重要信息方面表现出更好的性能,减轻了对远程历史的依赖和梯度消失。输入数据经 LSTM,输出理论上暗示了正常数据的期望。因此,我们将损失函数训练为:
通过减少实际值和预测值之间的误差,网络可以学习预测时间序列的正常行为。
我们选择 95% 置信区间,计算基线的上限和下限:
LnB 的最后一步是自适应调整,这是实现“自适应”的关键步骤。通过 LSTM 获得的上限和下限是初始基线。然后通过极值点平滑和插值修改初始基线。即初始基线中的所有峰点和谷点都形成了初始上限和下限。然后采用拉格朗日插值进行细粒度数据填充以形成平滑的基线。
DL (GRU) 和 ML(IForest、基于角度的异常值检测-ABOD 和基于集群的局部异常值因子-CBLOF)从多个级别检测异常,不需要标签信息或阈值定义。作为回归任务,GRU 学习给定时间序列的正态分布并输出对未来的预测。与 LSTM 从长期历史中捕捉内在特征的能力相比,GRU 在数据量不足且需要效率的情况下理论上表现良好。与 LnB 不同,UnD 将较短的序列作为输入。因此,UnD 中的 GRU 单元是 LnB 的补充。另一方面,IForest、ABOD 和 CBLOF 是用于异常检测的三种基于 ML 的聚类算法。 UnD的最终检测是GRU、IForest、ABOD和CBLOF通过投票方案的合并结果。
对于 GRU,我们采用与 LnB 相同的损失函数。区别在于输入长度(在下一节中解释)。训练有素的 GRU 会给出预测的准确值 y'。在这里,定义异常权重 (AW) 以确定预测是否异常。
AW 是异常识别的关键决定因素,并且根据经验知识自动学习以满足在我们的案例中检测到的异常百分比应在 1%-3% 以内的条件。当涉及到不同的领域或数据集时,也可以根据经验知识确定 AW。 IForest、ABOD和CBLOF是常用的异常值检测方法,它们的输出结果可以看作是一个描述异常概率的分数。然后将所有 GRU、IForest、ABOD 和 CBLOF 的检测结果编码并拼接成一个 one-hot 矩阵,其中 0 表示正常,1 表示异常,如图 3 所示的示例。接下来,我们得到每个时间步对应的“1”的总数。通过与投票数 n (在我们的例子中 n = 2)的比较,如果“1”的总数不小于 n ,则合并结果被检测为异常,反之亦然。 n 是一个参数,需要通过几个简单的试验来确定,例如逐渐增加值或缩小范围。
通过投票方案的合并结果可以从不同方面揭示内在特征,因为 GRU 的回归结果包含显示增加或减少趋势的精确值,而 ML 结果呈现 0 或 1 仅表示异常与否,但具有更准确的决策,因为这些模型可以利用从附加维度或测量中捕获的信息(例如,基于角度视角的 ABOD 和基于概率视角的 CBLOF)。因此,多个高级算法的合并结果可以充分利用给定的数据进行全面的预测。
我们的模型主要有三个步骤,详细介绍如下:
第一步:数据预处理
LnB和UnD对数据拆分和连接有不同的要求,两个模块的输入数据是不同的。例如,当前时间为 t,时间序列的周期性为 T(如 7 天)。我们的目标是检测 t+1 时刻的值是否异常。在这种情况下,LnB 的输入是过去 2*T 周期(即 14 天)收集的历史数据。选择 2*T 周期的原因是 14 天之前的历史数据重要性较低,如果只收集一个周期的数据,可能会受到异常事件的影响。相反,UnD采用最相关的信息而不是使用长历史,并且选择三个滑动窗口覆盖的序列作为输入数据。三个窗口的长度分别为 30 分钟、60 分钟和 60 分钟。
从图4可以看出,UnD输入中有3个段串联,即[Xt-30min:t, Xt+1-1day-30min:t+1- 1day+30min, Xt+1-7days-30min: t+1-7 天+30 分钟]。这种连接提供了一种新的输入结构设计,为特征学习和未来预测提供了最相关的信息。总之,LnB 将过去 14 天的序列作为输入,而 UnD 将过去 30 分钟、1 天前的 60 分钟和 7 天前的 60 分钟作为输入。
数据填充采用 K-NN 作为数据填充方法,以确保所有输入样本的长度相同且可读。数据过滤为保证输入数据的有效性,对输入数据进行平滑过滤,以消除因噪声引起的毛刺。数据转换对训练结果和快速收敛非常重要。在输入训练过程之前,原始数据还需要一个转换过程,包括归一化和对数转换,如(7)所示。
归一化避免了不同维度的副作用,有利于模型快速收敛。此外,它还确保输出不会超过输入的最小值和最大值,因为在输出上实施了指数变换。同时,对数变换可以在不改变数据特征和数据相关性的情况下,减轻方差,平滑变化。
第二步:模型训练
如图 1 中的流程图所示,LnB 和 UnD 都是根据训练数据分别训练的。但是,如上所述,两个模块的输入是不同的。 LnB 将较长的历史数据作为输入,并尝试捕获检测到的时间序列的丰富信息,而 UnD 将最相关但较短的序列部署为训练数据。 UnD 中的GRU和 LnB通过减少第二部分中介绍的损失函数来学习检测到的序列的正常行为。同时,IForest、ABOD 和 CBLOF 学习了无监督聚类模型。上述单元的所有输出都是一步超前的异常检测。
第三步:在线异常检测
在运行时,传入的数据首先进入预处理模块,然后同时进入LnB和UnD。输入数据的格式应与训练阶段一致。如果两个模块的任一结果异常,则提示待检测数据异常。LnB和UnD的融合机制对时间序列进行了全面的检测,降低了潜在异常遗漏的概率。另一方面,LnB 中较长的历史输入和 UnD 中的多模型投票方案有效地避免了将正常的误认为是异常的。
经过京东内部多场景多组数据验证,模型在线上运行的效果评估如下表所示:
此外,可以灵活选择“and”或“or”来整合LnB和UnD的结果。没有统一的规则,要看实际场景的需求。在我们的落地实践场景中,这两个数据集都需要保证召回率,因此我们采取“或”操作,这意味着无论哪个检测到异常都会报警。如果需要较低的警告级别,我们可以选择“和”作为积分运算。选择三个流行的基线 IForest、ABOD 和 CBLOF 进行比较。此外。我们还比较了我们的方法和单独使用 LnB 或 UnD 的方法的结果,如上表所示。从定量比较中,很明显,所提出的方法,即 LnB+UnD 在两者中都获得了最高的 F1 分数数据集。 LnB+UnD 的组合比单独采用 LnB 或 UnD 效果更好。而且我们的模型优于其他三个基线,这也证明了我们并行机制的有效性和必要性。
我们提出的一种用于时间序列分析的无阈值异常检测方法,即 LSTM 构建的 LnB和DL、ML 模型融合机制构建的 UnD,以互补和智能的方式实现异常检测。在具有不同长短周期和变化趋势的真实实践场景的两个数据集上进行了实验,比较结果证明了我们方法的有效性和准确性。
Threshold-free Anomaly Detection for Streaming Time Series through Deep Learning. ICMLA.
**ieeexplore检索:**https://ieeexplore.ieee.org/abstract/document/9680175
作者:张静
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵