
Сквозной Python-фреймворк для интеллектуального анализа временных рядов, предлагающий обнаружение аномалий, прогнозирование, обнаружение точек изменения, AutoML, ансамбли и конвейеры бенчмаркинга.
Merlion — это библиотека Python для интеллектуального анализа временных рядов. Она предоставляет сквозной фреймворк машинного обучения, который включает загрузку и преобразование данных, создание и обучение моделей, постобработку выходных данных моделей и оценку качества моделей. Она поддерживает различные задачи обучения на временных рядах, включая прогнозирование, обнаружение аномалий и обнаружение точек изменения как для одномерных, так и для многомерных временных рядов. Библиотека призвана предоставить инженерам и исследователям комплексное решение для быстрой разработки моделей под их конкретные задачи с временными рядами и их сравнения на множестве наборов данных временных рядов.
Ключевые возможности Merlion:
DefaultDetector и DefaultForecaster, которые эффективны, стабильно показывают хорошие результаты
и служат отправной точкой для новых пользователей.В приведенной ниже таблице наглядно показано, как ключевые возможности Merlion соотносятся с другими библиотеками для обнаружения аномалий и/или прогнозирования временных рядов.
Следующие возможности появились в Merlion 2.0:
Merlion состоит из двух подрепозиториев: merlion реализует основные функции библиотеки для интеллектуального анализа временных рядов,
а ts_datasets предоставляет стандартизированные загрузчики данных для нескольких наборов данных временных рядов. Эти загрузчики загружают
временные ряды как pandas.DataFrame s с сопутствующими метаданными.
Вы можете установить merlion из PyPI, выполнив pip install salesforce-merlion. Вы также можете установить из исходного кода,
клонировав этот репозиторий и выполнив pip install Merlion/, или pip install -e Merlion/ для установки в режиме редактирования.
Вы можете установить дополнительные зависимости через pip install salesforce-merlion[all] или, при установке из исходного кода,
выполнив pip install "Merlion/[all]".
В отдельности дополнительные зависимости включают dashboard для графической панели управления,
spark для распределенного вычислительного бэкенда с PySpark и deep-learning для всех моделей глубокого обучения.
Чтобы установить пакет загрузки данных ts_datasets, клонируйте этот репозиторий и выполните pip install -e Merlion/ts_datasets/.
Этот пакет необходимо устанавливать в режиме редактирования (то есть с флагом -e), если вы не хотите вручную указывать
корневой каталог каждого набора данных при инициализации его загрузчика.
Обратите внимание на следующие внешние зависимости:
Некоторые из наших моделей прогнозирования зависят от OpenMP. Если вы используете conda, пожалуйста, выполните conda install -c conda-forge lightgbm
перед установкой нашего пакета. Это гарантирует, что OpenMP будет настроен для работы с пакетом lightgbm
(одной из наших зависимостей) в вашем окружении conda. Если вы используете Mac, установите Homebrew
и выполните brew install libomp, чтобы библиотека OpenMP была доступна для модели.
Некоторые из наших моделей обнаружения аномалий зависят от Java Development Kit (JDK). Для Ubuntu выполните
sudo apt-get install openjdk-11-jdk. Для Mac OS установите Homebrew и выполните
brew tap adoptopenjdk/openjdk && brew install --cask adoptopenjdk11. Также убедитесь, что java доступен
в вашем PATH и установлена переменная окружения JAVA_HOME.
Примеры кода и введение в Merlion см. в Jupyter-ноутбуках в
examples и в интерактивном руководстве
здесь. Подробную документацию по API (включая
примеры кода) можно найти здесь.
В техническом отчете описана общая архитектура Merlion
и представлены экспериментальные результаты по обнаружению аномалий и прогнозированию как одномерных, так и многомерных
временных рядов.
Самый простой способ начать работу — использовать веб-интерфейс
панели управления.
Эта панель позволяет быстро экспериментировать с множеством моделей на ваших собственных наборах данных.
Для этого установите Merlion с дополнительной зависимостью dashboard (т.е.
pip install salesforce-merlion[dashboard]) и выполните python -m merlion.dashboard из командной строки.
Вы можете просмотреть панель по адресу http://localhost:8050.
Ниже приведены скриншоты панели для обнаружения аномалий и прогнозирования.


Чтобы помочь вам начать использовать Merlion в собственном коде, ниже приведены минимальные примеры с моделями Merlion по умолчанию для обнаружения аномалий и прогнозирования.
Здесь показан код, воспроизводящий результаты панели обнаружения аномалий, приведенной выше.
Начнем с импорта класса TimeSeries из Merlion и загрузчика данных для Numenta Anomaly Benchmark NAB.
Затем мы можем разделить конкретный временной ряд из этого набора данных на обучающую и тестовую выборки.
from merlion.utils import TimeSeries
from ts_datasets.anomaly import NAB
# Data loader returns pandas DataFrames, which we convert to 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])
Затем мы можем инициализировать и обучить DefaultDetector от Merlion — модель обнаружения аномалий, которая
балансирует между производительностью и эффективностью. Мы также получим ее прогнозы на тестовой выборке.
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"Precision: {p:.4f}, Recall: {r:.4f}, F1: {f1:.4f}\n"
f"Mean Time To Detect: {mttd}")
Precision: 0.6667, Recall: 0.6667, F1: 0.6667
Mean Time To Detect: 1 days 10:22:30
Здесь показан код, воспроизводящий результаты панели прогнозирования, приведенной выше.
Начнем с импорта класса TimeSeries из Merlion и загрузчика данных для набора данных M4. Затем мы можем разделить
конкретный временной ряд из этого набора данных на обучающую и тестовую выборки.
from merlion.utils import TimeSeries
from ts_datasets.forecast import M4
# Data loader returns pandas DataFrames, which we convert to 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])
Затем мы можем инициализировать и обучить DefaultForecaster от Merlion — модель прогнозирования, которая
балансирует между производительностью и эффективностью. Мы также получим ее прогнозы на тестовой выборке.
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 (чем меньше, тем лучше).
# Evaluate the model's predictions quantitatively
from scipy.stats import norm
from merlion.evaluate.forecast import ForecastMetric
# Compute the sMAPE of the predictions (0 to 100, smaller is better)
smape = ForecastMetric.sMAPE.value(ground_truth=test_data, predict=test_pred)
# Compute the MSIS of the model's 95% confidence interval (0 to 100, smaller is better)
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 (переобучаемой раз в день) на
подмножестве "realAWSCloudwatch" набора данных NAB. Аналогично, выполнение
python benchmark_forecast.py --dataset M4_Hourly --model ETS
выполнит оценку пакетного прогнозирования (то есть без переобучения) модели ETS на подмножестве "Hourly" набора данных M4.
Результаты выполнения этих скриптов можно найти в разделе Experiments
технического отчета.
Более подробную информацию можно найти в нашем техническом отчете: https://arxiv.org/abs/2109.09265
Если вы используете Merlion в своих исследованиях или приложениях, пожалуйста, цитируйте его с помощью этого BibTeX:
@article{bhatnagar2021merlion,
title={Merlion: A Machine Learning Library for Time Series},
author={Aadyot Bhatnagar and Paul Kassianik and Chenghao Liu and Tian Lan and Wenzhuo Yang
and Rowan Cassius and Doyen Sahoo and Devansh Arpit and Sri Subramanian and Gerald Woo
and Amrita Saha and Arun Kumar Jagota and Gokulakrishnan Gopalakrishnan and Manpreet Singh
and K C Krithika and Sukumar Maddineni and Daeki Cho and Bo Zong and Yingbo Zhou
and Caiming Xiong and Silvio Savarese and Steven Hoi and Huan Wang},
year={2021},
eprint={2109.09265},
archivePrefix={arXiv},
primaryClass={cs.LG}
}
Мы стремимся использовать моделирование временных рядов с GPU для дальнейшего повышения скорости и пропускной способности Merlion. Оставайтесь с нами ...
| Merlion | Prophet | Alibi Detect | Kats | darts | statsmodels | nixtla | GluonTS | RRCF | STUMPY | Greykite | pmdarima |
|---|
| Прогнозирование одномерных рядов | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |||
| Прогнозирование многомерных рядов | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ||||||
| Обнаружение аномалий в одномерных рядах | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |||
| Обнаружение аномалий в многомерных рядах | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ||||||
| Предобработка | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ||||
| Постобработка | ✅ | ✅ | ||||||||||
| AutoML | ✅ | ✅ | ✅ | |||||||||
| Ансамбли | ✅ | ✅ | ✅ | ✅ | ||||||||
| Бенчмаркинг | ✅ | ✅ | ✅ | ✅ | ✅ | |||||||
| Визуализация | ✅ | ✅ | ✅ | ✅ | ✅ |
| Merlion | Prophet | Alibi Detect | Kats | darts | statsmodels | nixtla | GluonTS | RRCF | STUMPY | Greykite | pmdarima |
|---|
| Экзогенные регрессоры | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ||||||
| Обнаружение точек изменения | ✅ | ✅ | ✅ | ✅ | ✅ | |||||||
| Интерактивный визуальный интерфейс | ✅ | |||||||||||
| Распределенный бэкенд | ✅ | ✅ |