Учебное пособие GluonTS для MXNET: Глава 2 «Ввод/вывод DeepAR»

машинное обучение

Чтение этого руководства требует определенной основы работы с mxnet и gluon. В этой статье используется обучающий код процессора. Адрес личного блога:zmkwjx.github.ioАдрес этой статьи на гитхабе:GitHub.com/Такой высокомерный и кричащий/G Luo…Адрес официального сайта GluonTS:gluon-ts.mxnet.io

1. Введение в DeepAR

В ГлюонТС,DeepAR реализует модель на основе RNN, которая использует авторегрессионную рекуррентную сеть для прогнозирования вероятности, Это метод для создания точных прогнозов вероятности на основе обучения модели авторегрессионной рекуррентной сети на большом количестве связанных временных рядов.. По сравнению с современными, его точность улучшилась примерно на 15%. Вероятностное прогнозирование (то есть оценка распределения вероятностей будущего временного ряда на основе его прошлого) является ключевым фактором оптимизации бизнес-процессов.

2. Ввод/вывод DeepAR

DeepAR поддерживает два канала данных. Требуемый канал поезда описывает обучающий набор данных. Необязательный тестовый канал описывает набор данных, который алгоритм использует для оценки точности модели после обучения. Вы можете предоставлять обучающие и тестовые наборы данных в формате строк JSON. При указании путей к обучающим и тестовым данным можно указать один файл или каталог, содержащий несколько файлов, которые могут храниться в подкаталогах. Если вы укажете каталог, DeepAR будет использовать все файлы в каталоге в качестве входных данных для соответствующего канала. По умолчанию модели DeepAR используют.json-файлВходные данные.

  • Как загрузить набор данных
# 后面将对该方法进行介绍
common.FileDataset("此处填入训练数据文件夹的绝对路径", freq="H")

2.1 Формат поля входных данных

  • start— Строка в формате гггг-ММ-ДД ЧЧ:ММ:СС. Отметка времени начала не может содержать информацию о часовом поясе.
  • target— Массив значений с плавающей запятой или целых чисел, представляющих временной ряд. Вы можете закодировать отсутствующие значения как null или как строки «NAN» в JSON:
{"start": "2009-11-01 00:00:00", "target": [5, "NAN", 7, 12]}
  • feat_dynamic_real (необязательно)— Массив чисел с плавающей запятой или целых чисел, представляющий вектор временного ряда пользовательского объекта (динамического объекта). Если это поле установлено, все записи должны иметь одинаковое количество внутренних массивов (одинаковое количество временных рядов признаков). Кроме того, каждый внутренний массив должен иметь ту же длину, что и связанное целевое значение. Например, если целевой временной ряд представляет спрос на различные продукты, feat_dynamic_real может быть логическим временным рядом, указывающим, применялась ли акция к конкретному продукту:
{"start": ..., "target": [5, "NAN", 7, 12], "dynamic_feat": [[1, 0, 0, 1]]}
  • feat_static_cat (необязательно)— Массив категориальных признаков, которые можно использовать для кодирования группы, к которой принадлежит запись. Категориальные признаки должны быть закодированы как последовательность положительных целых чисел, начинающаяся с 0. Например, категориальный домен {R, G, B} может быть закодирован как {0, 1, 2}. Все значения из каждой области классификации должны быть представлены в обучающем наборе данных.

Если вы используете файл JSON, файл должен быть в формате JSON Lines. Например:

{"start": "2009-11-01 00:00:00", "target": [4.3, "NaN", 5.1, ...], "feat_static_cat": [0, 1], "feat_dynamic_real": [[1.1, 1.2, 0.5, ...]]}
{"start": "2012-01-30 00:00:00", "target": [1.0, -5.0, ...], "feat_static_cat": [2, 3], "feat_dynamic_real": [[1.1, 2.05, ...]]}
{"start": "1999-01-30 00:00:00", "target": [2.0, 1.0], "feat_static_cat": [1, 4], "feat_dynamic_real": [[1.3, 0.4]]}

В этом примере каждый временной ряд имеет два связанных категориальных признака и один признак временного ряда.

Если алгоритм обучается безоговорочно, он изучит «глобальную» модель, которая во время вывода не зависит от конкретной идентичности целевого временного ряда и ограничена только своей формой.

Если модель обусловлена ​​данными признаков feat_static_cat и feat_dynamic_real, предоставленными каждому временному ряду, на прогнозы, вероятно, повлияют признаки временного ряда с соответствующими признаками кошки. Например, если целевой временной ряд представляет спрос на предметы одежды, вы можете связать двумерный вектор кошки, который кодирует тип предмета (например, 0 = обувь, 1 = платье) в первом компоненте, а во втором компоненте закодируйте цвет предмета. (например, 0 = красный, 1 = синий). Пример ввода выглядит следующим образом:

{ "start": ..., "target": ..., "feat_static_cat": [0, 0], ... } # red shoes
{ "start": ..., "target": ..., "feat_static_cat": [1, 1], ... } # blue dress

Во время вывода вы можете запросить прогноз цели, значение feat_static_cat которой представляет собой комбинацию значений feat_static_cat, наблюдаемых в обучающих данных, например:

{ "start": ..., "target": ..., "feat_static_cat": [0, 1], ... } # blue shoes
{ "start": ..., "target": ..., "feat_static_cat": [1, 0], ... } # red dress

2.2 Критерии обучающих данных

  • Время начала и длина временного ряда могут варьироваться. Например, в маркетинговых усилиях продукты часто попадают в розничные каталоги в разные дни, поэтому их даты начала, естественно, будут различаться. Однако все ряды должны иметь одинаковую частоту, количество категориальных признаков и количество динамических признаков.
  • Произвольно упорядочить обучающие файлы в зависимости от положения временного ряда в файле. Другими словами, временные ряды появляются в файле в случайном порядке.
  • Убедитесь, что он настроен правильноstartполе. Использование алгоритмаstartВременная метка для получения внутренних функций.
  • Если вы используете категориальные функции (feat_static_cat), все временные ряды должны иметь одинаковое количество категориальных признаков.
  • Если ваш набор данных содержитfeat_dynamic_realполе, алгоритм будет автоматически использовать это поле. Все временные ряды должны иметь одинаковое количество временных рядов признаков. Моменты времени во временном ряду каждого объекта однозначно соответствуют моментам времени в целевом объекте. Кроме того, запись в поле feat_dynamic_real должна иметь ту же длину, что и цель. если используетсяfeat_dynamic_realполе для обучения модели, это поле должно быть предоставлено для логического вывода. Кроме того, каждая функция должна иметь длину предоставленной цели плюсprediction_length.

2.3 Загрузите набор данных файлов строк JSON, содержащихся в пути

common.FileDatasetвключены в путь загрузкиJSON Linesнабор файлов.

class gluonts.dataset.common.FileDataset(path: pathlib.Path, freq: str, one_dim_target: bool = True)

  • дорожка:Содержит путь к файлу набора данных. Каждый файл считается источником обучающих данных, кроме тех, которые начинаются с «.» и заканчиваются на «_SUCCESS». Допустимые строки в файле могут быть следующими: {"start": "2014-09-07", "target": [0.1, 0.2]}
  • частота:Частота наблюдений во временном ряду
  • one_dim_target:Принимать ли только одномерные целевые временные ряды

2.4 Построение сети DeepAR

class gluonts.model.deepar.DeepAREstimator(freq: str, prediction_length: int, trainer: gluonts.trainer._base.Trainer = gluonts.trainer._base.Trainer(batch_size=32, clip_gradient=10.0, ctx=None, epochs=100, hybridize=True, init="xavier", learning_rate=0.001, learning_rate_decay_factor=0.5, minimum_learning_rate=5e-05, num_batches_per_epoch=50, patience=10, weight_decay=1e-08), context_length: Optional[int] = None, num_layers: int = 2, num_cells: int = 40, cell_type: str = 'lstm', dropout_rate: float = 0.1, use_feat_dynamic_real: bool = False, use_feat_static_cat: bool = False, use_feat_static_real: bool = False, cardinality: Optional[List[int]] = None, embedding_dimension: Optional[List[int]] = None, distr_output: gluonts.distribution.distribution_output.DistributionOutput = gluonts.distribution.student_t.StudentTOutput(), scaling: bool = True, lags_seq: Optional[List[int]] = None, time_features: Optional[List[gluonts.time_feature._base.TimeFeature]] = None, num_parallel_samples: int = 100)

  • частота:Частота наблюдений во временном ряду
  • предсказание_длина:длина горизонта прогноза
  • длина_контекста:Количество шагов для развертывания RNN перед вычислением прогнозов (по умолчанию: нет, в данном случае context_length = проекция_длина)
  • количество_слоев:Количество слоев RNN (по умолчанию: 2)
  • количество_ячеек:Количество ячеек RNN на слой (по умолчанию: 40)
  • тип_ячейки:тип используемой ячейки цикла (доступно: «lstm» или «gru»; по умолчанию: «lstm»)
  • уровень отчисления:параметр регуляризации отсева (по умолчанию: 0,1)
  • use_feat_dynamic_real:использовать ли поля из данных feat_dynamic_real (по умолчанию: False)
  • use_feat_static_cat:использовать ли поля из данных feat_static_cat (по умолчанию: False)
  • use_feat_static_real:использовать ли поля из данных feat_static_real (по умолчанию: False)
  • кардинальность:Количество значений для каждого категориального признака. Должен быть установлен, если use_feat_static_cat == True (по умолчанию: None)
  • масштабирование:Следует ли автоматически масштабировать целевое значение (по умолчанию: True)
  • lags_seq:Индекс целевых значений отставания для использования в качестве входных данных RNN (по умолчанию: нет, и в этом случае эти значения будут определяться автоматически на основе частоты)
  • time_features:Временные функции для использования в качестве входных данных RNN (по умолчанию: нет, в этом случае они определяются автоматически на основе частоты)
  • num_parallel_samples:Количество оценочных выборок на временной ряд для увеличения параллелизма во время логического вывода. Это оптимизация модели, которая не влияет на точность (по умолчанию: 100).

2.5 Примеры

train_data = common.FileDataset("此处填入训练数据文件夹的绝对路径", freq="H")
test_data  = common.FileDataset("此处填入需要预测数据文件夹的绝对路径", freq="H")

estimator = deepar.DeepAREstimator(
    prediction_length=24,
    context_length=100,
    use_feat_static_cat=True,
    use_feat_dynamic_real=True,
    num_parallel_samples=100,
    cardinality=[2,1],
    freq="H",
    trainer=Trainer(ctx="cpu", epochs=200, learning_rate=1e-3)
)
predictor = estimator.train(training_data=train_data)

for test_entry, forecast in zip(test_data, predictor.predict(test_data)):
    to_pandas(test_entry)[-100:].plot(figsize=(12, 5), linewidth=2)
    forecast.plot(color='g', prediction_intervals=[50.0, 90.0])
plt.grid(which='both')
plt.legend(["past observations", "median prediction", "90% prediction interval", "50% prediction interval"])
plt.show()

prediction = next(predictor.predict(test_data))
print(prediction.mean)
prediction.plot(output_file='graph.png')