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

В реальной индустрии большинство сценариев использования искусственного интеллекта просто ограничиваются фазой POC, что очень расстраивает :( !!

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

Мы будем использовать данные Ценность клиента IBM Watson Marketing, собранные из Watson Analytics, для создания симулятора веб-приложения Dash, позволяющего изменять значения функций и получать обновленную оценку при каждой симуляции. Приложение разворачивается здесь на платформе heroku. Я покажу вам, как мне удалось обслужить это веб-приложение, а также дам вам несколько уловок, чтобы не тратить много времени на решение некоторых проблем, которые могут возникнуть при развертывании приложения Dash.

Соответствующее репозиторий github находится здесь:



Шаг 0: я создал новое репо следующим образом, а затем клонировал его:

Картинка выше - это глобальная структура в конце проекта. Однако вы можете создать такую ​​же структуру каталогов в самом начале.

Шаг 1: получить данные:

Я просто скачал его с kaggle, вы также можете использовать kaggle-API.
Затем загрузите данные:

import pandas as pd
df = (pd.read_csv('../data/Customer-Value-Analysis.csv')
     .set_index('Customer')
     )

Шаг 2: предварительная обработка данных:

На этом этапе мы можем построить наш собственный конвейер, чтобы его можно было повторно использовать позже для новых входящих данных.
Сначала разделите целевые, числовые и категориальные характеристики:

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

Для многих шагов преобразования данных рекомендуется использовать класс Pipeline, предоставляемый Scikit-learn, который помогает выполнять последовательные преобразования в правильном порядке. Это можно сделать с помощью оценщика FeatureUnion, предлагаемого scikit-learn. Этот оценщик применяет список объектов-преобразователей параллельно к входным данным, а затем объединяет результаты.

В этом проекте я реализовал следующий код (исходник из этого блокнота kaggle)

Применить преобразование данных:

  1. fit_tranfsorm() в наборе данных поезда
  2. transform() на тестовом подмножестве

Шаг 3: Фаза обучения:

Откройте новый jupyter внутри папки /src

  1. Выбор модели. Он предназначен для тестирования различных типов алгоритмов и оценки производительности с использованием как перекрестной проверки, так и метода оценки обучения / тестирования с метрикой потеря журнала. Мы протестировали классификаторы KNN, XGBoost и Random Forest.

Показываем полученные спектакли

= ›Мы заметили, что Random работает хорошо, поэтому мы его настроим.

2. Точная настройка модели:

Самый распространенный способ - GridSearchCV оценить все возможные комбинации значений гиперпараметров с помощью перекрестной проверки.

Например, следующий код ищет лучшую комбинацию значений гиперпараметров для RandomForestClassifier:

PS: В официальном документе параметр scoring принимает в качестве значения строковое имя вашей метрики (точность, roc_auc ..: исчерпывающий список метрик, поддерживаемых параметром scoring, можно найти здесь). Для показателей, которые не определены в списке (как, к сожалению, в нашем случае), используйте функцию sklear.metrics.make_scorer.

Лучшая комбинация сохраняется в атрибуте best_estimator_:

sk_best = grid_search.best_estimator_

3. Настойчивость модели:

Прежде чем мы перейдем к разработке приложения Dash, мы должны «сохранить» обученные объекты, которые будут использоваться приложением позже, в каталоге / model.

  1. Одна горячая категория кодирования (мы будем использовать ее позже для отображения важности функции):
  2. sk_best: лучшая оптимизированная модель, найденная методом gridsearch
  3. Лучшие характеристики модели: теперь мы сохраним характеристики модели, соответствующие различным показателям, таким как precision_score, recur_score, precision_score и f1_score ( мы будем использовать его позже, чтобы отобразить красивую полосу диаграмму в нашем приложении Dash)

Теперь, когда мы обучили и сохранили нашу модель и другие полезные элементы, мы можем приступить к разработке приложения Dash;)!

Создайте свое приложение для даш

Код тире можно найти здесь

Теперь, когда наши модели обучены, мы займемся реализацией нашего приложения Dash. Мы можем схематизировать веб-приложение следующим образом:

Наш Dash использует сервер Flask под капотом и будет развернут на платформе heroku, которая поддерживает приложения на основе Flask. После развертывания сервер будет взаимодействовать с нашей предварительно обученной моделью sklearn для обновления прогноза.

Теперь нам нужно спроектировать и реализовать способ отображения динамических элементов в нашем веб-браузере.
Для простоты мы решили создать приложение следующим образом (его можно улучшить):

Мы создаем plotly.graph_objects фигур, соответствующих каждому элементу, показанному выше (кроме поля оценки прогноза, мы увидим его позже):

Это требует пояснений:

  • Чтобы получить важность функции, соответствующую нашей модели, мы использовали атрибут feature_importances_ модели sk_best (найденный после точной настройки модели случайного леса на предыдущем шаге).
  • Мы извлекаем ранее сохраненные выступления в perfs словарной переменной, которая будет отображаться в виде горизонтальной полосы чата.
  • Для каждого числового признака мы создаем соответствующий ему элемент Ползунок.
  • Для каждого числового признака мы создали раскрывающийся элемент

Теперь все, что нам нужно сделать, это объединить созданные HTML-элементы в основной макет приложения:

classNameelements относится к классам CSS, которые определены в этой сути.
Ссылка CSS должна быть установлена ​​в параметре external_stylesheets, чтобы приложение Dash знало, что оно будет включать CSS из внешнего ресурса (я позаимствовал идею из "здесь").

Обратите внимание, что эта часть заняла у меня очень много времени, и я хочу, чтобы вы его сэкономили. Как показано выше, Dash позволяет импортировать внешние ресурсы css. Вопрос в том, как создать свои собственные ресурсы CSS и сделать их доступными для использования. Что ж, одно из решений состоит в том, чтобы сохранить его в суть в вашем профиле github. Однако, когда вы запрашиваете суть, в ответ обычно используется Content-Type=text/plain. В результате ваш браузер не будет интерпретировать его как тип CSS.

Решение состоит в передаче соответствующего URL-адреса прокси-серверу raw.githack.com, позволяющему ретранслировать запросы приложения с правильным заголовком Content-Type.

Я разместил css gist в /assets/style.css внутри моего корневого проекта github, затем я изменил его через прокси raw.github:

Я получил рабочий URL и добавил его в параметр приложения theexternal_stylesheets dash.

Вернемся к нашему даш-приложению: в предыдущем фрагменте кода вы можете заметить, что я добавил новый раздел html с id = prediction_result; он будет использоваться для идентификации связанного HTML-элемента (нашего текста оценки) для его динамического обновления. Итак, нам нужно заставить различные компоненты HTML взаимодействовать друг с другом.
Dash делает это возможным с помощью функций app.callback: Мы реализуем функцию обратного вызова, которая динамически изменяет HTML-элемент, обозначенный prediction_result, каждый раз, когда изменяется значение других элементов, без необходимо перезагрузить страницу:

Чтобы протестировать свой код, добавьте сценарий run.py в корневую папку проекта и добавьте:

from src.app_dash import server

С dash_app.py скриптом приложения dash вы можете найти его здесь

Затем вы можете использовать сервер Flask (упакованный приложением Dash) или gunicorn (что рекомендуется)
с gunicorn:

$gunicorn run:server

Развернуть на героку:

Для успешного развертывания на Heroku вы должны предоставить в своем корневом проекте репозитории два специальных файла:

  • Procfile: дает инструкции для выполнения при запуске приложения.
web:  gunicorn run:server
  • requirements.txt: перечисляет библиотеки для установки: чтобы получить все необходимые пакеты для вашего проекта, вы можете использовать эту команду:
pip freeze > requirements.txt

Перед использованием heroku вы должны зафиксировать все изменения в репозитории на github.

  1. Установить:

Прежде всего вам необходимо установить heroku: в соответствии с вашей ОС установите его, как описано здесь: https://devcenter.heroku.com/articles/heroku-cli

2. Создайте новое приложение heroku:
Пример:

$heroku create ibm-customer-churn-simulator

3. Подключите свое приложение к репозиториям Github:
Теперь, когда новое приложение создано, все, что нам нужно сделать, это подключить его к нашему репозиторию github, щелкнуть по нему, перейти к развертыванию и выберите Github в разделе Метод развертывания:

Затем выберите свой репозиторий и соответствующую ветку.

Наконец, нажмите кнопку Развернуть ветку.

Теперь начинается напряженный момент: /// …… Ждите успешного развертывания !!!
Если все пойдет хорошо, вы получите это зеленое сообщение:

И, наконец, вы получаете свое приложение:

Здесь ссылка на приложение, размещенное на героку.

Заключение:

Спасибо, что проконсультировались с моим постом! Если вы хотите углубиться, я бы очень рекомендовал вам этот отличный пост ❤ для расширенного развертывания (от того, как SCRAPE данные до того, как развернуть модель типа глубокого обучения с докером, проходящим через то, как разработать REST API)

Обратите внимание, что я реализовал то же самое приложение, но с помощью решения, предоставленного нашей компанией Prevision.io, я написал соответствующий пост здесь. Поскольку у меня есть возможность получить доступ как к нашему решению SaaS (для процессов auto-ml), так и к нашей службе PaaS (магазин, в котором развертываются приложения), я протестировал наше проприетарное решение. . Однако в этом посте я использовал только решения с открытым исходным кодом. Если вы посмотрите мой другой пост, то заметите, что уровень сложности на самом деле не тот!

Не стесняйтесь спрашивать меня, если у вас есть вопросы / проблемы.

Мой электронный адрес: [email protected]
Мой linkedin: здесь