В этом руководстве мы рассмотрим GluonTS с практической точки зрения, где мы генерируем сложные синтетические наборы данных, подготавливаем их и применяем несколько моделей параллельно. Мы сосредоточимся на том, как работать с различными оценщиками в одном конвейере, изящно обрабатывать отсутствующие зависимости и при этом получать пригодные для использования результаты.
Импорт основных библиотек
Мы начинаем с импорта основных библиотек для работы с данными, визуализации и утилит GluonTS. Мы также настраиваем условные импорты для оценщиков PyTorch и MXNet, что позволяет нам гибко использовать любой бэкенд, доступный в нашей среде.
“`python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
import warnings
warnings.filterwarnings(‘ignore’)
from gluonts.dataset.pandas import PandasDataset
from gluonts.dataset.split import split
from gluonts.evaluation import makeevaluationpredictions, Evaluator
from gluonts.dataset.artificial import ComplexSeasonalTimeSeries
try:
from gluonts.torch import DeepAREstimator
TORCH_AVAILABLE = True
except ImportError:
TORCH_AVAILABLE = False
try:
from gluonts.mx import DeepAREstimator as MXDeepAREstimator
from gluonts.mx import SimpleFeedForwardEstimator
MX_AVAILABLE = True
except ImportError:
MX_AVAILABLE = False
“`
Создание синтетического набора данных
Мы создаём синтетический набор данных, где каждая серия сочетает тренд, сезонность и шум. Мы разрабатываем его так, чтобы каждый запуск давал согласованные результаты, и возвращаем чистый мультисерийный DataFrame, готовый к экспериментам.
“`python
def createsyntheticdataset(numseries=50, length=365, predictionlength=30):
“””Generate synthetic multi-variate time series with trends, seasonality, and noise”””
np.random.seed(42)
series_list = []
for i in range(num_series):
trend = np.cumsum(np.random.normal(0.1 + i*0.01, 0.1, length))
daily_season = 10 np.sin(2 np.pi * np.arange(length) / 7)
yearly_season = 20 np.sin(2 np.pi * np.arange(length) / 365.25)
noise = np.random.normal(0, 5, length)
values = np.maximum(trend + dailyseason + yearlyseason + noise + 100, 1)
dates = pd.date_range(start=’2020-01-01′, periods=length, freq=’D’)
serieslist.append(pd.Series(values, index=dates, name=f’series{i}’))
return pd.concat(series_list, axis=1)
“`
Обучение моделей прогнозирования
Мы генерируем 10-серийный набор данных, оборачиваем его в GluonTS PandasDataset и разделяем на обучающие и тестовые окна. Затем мы инициализируем несколько оценщиков (PyTorch DeepAR, MXNet DeepAR и FeedForward), когда это возможно, и переходим к встроенному искусственному набору данных, если бэкенды не загружаются.
“`python
print(” Creating synthetic multi-series dataset…”)
df = createsyntheticdataset(numseries=10, length=200, predictionlength=30)
dataset = PandasDataset(df, target=df.columns.tolist())
trainingdata, testgen = split(dataset, offset=-60)
testdata = testgen.generateinstances(predictionlength=30, windows=2)
print(” Initializing forecasting models…”)
models = {}
if TORCH_AVAILABLE:
try:
models[‘DeepAR_Torch’] = DeepAREstimator(
freq=’D’,
prediction_length=30
)
print(” PyTorch DeepAR loaded”)
except Exception as e:
print(f” PyTorch DeepAR failed to load: {e}”)
if MX_AVAILABLE:
try:
models[‘DeepAR_MX’] = MXDeepAREstimator(
freq=’D’,
prediction_length=30,
trainer=dict(epochs=5)
)
print(” MXNet DeepAR loaded”)
except Exception as e:
print(f” MXNet DeepAR failed to load: {e}”)
try:
models[‘FeedForward’] = SimpleFeedForwardEstimator(
freq=’D’,
prediction_length=30,
trainer=dict(epochs=5)
)
print(” FeedForward model loaded”)
except Exception as e:
print(f” FeedForward failed to load: {e}”)
if not models:
print(” Using artificial dataset with built-in models…”)
artificial_ds = ComplexSeasonalTimeSeries(
num_series=10,
prediction_length=30,
freq=’D’,
length_low=150,
length_high=200
).generate()
trainingdata, testgen = split(artificial_ds, offset=-60)
testdata = testgen.generateinstances(predictionlength=30, windows=2)
“`
Оценка производительности модели
Мы обучаем каждую доступную модель, генерируем вероятностные прогнозы и оцениваем их с помощью согласованных метрик, прежде чем визуализировать сравнения, остатки и полосы неопределённости.
“`python
trained_models = {}
all_forecasts = {}
if models:
for name, estimator in models.items():
print(f” Training {name} model…”)
try:
predictor = estimator.train(training_data)
trained_models[name] = predictor
forecasts = list(predictor.predict(test_data.input))
all_forecasts[name] = forecasts
print(f” {name} training completed!”)
except Exception as e:
print(f” {name} training failed: {e}”)
continue
print(” Evaluating model performance…”)
evaluator = Evaluator(quantiles=[0.1, 0.5, 0.9])
evaluation_results = {}
for name, forecasts in all_forecasts.items():
if forecasts:
try:
aggmetrics, itemmetrics = evaluator(test_data.label, forecasts)
evaluationresults[name] = aggmetrics
print(f”\n{name} Performance:”)
print(f” MASE: {agg_metrics[‘MASE’]:.4f}”)
print(f” sMAPE: {agg_metrics[‘sMAPE’]:.4f}”)
print(f” Mean wQuantileLoss: {aggmetrics[‘meanwQuantileLoss’]:.4f}”)
except Exception as e:
print(f” Evaluation failed for {name}: {e}”)
“`
Визуализация результатов
Мы визуализируем результаты, используя расширенные методы визуализации, включая сравнение моделей, распределение остатков и сравнение производительности моделей.
“`python
def plotadvancedforecasts(testdata, forecastsdict, series_idx=0):
“””Advanced plotting with multiple models and uncertainty bands”””
fig, axes = plt.subplots(2, 2, figsize=(15, 10))
fig.suptitle(‘Advanced GluonTS Forecasting Results’, fontsize=16, fontweight=’bold’)
if not forecasts_dict:
fig.text(0.5, 0.5, ‘No successful forecasts to display’,
ha=’center’, va=’center’, fontsize=20)
return fig
if seriesidx < len(testdata.label):
tslabel = testdata.label[series_idx]
tsinput = testdata.input[series_idx][‘target’]
colors = [‘blue’, ‘red’, ‘green’, ‘purple’, ‘orange’]
ax1 = axes[0, 0]
ax1.plot(range(len(tsinput)), tsinput, ‘k-‘, label=’Historical’, alpha=0.8, linewidth=2)
ax1.plot(range(len(tsinput), len(tsinput) + len(ts_label)),
ts_label, ‘k–‘, label=’True Future’, alpha=0.8, linewidth=2)
for i, (name, forecasts) in enumerate(forecasts_dict.items()):
if series_idx < len(forecasts):
forecast = forecasts[series_idx]
forecastrange = range(len(tsinput), len(ts_input) + len(forecast.mean))
color = colors[i % len(colors)]
ax1.plot(forecast_range, forecast.mean,
color=color, label=f'{name} Mean’, linewidth=2)
try:
ax1.fillbetween(forecastrange,
forecast.quantile(0.1), forecast.quantile(0.9),
alpha=0.2, color=color, label=f'{name} 80% CI’)
except:
pass
ax1.set_title(‘Multi-Model Forecasts Comparison’, fontsize=12, fontweight=’bold’)
ax1.legend()
ax1.grid(True, alpha=0.3)
ax1.set_xlabel(‘Time Steps’)
ax1.set_ylabel(‘Value’)
# … (продолжение кода)
“`
В заключение мы собрали надёжную настройку, которая балансирует создание данных, эксперименты с моделями и анализ производительности. Вместо того чтобы полагаться на одну конфигурацию, мы видим, как можно гибко адаптироваться, тестировать несколько вариантов и визуализировать результаты таким образом, чтобы сравнение было интуитивно понятным. Это даёт нам более прочную основу для экспериментов с GluonTS и применения тех же принципов к реальным наборам данных, сохраняя при этом модульность и простоту расширения процесса.
1. Какие библиотеки и инструменты используются для создания синтетических данных и визуализации в GluonTS?
В статье упоминаются такие библиотеки, как NumPy, Pandas, Matplotlib, а также инструменты GluonTS, такие как PandasDataset, DeepAREstimator, SimpleFeedForwardEstimator и другие.
2. Как в GluonTS осуществляется разделение данных на обучающие и тестовые наборы?
В статье описывается процесс разделения данных с помощью функции split из модуля gluonts.dataset.split.
3. Какие модели прогнозирования используются в статье и как они инициализируются?
В статье используются модели PyTorch DeepAR, MXNet DeepAR и FeedForward. Они инициализируются с помощью соответствующих оценщиков.
4. Какие метрики используются для оценки производительности моделей в GluonTS?
В статье для оценки производительности моделей используются метрики MASE, sMAPE и Mean wQuantileLoss.
5. Какие методы визуализации используются для представления результатов прогнозирования в GluonTS?
В статье описывается метод визуализации результатов прогнозирования с помощью расширенных методов визуализации, включая сравнение моделей, распределение остатков и сравнение производительности моделей.