Merlion 是一个用于时间序列智能的 Python 库。它提供了一个端到端的机器学习框架,包括数据加载和转换、模型构建和训练、模型输出后处理以及模型性能评估。它支持各种时间序列学习任务,包括单变量和多变量时间序列的预测、异常检测和变点检测。该库旨在为工程师和研究人员提供一站式解决方案,以快速开发适合其特定时间序列需求的模型,并在多个时间序列数据集上进行基准测试。
Merlion 的主要特点包括:
DefaultDetector
和 DefaultForecaster
模型,它们高效、稳健地实现良好性能,并为新用户提供起点。下表直观地概述了 Merlion 的主要特性与其他时间序列异常检测和/或预测库的比较。
Merlion | Prophet | Alibi Detect | Kats | darts | statsmodels | nixtla | GluonTS | RRCF | STUMPY | Greykite | pmdarima | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
单变量预测 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |||
多变 量预测 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ||||||
单变量异常检测 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |||
多变量异常检测 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ||||||
预处理 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ||||
后处理 | ✅ | ✅ | ||||||||||
AutoML | ✅ | ✅ | ✅ | |||||||||
集成 | ✅ | ✅ | ✅ | ✅ | ||||||||
基准测试 | ✅ | ✅ | ✅ | ✅ | ✅ | |||||||
可视化 | ✅ | ✅ | ✅ | ✅ | ✅ |
以下特性是 Merlion 2.0 的新增功能:
Merlion | Prophet | Alibi Detect | Kats | darts | statsmodels | nixtla | GluonTS | RRCF | STUMPY | Greykite | pmdarima | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
外生回归变量 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ||||||
变点检测 | ✅ | ✅ | ✅ | ✅ | ✅ | |||||||
可点击的可视化界面 | ✅ | |||||||||||
分布式后端 | ✅ | ✅ |
Merlion 由两个子仓库组成:merlion
实现了库的核心时间序列智能功能,而 ts_datasets
为多个时间序列数据集提供了标准化的数据加载器。这些加载器将时间序列加载为带有附加元数据的 pandas.DataFrame
。
您可以通过调用 pip install salesforce-merlion
从 PyPI 安装 merlion
。您也可以通过克隆此仓库并调用 pip install Merlion/
来从源代码安装,或调用 pip install -e Merlion/
以可编辑模式安装。您可以通过 pip install salesforce-merlion[all]
安装额外的依赖项,或者如果从源代码安装,则调用 pip install "Merlion/[all]"
。单独的可选依赖项包括用于 GUI 仪表板的 dashboard
,用于 PySpark 分布式计算后端的 spark
,以及用于所有深度学习模型的 deep-learning
。
要安装数据加载包 ts_datasets
,请克隆此仓库并调用 pip install -e Merlion/ts_datasets/
。如果您不想在初始化每个数据集的数据 加载器时手动指定其根目录,则必须以可编辑模式(即使用 -e
标志)安装此包。
请注意以下外部依赖项:
我们的一些预测模型依赖于 OpenMP。如果使用 conda
,请在安装我们的包之前执行 conda install -c conda-forge lightgbm
。这将确保 OpenMP 在您的 conda
环境中配置为与 lightgbm
包(我们的一个依赖项)一起工作。如果使用 Mac,请安装 Homebrew 并调用 brew install libomp
,以便 OpenMP 库可用于该模型。
我们的一些异常检测模型依赖于 Java 开发工具包(JDK)。对于 Ubuntu,调用 sudo apt-get install openjdk-11-jdk
。对于 Mac OS,安装 Homebrew 并调用 brew tap adoptopenjdk/openjdk && brew install --cask adoptopenjdk11
。还要确保可以在您的 PATH
中找到 java
,并且设置了 JAVA_HOME
环境变量。
有关示例代码和 Merlion 的介绍,请参阅 examples
中的 Jupyter 笔记本,以及这里的指导性演练。您可以在这里找到详细的 API 文档(包括示例代码)。技术报告概述了 Merlion 的整体架构,并展示了单变量和多变量时间序列异常检测和预测的实验结果。
最简单的入门方式是使用基于 GUI 的网页仪表板。这个仪表板提供了一种快速在您自己的自定义数据集上试验多个模型的好方法。要使用它,请安装带有可选 dashboard
依赖项的 Merlion(即 pip install salesforce-merlion[dashboard]
),并从命令行调用 python -m merlion.dashboard
。您可以在 http://localhost:8050 查看仪表板。下面我们展示了异常检测和预测的仪表板截图。
为了帮助您在自己的代码中开始使用 Merlion,我们在下面提供了使用 Merlion 默认模型进行异常检测和预测的最小示例。
这里,我们展示了复现上面异常检测仪表板结果的代码。我们首先导入 Merlion 的 TimeSeries
类和 Numenta 异常基准 NAB
的数据加载器。然后,我们可以将该数据集中的特定时间序列划分为训练和测试部分。
from merlion.utils import TimeSeries from ts_datasets.anomaly import NAB # 数据加载器返回 pandas DataFrames,我们将其转换为 Merlion TimeSeries time_series, metadata = NAB(subset="realKnownCause")[3] train_data = TimeSeries.from_pd(time_series[metadata.trainval]) test_data = TimeSeries.from_pd(time_series[~metadata.trainval]) test_labels = TimeSeries.from_pd(metadata.anomaly[~metadata.trainval])
然后,我们可以初始化并训练 Merlion 的 DefaultDetector
,这是一个平衡性能和效率的异常检测模型。我们还获取其在测试集上的预测。
from merlion.models.defaults import DefaultDetectorConfig, DefaultDetector model = DefaultDetector(DefaultDetectorConfig()) model.train(train_data=train_data) test_pred = model.get_anomaly_label(time_series=test_data)
接下来,我们可视化模型的预测。
from merlion.plot import plot_anoms import matplotlib.pyplot as plt fig, ax = model.plot_anomaly(time_series=test_data) plot_anoms(ax=ax, anomaly_labels=test_labels) plt.show()
最后,我们可以定量评估模型。精确率和召回率来自于模型触发了3个警报,其中2个为真正例,1个为假负例,1个为假正例。我们还评估了模型正确检测到每个异常所需的平均时间。
from merlion.evaluate.anomaly import TSADMetric p = TSADMetric.Precision.value(ground_truth=test_labels, predict=test_pred) r = TSADMetric.Recall.value(ground_truth=test_labels, predict=test_pred) f1 = TSADMetric.F1.value(ground_truth=test_labels, predict=test_pred) mttd = TSADMetric.MeanTimeToDetect.value(ground_truth=test_labels, predict=test_pred) print(f"精确率: {p:.4f}, 召回率: {r:.4f}, F1值: {f1:.4f}\n" f"平均检测时间: {mttd}")
精确率: 0.6667, 召回率: 0.6667, F1值: 0.6667
平均检测时间: 1天 10:22:30
这里,我们展示了复现上述预测面板结果的代码。
首先,我们导入Merlion的TimeSeries
类和M4
数据集的数据加载器。然后我们可以将该数据集中的特定时间序列划分为训练集和测试集。
from merlion.utils import TimeSeries from ts_datasets.forecast import M4 # 数据加载器返回pandas DataFrame,我们将其转换为Merlion TimeSeries time_series, metadata = M4(subset="Hourly")[0] train_data = TimeSeries.from_pd(time_series[metadata.trainval]) test_data = TimeSeries.from_pd(time_series[~metadata.trainval])
然后,我们可以初始化并训练Merlion的DefaultForecaster
,这是一个平衡性能和效率的预测模型。我们还获取了它在测试集上的预测结果。
from merlion.models.defaults import DefaultForecasterConfig, DefaultForecaster model = DefaultForecaster(DefaultForecasterConfig()) model.train(train_data=train_data) test_pred, test_err = model.forecast(time_stamps=test_data.time_stamps)
接下来,我们可视化模型的预测结果。
import matplotlib.pyplot as plt fig, ax = model.plot_forecast(time_series=test_data, plot_forecast_uncertainty=True) plt.show()
最后,我们对模型进行定量评估。sMAPE衡量预测误差,范围从0到100(越低越好),而MSIS评估95%置信区间的质量,范围同样从0到100(越低越好)。
# 定量评估模型的预测结果 from scipy.stats import norm from merlion.evaluate.forecast import ForecastMetric # 计算预测的sMAPE(0到100,越小越好) smape = ForecastMetric.sMAPE.value(ground_truth=test_data, predict=test_pred) # 计算模型95%置信区间的MSIS(0到100,越小越好) lb = TimeSeries.from_pd(test_pred.to_pd() + norm.ppf(0.025) * test_err.to_pd().values) ub = TimeSeries.from_pd(test_pred.to_pd() + norm.ppf(0.975) * test_err.to_pd().values) msis = ForecastMetric.MSIS.value(ground_truth=test_data, predict=test_pred, insample=train_data, lb=lb, ub=ub) print(f"sMAPE: {smape:.4f}, MSIS: {msis:.4f}")
sMAPE: 4.1944, MSIS: 18.9331
Merlion的一个关键特性是评估流程,它模拟了模型在历史数据上的实时部署。这使您能够在相关数据集上比较模型,模 拟它们在生产环境中可能遇到的情况。我们的评估流程如下:
我们提供了脚本,允许您使用这个流程在任意数据集上评估任意模型。例如,运行
python benchmark_anomaly.py --dataset NAB_realAWSCloudwatch --model IsolationForest --retrain_freq 1d
将评估IsolationForest