Настройка гиперпараметров в группах искр

#apache-spark #pyspark #user-defined-functions #forecasting

Вопрос:

Мы оцениваем spark как параллельный сервер для обучения тысяч моделей прогнозирования временных рядов в соответствии с определенной иерархией (группами): customer_id, site_id и product_id.

На сегодняшний день мы создали уникальный идентификатор comb_id, который отличается для любой комбинации этих 3 переменных. Данные выглядят более или менее так:

     comb_id  customer_id site_id      timestamp     value
       1         87         55    2020-01-12 12:00   43.5
       1         87         53    2020-01-12 12:00   45.6
       1         87         65    2020-01-12 12:00   48.2
       2         87         55    2020-01-12 12:00   43.5
       2         87         53    2020-01-12 12:00   45.6
       2         87         55    2020-01-12 12:00   43.5
 

То, что мы делаем, — это агрегирование столбца значений в соответствии с идентификатором комбинации, мы выполняем некоторую предварительную обработку, создаем лаги, скользящие средние, функции календаря и объединяем их с дополнительными внешними функциями. Затем мы выполняем контейнерную рабочую нагрузку, запускаем n_comb_id * number_of_algorithms*hpo_jobs_for_each_algorithm.

Эта процедура работает очень хорошо в том смысле, что мы можем настроить каждый из отдельных алгоритмов и получить наилучшую модель наилучшего алгоритма для каждого combination_id. Однако это очень медленно, так как у нас есть ограничение на количество контейнеров, которые мы можем запустить, и это может стать проблемой в будущем.

Мы нашли этот полезный ресурс: https://towardsdatascience.com/pyspark-forecasting-with-pandas-udf-and-fb-prophet-e9d70f86d802 и нам удалось запустить это для нашего варианта использования, но мы видим следующие проблемы:

  1. Невозможно настроить каждую модель пророка для каждой группы (или, по крайней мере, мы не знаем, как это сделать).
  2. Мы используем XGBoost и randomForest вместо prophet.

Сталкивался ли кто-нибудь с такой же проблемой раньше?

PS: Наше понимание spark очень ограничено, поэтому приносим извинения, если мы спрашиваем о чем-то тривиальном.