В мае 2021 года LinkedIn выпускает библиотеку прогнозирования временных рядов Greykite, чтобы упростить процесс прогнозирования для своих специалистов по данным.
Введение в GreyKite
Библиотека Greykite - это библиотека Python с открытым исходным кодом, разработанная для поддержки потребностей LinkedIn в прогнозировании. LinkedIn разработал GreyKite, чтобы помочь своей команде принимать эффективные решения на основе модели прогнозирования временных рядов. Основным алгоритмом прогнозирования, используемым в этой библиотеке, является Silverkite
, который автоматизирует прогнозирование.
Модель Silverkite имеет множество предварительно настроенных шаблонов (т. е. конфигураций параметров), которые подходят для различных частот прогнозов, горизонтов и шаблонов данных. Помимо Silverkite, он также включает интерфейс для модели Пророка, разработанной Facebook. В таблице ниже описаны варианты.
Некоторые ключевые преимущества грейкита:
- Гибкость: предоставляет регрессоры временных рядов (тренд, сезонность, праздники, точки изменения и авторегрессия).
- Интуитивный: предоставляет мощные инструменты построения графиков, шаблоны моделей и выдает интерпретируемые выходные данные (сводные данные модели и графики компонентов).
- Быстро: упрощает интерактивное создание прототипов, поиск по сетке и тестирование.
- Extensible Framework: предоставляет несколько алгоритмов прогнозирования в одном интерфейсе. Один и тот же конвейер обеспечивает предварительную обработку, перекрестную проверку, тестирование на истории, прогноз и оценку с использованием любого алгоритма.
Другими ключевыми преимуществами greykite являются: исследовательский анализ данных, предварительная обработка выбросов / аномалий, извлечение и разработка признаков, поиск по сетке, оценка, сравнительный анализ и построение графиков.
Схема архитектуры GreyKite:
- Зеленый: входные данные модели (временные ряды, аномалии, потенциальные события, потенциальные будущие регрессоры, авторегрессивные компоненты и даты точек изменений).
- Оранжевый: выходные данные модели (прогнозы, интервалы прогнозирования и диагностика: показатели точности, визуализации и сводки).
- Синий: этапы вычисления алгоритма.
Пример: прогноз цен на биткойны
Биткойн - это децентрализованная цифровая валюта без центрального банка, которую можно отправлять от пользователя к пользователю в одноранговой сети биткойнов без необходимости в посредниках. Транзакции проверяются сетевыми узлами с помощью криптографии и записываются в общедоступный распределенный реестр, называемый цепочкой блоков.
Точные знания о будущем пригодятся любому бизнесу. Прогнозы временных рядов могут предоставить будущие ожидания для показателей и других величин, которые можно измерить с течением времени.
Давайте код!
1. Установка
Greykite
доступен в PyPI и может быть установлен с помощью pip:
pip install greykite
Библиотека Greykite
доступна на GitHub и PyPI. Дополнительные советы по установке см. В разделе установка.
2. Импорт всего необходимого
from collections import defaultdict import warnings warnings.filterwarnings("ignore") import pandas as pd import numpy as np import plotly import plotly.offline as pyo import plotly.graph_objs as go pyo.init_notebook_mode() from greykite.common.data_loader import DataLoader from greykite.framework.templates.autogen.forecast_config import ForecastConfig from greykite.framework.templates.autogen.forecast_config import MetadataParam from greykite.framework.templates.forecaster import Forecaster from greykite.framework.templates.model_templates import ModelTemplateEnum from greykite.framework.utils.result_summary import summarize_grid_search_results
3. Импортировать набор данных
df = pd.read_csv('dataset.csv') df['date'] = pd.to_datetime(df['Timestamp'],unit='s').dt.date group = df.groupby('date') Price = group['Weighted_Price'].mean()
df_price_zz=Price.to_frame() df_price_zz['Timestamp'] = df_price_zz.index df_price_zz['Timestamp'] = pd.to_datetime(df_price_zz['Timestamp']) df_price_zz.reset_index(drop=True,inplace=True) df_price_include_zz = df_price_zz[df_price_zz['Timestamp'].dt.year >= 2017] df_price_include_zz.reset_index(drop=True,inplace=True) # df_price_include_zz df_price_include_zz.set_index("Timestamp", inplace = True) df_price_include_zz
Price.to_numpy() df_price=Price.to_frame() df_price['Timestamp'] = df_price.index df_price['Timestamp'] = pd.to_datetime(df_price['Timestamp']) df_price.reset_index(drop=True,inplace=True) df_price_include = df_price[df_price['Timestamp'].dt.year >= 2017] df_price_include.reset_index(drop=True,inplace=True) prediction_days = 50 df_train= df_price_include_zz[:len(df_price_include_zz)-prediction_days] df_test= df_price_include_zz[len(df_price_include_zz)-prediction_days:]
4. Создайте прогноз.
Сначала укажите информацию о наборе данных. Мы устанавливаем параметр time_col
как «Timestamp», параметр value_col
как «Weighted_Price» и устанавливаем значение freq
как D для ежедневного использования в дату начала.
metadata = MetadataParam( time_col="Timestamp", value_col="Weighted_Price", freq="W" )
После этого создайте прогнозиста с помощью класса Forecaster из пакета GreyKite. Мы можем выбрать модель прогнозирования Prophet
или Silverkite
.
В этом примере мы используем 'Silverkite
:
forecaster = Forecaster() # Creates forecasts and stores the result result = forecaster.run_forecast_config( # result is also stored as `forecaster.forecast_result`. df=df, config=ForecastConfig( model_template=ModelTemplateEnum.SILVERKITE.name, forecast_horizon=365, # forecasts 365 steps ahead coverage=0.95, # 95% prediction intervals metadata_param=metadata ) )
5. Проверьте результаты.
Результатом run_forecast_config
является словарь, который содержит будущий прогноз, исторические характеристики прогноза и исходные временные ряды.
Давайте построим исходные таймсерии, а интерактивный график будет создан plotly
ts = result.timeseries fig = ts.plot() plotly.io.show(fig)
6. Перекрестная проверка
По умолчанию run_forecast_config
обеспечивает историческую оценку, она сохраняется в grid_search
(перекрестная проверка) и backtest
(набор проверок удержания).
По умолчанию все метрики в 'ElementwiseEvaluationMetricEnum
вычисляются для каждой перекрестной проверки, разделенной на поезд / тест. Конфигурацию показателей оценки перекрестной проверки можно найти в разделе «Метрика оценки».
grid_search = result.grid_search cv_results = summarize_grid_search_results( grid_search=grid_search, decimals=2, # The below saves space in the printed output. Remove to show all available metrics and columns. cv_report_metrics=None, column_order=["rank", "mean_test", "split_test", "mean_train", "split_train", "mean_fit_time", "mean_score_time", "params"]) # Transposes to save space in the printed output cv_results["params"] = cv_results["params"].astype(str) cv_results.set_index("params", drop=True, inplace=True) cv_results.transpose()
7. Построение бэктеста
Построим исторический прогноз на тестовой выборке.
backtest = result.backtest fig = backtest.plot() plotly.io.show(fig)
Мы также можем проверить исторические метрики оценки (на историческом наборе обучения / тестирования).
backtest_eval = defaultdict(list) for metric, value in backtest.train_evaluation.items(): backtest_eval[metric].append(value) backtest_eval[metric].append(backtest.test_evaluation[metric]) metrics = pd.DataFrame(backtest_eval, index=["train", "test"]).T metrics
Атрибут forecast
содержит прогнозируемый результат. Как и в случае backtest
, мы можем построить график результата.
forecast = result.forecast fig = forecast.plot() plotly.io.show(fig)
Прогнозируемые значения доступны в df
forecast.df.head().round(2)
8. Диагностика модели.
График компонента показывает, как в модели обрабатываются тенденции, сезонность и события / праздники нашего набора данных:
fig = forecast.plot_components() plotly.io.show(fig)
9. Сводка модели
Сводка модели позволяет изучить отдельные термины модели. Проверьте оценки параметров и их значимость, чтобы понять, как работает модель и что можно улучшить.
summary = result.model[-1].summary() # -1 retrieves the estimator from the pipeline print(summary)
12. Результат моделирования
Обученная модель доступна как подогнанная sklearn.pipeline.Pipeline
model = result.model model
13. Прогнозирование значений на будущие периоды времени.
Для создания этого фрейма данных можно использовать вспомогательную функцию make_future_dataframe
. Здесь мы прогнозируем следующие 4 периода после даты окончания поезда модели.
future_df = result.timeseries.make_future_dataframe( periods=4, include_history=False) future_df
Позвоните .predict()
, чтобы вычислить прогнозы.
model.predict(future_df)
Ссылки для следующего исследования:
Для дополнительных инструментов, которые помогут нам улучшить наш прогноз и понять результат:
Ссылки:
Для получения дополнительных технических подробностей мы можем прочитать этот документ: