Merlion原理
1 简 介
Merlion,一个用于时间序列智能分析的Python包,来源于2021年9月发表的论文《Merlion: A Machine Learning Library for Time Series》。它提供一个端到端的机器学习框架,包括:
1)加载和转换数据
2)构造及训练模型
3)后处理模型结果
4)评价模型性能
它支持不同的时间序列学习任务,包括单变量和多变量时序的预测和异常检测。
Merlion的主要特征:
1)标准化和易于扩展:用于时间序列预测和异常检测任务的数据加载、预处理和基准测试;
2)包含不同模型:用于异常检测和预测,统一在一个共享接口下。模型包括经典统计学方法,树集成模型,深度学习方法。用户可以根据需要进行配置模型;
3)?摘要缺陷检测和缺陷预测器:高效、稳定、性能良好;
4)AutoML:自动超参数优化和模型选择;
5)实用的异常检测器后处理规则:使异常分数更可解释,同时也降低了假阳性率(FP);
6)易使用的集成模型:组合多个模型的输出,以实现结果更具稳定性;
7)灵活的评估管道:模拟生产中模型的实时部署和再训练,并评估预测和异常检测的性能;
8)本地支持模型预测结果可视化。
下表总结了Merlion的关键特征与其他工具的比较情况
单变量预测 | 多变量预测 | 单变量异常检测 | 多变量异常检测 | AutoML | 集成模型 | 基准测试 | 可视化 | |
---|---|---|---|---|---|---|---|---|
alibi-detect | √ | √ | ||||||
Kats | √ | √ | √ | √ | √ | √ | ||
statsmodels | √ | √ | ||||||
gluon-ts | √ | √ | √ | |||||
RRCF | √ | √ | √ | |||||
STUMPY | √ | √ | ||||||
Greykite | √ | √ | √ | √ | ||||
Prophet | √ | √ | √ | |||||
pmdarima | √ | √ | ||||||
Merlion | √ | √ | √ | √ | √ | √ | √ | √ |
2 结构及原理
Merlion模型结构被分成5层:1)数据层加载原始数据,将其转换为Merlion的时间序列数据结构,并执行任何所需的预处理;2)建模层支持广泛的模型,用于预测和异常检测,包括用于自动超参数调优的AutoML;3)后处理层为提高异常检测模型的交互性和降低假阳性率提供了实用的解决方案;4)集成层支持模型组合和模型选择;5)评价层实现了相关的评价指标和模拟生产中模型实时部署的管道。
2.1 Data Layer
Merlion的核心数据结构是时间序列,它代表了一个通用的多元时间序列T作为单变量时间序列 U ( 1 ) , . . . , U ( d ) U^{(1)},...,U^{(d)} U(1),...,U(d)的集合,其中,每个单变量时间序列都是一个序列, U ( i ) = ( t 1 ( i ) , x 1 ( i ) ) , . . . , ( t n ( i ) , x n ( i ) ) U^{(i)}=(t_1^{(i)},x_1^{(i)}),...,(t_n^{(i)},x_n^{(i)}) U(i)=(t1(i),x1(i)),...,(tn(i),xn(i))。可以从pandas的dataframe格式直接转换为TimeSeries格式。一旦从原始数据中初始化TimeSeries格式,merlion.transform支持在传递时间序列到模型之前的许多预处理操作,包括:重采样、归一化、滑动平均、时序差分等。
2.2 Models
所有Merlion模型统一在两个通用API下,一个用于预测,另一个用于异常检测,并且支持 model.train(time_series) 方法。
给定一个一般的多元时间序列 T = ( U ( 1 ) , … , U ( d ) ) T=(U^{(1)},…,U^{(d)}) T=(U(1),…,U(d)),可以通过调用 model.forecast(time_stamps) 预测单个目标单变量 U ( k ) U^{(k)} U(k)。
类似,通过调用 model.get_anomaly_score(time_series) 来获得时间序列T的异常值。值得注意的是,预测器也可以通过处理目标单变量 U ( k ) U^{(k)} U(k)的真值和预测值之间的残差来进行异常检测。这些基于预测的异常检测器同时支持model.forecast(time_stamps)和model.get_anomaly_score(time_series)。
对于需要额外计算的模型,有一个Layer接口,这是AutoML的基础。例如,季节性检测和超参数调优。Layer实现三种方法:generate_theta用于生成超参数候选参数 θ θ θ,evaluate_theta评估 θ θ θ的质量, set_theta将所选的 θ θ θ应用于底层模型。一个单独的类ForecasterAutoMLBase实现forecast和train方法,利用来自Layer类的方法完成预测模型。
最后,所有的模型都支持根据历史数据time_series_prev来确定其预测的能力,可以通过调用model.corded(time_stamps,time_series_prev) 或 model.get_anomaly_score(time_series,time_series_prev) 来获得这些条件预测。
2.3 Post-Processing
所有异常处理都有一个post_rule,它可以对model.get_anomaly_score(time_series) 的输出进行重要的后处理,包括校准calibration(确保了异常分数对应于标准偏差单位,因此在不同的模型之间是可解释的和一致的),阈值thresholding(减少假阳性数量),可以通过调用 model.get_anomaly_label(time_series) 来获得后处理异常值。
2.4 Ensembles and Model Selection
集合被结构化为一个模型,它表示多个底层模型的组合。为此,EnsembleBase类基于单一时间序列 T T T从 m m m个基础模型获得预测 Y 1 , . . . , Y m Y_1,...,Y_m Y1,...,Ym,Combiner类将 Y 1 , . . . , Y m Y_1,...,Y_m Y1,...,Ym合并到集成的输出中。这些结合包括传统的平均集成,以及基于sMAPE等评估指标的模型选择。具体通过EnsembleBase提供的forecast或get_anomaly_score方法进行实现,并且,如果需要的话,train会自动将数据划分为训练集和验证机
2.5 Evaluation Pipeline
最终对模型以模拟线上部署的方式进行最后的验证,线上部署与历史训练最大的区别就是滚动式的模型再训练,类似量化策略的Walk Forward回测。EvaluatorBase类将实现一下评估循环:
1.对最近的历史训练数据训练一个初始模型;
2.在有规律的时间间隔(例如每天一次),根据最新数据对整个模型进行重新训练。这可以是整个历史记录,也可以是一个有限的窗口(例如4周)。
3.获取模型对重新训练之间发生的时间序列值的预测(预测或异常得分)。用户可以自定义这是否应该以批处理、流式处理或以某种中间的节奏进行。
4.将模型的预测与真实值(预测的实际值,或异常检测的标记异常)进行比较,并报告定量评价指标。
本文还为预测和异常检测提供了广泛的评估指标,ForecastMetric和TSADMetric。最后,脚本benchmark_forecast.py和benchmark_anomaly.py,允许用户使用此逻辑轻松地评估ts_datasets模块中包含的任何数据集上的模型性能。