В мае 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)

Ссылки для следующего исследования:

Для дополнительных инструментов, которые помогут нам улучшить наш прогноз и понять результат:

Ссылки:















Для получения дополнительных технических подробностей мы можем прочитать этот документ: