EGADS框架处理流程分析
最近在搞异常检测相关的工作,因此调研了业界常用的异常检测系统。通过查阅相关资料,发现业界对雅虎开源的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源码,笔者将框架处理流程划分为四部分:
- 初始化配置文件和输入文件
主函数加载配置文件 sample_config.ini
和数据输入文件sample_input.csv
,并实例化输入文件的处理对象FileInputProcessor
。 这里要说明一点,如果数据是以其他形式输入的,如通过控制台输入,则需要示例化控制台输入的处理对象StdinProcessor
.
- 把输入文件转化为TimeSeries列表
FileInputProcessor
负责把输入文件转化为List<TimeSeries>
,其中一个TimeSeries
对象存储了一列时间戳及对应的一列值,若输入文件若包含了一列时间戳和n
列值,那么就会产生n
个TimeSeries
组成的列表。
同时TimeSeries
也封装了时序数据的元数据信息,如文件名,列名称等。然后根据配置中的参数,判断是否需要对输入数据进行简单的缺失值处理和聚合处理。
- 加载时序模型和异常检测模型
使用ProcessableObjectFactory
工厂类构建时间序列模型。时序模型通过类加载器加载并实例化,示例中实例化的类为OlympicModel
, 然后把时间序列TimeSeries
和时序模型List<TimeSeriesModel>
封装成ModelAdapter
,作为时序模型的模块。
使用ProcessableObjectFactory
工厂类构建异常检测模型。异常检测模型通过类加载器加载并实例化,示例中实例化的类为ExtremeLowDensityModel
, 然后把时间序列TimeSeries
和异常检测模型List<AnomalyDetectionModel>
封装成AnomalyDetector
,作为异常检测模型的模块。
最后把时序模型的模块ModelAdapter
和异常检测模型的模块AnomalyDetector
封装成异常检测处理模块DetectAnomalyProcessable
.
- 使用时序模型预测,并使用异常检测模型检测出异常点
先使用时间序列训练模型,根据训练好的模型得到预期值,这里使用的模型为OlympicModel
。接着使用异常检测模型计算若干项误差指标对应的阈值,其中误差指标包括:MAE, sMAPE, MAPE, MASE,再根据各个误差指标的阈值检测出异常点,这里使用的模型为ExtremeLowDensityModel
。
下图是EGADS框架详细的处理流程图。
4. 参考资料
- https://github.com/yahoo/egads
- Yahoo 大规模时列数据异常检测技术及其高性能可伸缩架构 https://www.infoq.cn/article/automated-time-series-anomaly-detection