最近在搞异常检测相关的工作,因此调研了业界常用的异常检测系统。通过查阅相关资料,发现业界对雅虎开源的EGADS系统评价比较高,其git项目已有980个star。这周阅读了项目的源码,梳理了系统框架的基本处理流程,整理成这篇文章。现分享给大家,希望对想了解EGADS系统工作原理的同学有所帮助。

1. 简介

EGADS (Extensible Generic Anomaly Detection System 可扩展通用的异常检测系统) 是雅虎开源的java库,用于自动检测大规模时序数据中的异常。它包含了许多异常检测技术,适用于很多使用情况,只需要一个包,唯一依赖是java。EDADS的工作原理是,首先建立一个时间序列模型来计算时间t的预期值,然后通过对比时间t的预期值和实际值,计算出若干误差E。EDADS自动确定E的阈值,并输出最有可能的异常点。EGADS库可以在各种各样的情形中使用,以检测具有各种季节性、趋势和噪声成分的时间序列中的异常点和变化点。

EGADS能够准确、可扩展地检测时间序列的异常。EGADS将预测和异常检测分离成两个独立的组件,允许用户将自己的模型添加到任何组件中。

2. 整体架构

EGADS框架由两个重要部分组成:时间序列建模模块(TMM)和异常检测模块(ADM)。给定一个时间序列,TMM组件对时间序列建模生成预期值,该值随后被ADM消费并计算出异常评分。EGADS是作为一个框架构建的,可以很容易地集成到现有的监测基础实施中。Yahoo内部的Yahoo监控服务(YMS)每秒处理数百万的数据点。因此,有一个 可扩展的、准确的和自动化的异常检测 对于YMS至关重要。基于此,EGADS可以编译成一个轻量级jar包,并且很容易大规模部署。TMM和ADM可以在main/java/com/yahoo/egads/models找到。

EGADS系统将输入数据转化为时间序列,然后选择一个时间序列模型应用于时间序列,构成时间序列建模模块(TSMM),再把异常检测模型应用于时间序列建模模块输出的预测值,构成异常检测模块(ADM),最终把检测出的异常点写入DB。整体架构如下图所示。

3. 框架处理流程

EGADS的github上给出了一个简单使用案例:

java -Dlog4j.configurationFile=src/test/resources/log4j2.xml -cp target/egads-*-jar-with-dependencies.jar com.yahoo.egads.Egads src/test/resources/sample_config.ini src/test/resources/sample_input.csv

以github上的示例为例,通过阅读EGADS源码,笔者将框架处理流程划分为四部分:

  1. 初始化配置文件和输入文件

主函数加载配置文件 sample_config.ini 和数据输入文件sample_input.csv ,并实例化输入文件的处理对象FileInputProcessor 。 这里要说明一点,如果数据是以其他形式输入的,如通过控制台输入,则需要示例化控制台输入的处理对象StdinProcessor.

  1. 把输入文件转化为TimeSeries列表

FileInputProcessor 负责把输入文件转化为List<TimeSeries>,其中一个TimeSeries对象存储了一列时间戳及对应的一列值,若输入文件若包含了一列时间戳和n 列值,那么就会产生nTimeSeries组成的列表。

同时TimeSeries也封装了时序数据的元数据信息,如文件名,列名称等。然后根据配置中的参数,判断是否需要对输入数据进行简单的缺失值处理和聚合处理。

  1. 加载时序模型和异常检测模型

使用ProcessableObjectFactory工厂类构建时间序列模型。时序模型通过类加载器加载并实例化,示例中实例化的类为OlympicModel, 然后把时间序列TimeSeries和时序模型List<TimeSeriesModel>封装成ModelAdapter,作为时序模型的模块。

使用ProcessableObjectFactory工厂类构建异常检测模型。异常检测模型通过类加载器加载并实例化,示例中实例化的类为ExtremeLowDensityModel, 然后把时间序列TimeSeries和异常检测模型List<AnomalyDetectionModel>封装成AnomalyDetector,作为异常检测模型的模块。

最后把时序模型的模块ModelAdapter和异常检测模型的模块AnomalyDetector封装成异常检测处理模块DetectAnomalyProcessable.

  1. 使用时序模型预测,并使用异常检测模型检测出异常点

先使用时间序列训练模型,根据训练好的模型得到预期值,这里使用的模型为OlympicModel。接着使用异常检测模型计算若干项误差指标对应的阈值,其中误差指标包括:MAE, sMAPE, MAPE, MASE,再根据各个误差指标的阈值检测出异常点,这里使用的模型为ExtremeLowDensityModel

下图是EGADS框架详细的处理流程图。

4. 参考资料

  1. https://github.com/yahoo/egads
  2. Yahoo 大规模时列数据异常检测技术及其高性能可伸缩架构 https://www.infoq.cn/article/automated-time-series-anomaly-detection

EGADS框架处理流程分析的更多相关文章

  1. Android之 MTP框架和流程分析

    概要 本文的目的是介绍Android系统中MTP的一些相关知识.主要的内容包括:第1部分 MTP简介            对Mtp协议进行简单的介绍.第2部分 MTP框架            介绍 ...

  2. vue2源码框架和流程分析

    vue整体框架和主要流程分析 之前对看过比较多关于vue源码的文章,但是对于整体框架和流程还是有些模糊,最后用chrome debug对vue的源码进行查看整理出这篇文章.... 本文对vue的整体框 ...

  3. ThinkPHP 框架执行流程分析

    总体来说,应用的流程涉及到几个文件:Index.phpThinkPHP.phpThink.class.phpApp.class.phpDispatcher.class.phpThinkPHP/Mode ...

  4. [Abp vNext 源码分析] - 1. 框架启动流程分析

    一.简要说明 本篇文章主要剖析与讲解 Abp vNext 在 Web API 项目下的启动流程,让大家了解整个 Abp vNext 框架是如何运作的.总的来说 ,Abp vNext 比起 ABP 框架 ...

  5. [Abp 源码分析]一、Abp 框架启动流程分析

    Abp 不一定仅用于 Asp.Net Core 项目,他也可以在 Console 与 WinFrom 项目当中进行使用,所以关于启动流程可以分为两种,一种是 Asp.Net Core 项目的启动流程, ...

  6. nodejs的Express框架源码分析、工作流程分析

    nodejs的Express框架源码分析.工作流程分析 1.Express的编写流程 2.Express关键api的使用及其作用分析 app.use(middleware); connect pack ...

  7. rest_framework框架之认证功能的使用和源码实现流程分析

    rest_framework框架之认证的使用和源码实现流程分析 一.认证功能的源码流程 创建视图函数 Note 创建视图函数后,前端发起请求,url分配路由,执行视图类,视图类中执行对应方法必须经过d ...

  8. 01 . Go框架之Beego简介部署及程序流程分析

    Beego简介 beego是一个使用Go语言来开发WEB引用的GoWeb框架,该框架起始于2012年,由一位中国的程序员编写并进行公开,其目的就是为大家提供一个高效率的web应用开发框架.该框架采用模 ...

  9. Android多媒体框架总结(1) - 利用MediaMuxer合成音视频数据流程分析

    场景介绍: 设备端通过服务器传向客户端(Android手机)实时发送视频数据(H.264)和音频数据(g711a或g711u), 需要在客户端将音视频数据保存为MP4文件存放在本地,用户可以通过APP ...

随机推荐

  1. rocketMq指定broker ip地址,适合解决云主机部署问题

      在工作中遇到了一个这个问题,就是我们rocketmq是部署在云主机上的 但是我们的开发同事在自己的电脑连接rocketmq链接不上 报错显示Caused by: org.apache.rocket ...

  2. java和python的时间格式化区别

    java 和 python时间格式化区别 月份,java是M,python是m 分钟,java是m,python是M 年份,必须用yyyy,表示当天所在的年份,如果用YYYY,则表示当前周所在年份 j ...

  3. python的数据缓存

    Python的数据缓存 python 的内置数据类型,数值型,字符串,列表,字典等都会有自己的对象缓存池, 这样做的好处是,避免了频繁的申请内存,释放内存,这样会极大的降低应用程序的运行速度,还会造成 ...

  4. python 通过pip freeze、dowload打离线包及自动安装【适用于保密的离线环境】

    python的pip是其包管理工具,相当方便好用.本文只介绍pip 如何通过其freeze命令打离线包,及其离线包的安装脚本.这个知识点,特别适用于不适合连通互联网,设备需要物理隔绝,保密要求严格的客 ...

  5. java中对象的简单解读

    对象=属性(int double之类都是变量的属性)+方法(想要实现内容,所做的一套算法) 属性=变量的所有数据 方法(c语言中叫做函数)=算法 总而言之 对象就是  给他所需要的的数据-->& ...

  6. js 乘除算法 浮点 精度解决办法

    js中进行浮点数运算时容易出现精度问题 1) 除法函数 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显.这个函数返回较为精确的除法结果. //调用:accDiv(a ...

  7. Spring(二)--IoC&AOP

    IOC 一.IOC概述: 一般指控制反转(inversion of Control),把创建对象的权利交给框架,Ioc容器控制对象,是框架的重要特征,并非是面向对象编程的专用术语.它包括依赖注入(DI ...

  8. 【进阶之路】线程池拓展与CompletionService操作异步任务

    大家好,我是练习java两年半时间的南橘,小伙伴可以一起互相交流经验哦. 一.扩展ThreadPoolExecutor 1.扩展方法介绍 ThreadPoolExecutor是可以扩展的,它内部提供了 ...

  9. 如何优雅地使用云原生 Prometheus 监控集群

    作者陈凯烨,腾讯云前端开发工程师.负责 TKE 集群,弹性集群和云原生监控等模块控制台开发. 概述 Prometheus 是一套开源的系统监控报警框架.2016 年,Prometheus 正式加入 C ...

  10. js深克隆与浅克隆

    定义: 浅克隆: 克隆对象的一层属性, 如果对象还有对象的话,里面的对象没有进行克隆,只是把地址给了别人.也可以理解为只是简单的克隆了躯体,但是没有得到其灵魂: 深克隆:克隆对象的多层属性,对象里面还 ...