最近在搞异常检测相关的工做,所以调研了业界经常使用的异常检测系统。经过查阅相关资料,发现业界对雅虎开源的EGADS系统评价比较高,其git项目已有980个star。这周阅读了项目的源码,梳理了系统框架的基本处理流程,整理成这篇文章。现分享给你们,但愿对想了解EGADS系统工做原理的同窗有所帮助。java
EGADS (Extensible Generic Anomaly Detection System 可扩展通用的异常检测系统) 是雅虎开源的java库,用于自动检测大规模时序数据中的异常。它包含了许多异常检测技术,适用于不少使用状况,只须要一个包,惟一依赖是java。EDADS的工做原理是,首先创建一个时间序列模型来计算时间t的预期值,而后经过对比时间t的预期值和实际值,计算出若干偏差E。EDADS自动肯定E的阈值,并输出最有可能的异常点。EGADS库能够在各类各样的情形中使用,以检测具备各类季节性、趋势和噪声成分的时间序列中的异常点和变化点。git
EGADS可以准确、可扩展地检测时间序列的异常。EGADS将预测和异常检测分离成两个独立的组件,容许用户将本身的模型添加到任何组件中。github
EGADS框架由两个重要部分组成:时间序列建模模块(TMM)和异常检测模块(ADM)。给定一个时间序列,TMM组件对时间序列建模生成预期值,该值随后被ADM消费并计算出异常评分。EGADS是做为一个框架构建的,能够很容易地集成到现有的监测基础实施中。Yahoo内部的Yahoo监控服务(YMS)每秒处理数百万的数据点。所以,有一个 可扩展的、准确的和自动化的异常检测 对于YMS相当重要。基于此,EGADS能够编译成一个轻量级jar包,而且很容易大规模部署。TMM和ADM能够在main/java/com/yahoo/egads/models
找到。shell
EGADS系统将输入数据转化为时间序列,而后选择一个时间序列模型应用于时间序列,构成时间序列建模模块(TSMM),再把异常检测模型应用于时间序列建模模块输出的预测值,构成异常检测模块(ADM),最终把检测出的异常点写入DB。总体架构以下图所示。架构
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
.性能
FileInputProcessor
负责把输入文件转化为List<TimeSeries>
,其中一个TimeSeries
对象存储了一列时间戳及对应的一列值,若输入文件若包含了一列时间戳和n
列值,那么就会产生n
个TimeSeries
组成的列表。3d
同时TimeSeries
也封装了时序数据的元数据信息,如文件名,列名称等。而后根据配置中的参数,判断是否须要对输入数据进行简单的缺失值处理和聚合处理。code
使用ProcessableObjectFactory
工厂类构建时间序列模型。时序模型经过类加载器加载并实例化,示例中实例化的类为OlympicModel
, 而后把时间序列TimeSeries
和时序模型List<TimeSeriesModel>
封装成ModelAdapter
,做为时序模型的模块。
使用ProcessableObjectFactory
工厂类构建异常检测模型。异常检测模型经过类加载器加载并实例化,示例中实例化的类为ExtremeLowDensityModel
, 而后把时间序列TimeSeries
和异常检测模型List<AnomalyDetectionModel>
封装成AnomalyDetector
,做为异常检测模型的模块。
最后把时序模型的模块ModelAdapter
和异常检测模型的模块AnomalyDetector
封装成异常检测处理模块DetectAnomalyProcessable
.
先使用时间序列训练模型,根据训练好的模型获得预期值,这里使用的模型为OlympicModel
。接着使用异常检测模型计算若干项偏差指标对应的阈值,其中偏差指标包括:MAE, sMAPE, MAPE, MASE,再根据各个偏差指标的阈值检测出异常点,这里使用的模型为ExtremeLowDensityModel
。
下图是EGADS框架详细的处理流程图。