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

Предварительные требования:

  1. Понимание иерархического прогнозирования (читайте эту статью).
  2. Как создать Dash-приложение.
  3. Как создавать модули/функции в python.

Данные

Данные, используемые в этом проекте, были получены от Kaggle. По сути, он детализирует различные временные ряды данных о спросе на продукты и указывает категории и склады, к которым относятся продукты.

Данные были преобразованы для целей этого проекта и агрегированы по месяцам и годам. Таким образом, модель прогнозирования прогнозирует спрос на ежемесячные периоды. Входные данные модели агрегируются по складу, категории продуктов, продуктам и месяцу-году, а затем выводятся данные с той же структурой.

Пользовательский интерфейс

Найдите ниже изображение интерфейса приложения:

Интерфейс приложения имеет четыре основные особенности:

  • входные данные модели:
    Здесь вы указываете горизонт прогнозирования и, при желании, указываете склад и/или интересующую категорию продукта.
  • прогнозная диаграмма:
    выходные данные модели визуализируются в виде гистограммы.
  • карточка статистики:
    Вывод группируется по продуктам, ранжируется и отображается здесь.
  • Таблица данных:
    Подробное представление выходных данных модели.

Реализация модели

Следующие шаги определяют процедуру реализации модели машины в приложении в виде модуля:

  1. Создайте папку в каталоге вашего приложения и создайте файл «__init__.py». Это указывает на то, что файлы python в папке можно использовать в качестве модулей.
  2. Создайте файл питона
  3. Библиотеки импорта должны запускать построенную модель
import pandas as pd
import sklearn 
import joblib
import pickle

4. Загрузите файл модели ML

with open("modules/forecaster.pkl", 'rb') as f:
    model = joblib.load(f)

5. Определите функцию для запуска модели прогнозирования на указанном горизонте.

def forecast(fh):
    pred = model.predict(fh)
    final = pred.reset_index()
    return final

6. Импортируйте модуль в приложение dash

from modules import forecastingPipeline as forecaster

Модуль был создан в папке с именем modules в каталоге приложения dash. Это объясняет, почему модуль импортируется из модулей.

Функция обратного вызова

# inputs other than trigger button are called states
# this allows the funstion to collect the inputed data, but wait on a trigger
@callback(
    Output("projected-data", "data"),
    State("date-picker", "start_date"),
    State("date-picker", "end_date"),
    State("whse-selection", "value"),
    State("cat-selection", "value"),
    State("targets", "value"),
    Input("model-run", "n_clicks")
)
def date_picker(start, end, whse, cat, target, click):
    #initializing variables
    periods = 0
    fh = 0
    start_date = start
    end_date = end
    if click is None:
        raise PreventUpdate
    else:
# converting date inputs to datetime objects
        start_date = pd.Timestamp(start_date)
        end_date = pd.Timestamp(end_date)
# setting forecasting horizon to specified date range
        fh = ForecastingHorizon(
            pd.PeriodIndex(pd.date_range(start = start_date, end = end_date, freq="M")), is_relative=False
        )
        pred = forecastingPipeline.forecast(fh)
# since predict attribute of selected model only takes fh,
# other inputs will be applied as filters on model output
    if whse is not None and cat is not None:
        pred = pred[(pred['Warehouse'] == whse) & (pred['Product_Category'] == cat)]
    elif whse is not None:
        pred = pred[pred['Warehouse'] == whse]
    elif cat is not None:
        pred = pred[pred['Product_Category'] == cat]
# converting dataframe to json serializable format
    pred_dict = pred.to_dict()
    output = json.dumps(pred_dict)
    return output

Теперь вы можете протестировать свое приложение, чтобы просмотреть выходные данные модели для указанных входных данных.

Развертывание приложения

Для размещения приложения мы будем использовать платформу приложений Digital Ocean.

  1. Создайте файл требований .txt в каталоге приложения. Запустите следующую команду в своем терминале. Убедитесь, что вы находитесь в каталоге приложения
pip -r freeze requirements.text

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

2. Разверните приложение на github

Убедитесь, что все файлы, к которым обращается приложение, находятся в каталоге приложения. Вы можете предоставлять данные используемым API или ссылки на данные из github. Это уменьшит размер вашего приложения.

3. Создайте учетную запись Digital Ocean. (вы получаете 200 долларов бесплатного кредита на 60 дней)

4. Создайте новый проект и приступайте к созданию приложения.

5. Выберите Github в качестве источника

6. Выберите репозиторий с вашим проектом и укажите каталог с вашим приложением и всеми сопутствующими файлами.

7. Поскольку в файле requirements.txt есть все зависимости, необходимые вашему приложению, вы можете пропустить раздел настройки среды.

8. Пропустите оставшиеся подсказки и приступайте к сборке приложения.

Все зависимости будут установлены, а образы Docker созданы для вашего приложения на этапе сборки. После этого приложение будет развернуто. Теперь вы можете просмотреть свое приложение для планирования запасов в браузере по предоставленной ссылке

Ваше приложение также автоматически обновляется при появлении нового обновления в ветке, связанной с экземпляром приложения.

Найдите ниже ссылку на веб-приложение: https://clownfish-app-8gbil.ondigitalocean.app/ и репозиторий github: https://github.com/ladyjossy77/retail-demand-forecaster.