Всем увлеченным разработчикам машинного обучения нравится много создавать, обучать и находить наиболее подходящие модели для их вариантов использования. Но последний оставшийся вопрос: как запустить эти модели в производство и подготовить их к употреблению?
В реальной индустрии большинство сценариев использования искусственного интеллекта просто ограничиваются фазой 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)
Применить преобразование данных:
fit_tranfsorm()
в наборе данных поездаtransform()
на тестовом подмножестве
Шаг 3: Фаза обучения:
Откройте новый jupyter внутри папки /src
- Выбор модели. Он предназначен для тестирования различных типов алгоритмов и оценки производительности с использованием как перекрестной проверки, так и метода оценки обучения / тестирования с метрикой потеря журнала. Мы протестировали классификаторы 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.
- Одна горячая категория кодирования (мы будем использовать ее позже для отображения важности функции):
sk_best
: лучшая оптимизированная модель, найденная методом gridsearch- Лучшие характеристики модели: теперь мы сохраним характеристики модели, соответствующие различным показателям, таким как 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-элементы в основной макет приложения:
className
elements относится к классам 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.
- Установить:
Прежде всего вам необходимо установить 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: здесь