В этом посте я пошагово продемонстрирую, как создать собственное веб-приложение для машинного обучения, которым можно поделиться с друзьями или коллегами, используя Streamlit и развернув его на Heroku. Вкратце: в настоящее время я инженер по машинному обучению в Fintech.

✍🏻 Что ​​вы можете узнать из этого поста

  • Что такое Streamlit и что мы можем от него извлечь.
  • Как использовать Streamlit для создания веб-приложения, которое люди могут видеть и напрямую загружать результаты прогнозов машинного обучения.
  • Что такое развертывание и зачем нам развертывать модели машинного обучения.
  • Как развернуть веб-приложение на Heroku и увидеть вашу модель в действии.

💻 Необходимые инструменты

Streamlit 🚀

В настоящее время, когда люди хотят создать и развернуть веб-приложение, включающее функции машинного обучения, обычно они используют «Flask + Docker (контейнер) + облако». », который для производства на уровне предприятия нам нужна команда специалистов по обработке данных, ML DevOps и интерфейсных инженеров. Даже для небольших проектов с менее сложной архитектурой это все равно требует слишком много усилий и времени, и, что более важно, у большинства специалистов по обработке данных нет такого инструментария, как HTML, CSS, и JavaScript, чтобы создать его самостоятельно.

Streamlit как-то (конечно, он не может заменить флягу) упрощает этот процесс, поскольку специалисты по данным могут просто использовать python, чтобы это произошло. . И это также отличное решение, когда вы хотите создавать и демонстрировать свои личные проекты машинного обучения с помощью Streamlit.

Подробнее об архитектурных решениях Streamlit можно прочитать здесь.

Heroku

Heroku - это облачная платформа, которая хорошо работает для размещения приложений Python - она ​​позволяет перенести приложение с локального компьютера в облако, чтобы любой мог получить к нему доступ, используя веб-URL.

Мы могли бы выбрать Azure (самый популярный в сообществе машинного обучения), AWS или GCP, но здесь я буду использовать Heroku для развертывания, поскольку он предоставляет бесплатные часы ресурсов, когда вы регистрируетесь для новой учетной записи.

Github

Вы, наверное, знаете, что GitHub - это облачный сервис, который используется для размещения, управления и контроля кода.

Нам нужно будет создать репозиторий Github, а затем использовать его для развертывания приложения в Heroku.

TL;DR.

Шаг 1. Изучите бизнес-среду

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

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

Итак, вот как выглядят (поддельные) данные:

Как видите, первый столбец - это «статус», это наша целевая переменная. Нам нужно будет использовать следующие столбцы для прогнозирования статуса входящих данных.

Шаг 2. Создайте простой конвейер для обработки данных

После выполнения некоторого EDA (исследовательского анализа данных) я сделал две простые функции для загрузки и предварительной обработки наших обучающих данных, как показано ниже.

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

Шаг 3. Выберите несколько моделей и обучите данные

Здесь я выбрал логистическую регрессию и XGB. Ниже приведен простой стандартный конвейер для обучения и прогнозирования, а также для получения показателей производительности модели.

Логистическая регрессия

XGB

Шаг 4. Установите Streamlit и создайте простую страницу.

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

Итак, как нам создать веб-приложение?

Это очень просто! Давайте сначала установим Streamlit:

$ pip install streamlit

Затем импортируйте streamlit в свой скрипт, как мы это делаем для других пакетов:

import streamlit as st

Допустим, мы планируем сделать простую домашнюю страницу, чтобы показать наши данные и краткое введение. Мы создаем функцию main (), затем создаем боковую панель для отображения и выбираем «Главная», «Логистическая регрессия» и «XGB». Посмотрите, как легко создать эту боковую панель, мы просто добавляем две строки кода, и все готово.

Хорошо, теперь мы запускаем две функции для получения и обработки наших обучающих данных, а затем добавляем краткое введение на главную страницу: мы можем просто использовать st.write (), st.subhead () или st.title (), чтобы добавить все, что вы хочу показать.

Хороший. Пока у нас есть простой демонстрационный код, и мы сохраняем его как app.py. А теперь давайте посмотрим на наше приложение.

Откройте Терминал (или cmd для пользователей Windows) и найдите путь, по которому вы сохранили этот скрипт (для меня я сохранил его в папке StreamlitDemoCyrus), затем нажмите:

streamlit run app.py

Если все в порядке, вы увидите это на своем терминале:

И автоматически ваш браузер отобразит такой URL-адрес:

КРУТО!

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

А теперь давайте добавим в наше приложение больше функций.

Шаг 5. Добавьте дополнительные функции

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

Итак, как мы можем этого добиться?

  • Сохраните наши предварительно обученные модели (XGB и логистическая регрессия).
  • Создайте место, чтобы наши пользователи могли загружать данные.
  • У вас есть возможность загружать прогноз в виде файла CSV или текстового формата.

1. Сохраните модель.

Помните, у нас есть несколько выходных данных нашей модельной функции?

вернуть точность_reg, f1_reg, roc_auc_reg, вспомнить_reg, precision_reg, reg

вернуть точность_xgb, f1_xgb, roc_auc_xgb, вспомнить_xgb, precision_xgb, модель

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

В то же время мы также можем предоставить метрики текущих обучающих данных и модели с помощью streamlit.table ():

st.table(pd.DataFrame(
     data = [round(accuracy_reg *  100.0,2), round(precision_reg * 100.0,2), round(recall_reg*100,2), round(roc_auc_reg*100,2), round(f1_reg*100,2)],
     index = ['Accuracy', 'Precision (% we predicted as Declined are truly Declined)', 'Recall (% Declined have been identified)', 'ROC_AUC', 'F1'], 
     columns = ['%'])
     )

2. Загрузите новые данные.

Затем нам нужно будет предоставить место для загрузки данных, и, к счастью, Streamlit предоставляет возможность легко загружать любой файл, который мы хотим,

streamlit.file_uploader()

Вот как я это делаю:

if(st.checkbox(“Want to Use this model to predict on a new dataset?”)):
    uploaded_file = st.file_uploader(“Choose a CSV file”, type=”csv”)

Затем мы используем наши предварительно обученные модели для прогнозирования:

if uploaded_file:
    data = pd.read_csv(uploaded_file, low_memory=False)
    data, _ = data_preprocessing(data)
    X = data.drop(columns = [‘status’])
    prediction = reg.predict(X)

3. Скачать прогноз

Непосредственная загрузка файла не так проста для всех веб-фреймворков.

Однако мы все еще можем сделать это на Streamlit, вот как я это сделал:

csv = data.to_csv(index=False)
b64 = base64.b64encode(csv.encode()).decode()  # some strings <-> bytes conversions necessary here
href = f'<a href="data:file/csv;base64,{b64}">Download CSV File</a> (right-click and save as &lt;some_name&gt;.csv)'
st.markdown(href, unsafe_allow_html=True)

Это немного сложно, но вы можете увидеть больше по этой ссылке.

На данный момент мы уже создали полный конвейер для обработки данных, обучения, загрузки и прогнозирования (включая функцию загрузки), и этого достаточно. Но более того, нам еще предстоит изучить множество функций.

Давайте подумаем о гиперпараметрах. Что, если мы хотим обучать и прогнозировать по самоопределенным параметрам и видеть немедленное изменение модели после их настройки?

Ответ от streamlit: да, мы можем легко сделать это с помощью функции слайдера.

Возьмем, к примеру, XGB, мы можем просто добавить набор параметров на ползунок боковой панели,

После этого мы повторно запускаем наше приложение Streamlit, переходим на страницу XGB и видим следующее:

И нам нужно будет использовать этот params_set в качестве набора параметров при обучении и прогнозировании модели.

accuracy_xgb, f1_xgb, roc_auc_xgb, recall_xgb, precision_xgb, xgb = XGB_metrics(data, params_set)

Таким образом, каждый раз, когда мы изменяем (настраиваем) какой-либо параметр в сети, мы можем напрямую видеть соответствующий эффект, который он оказывает на производительность модели.

И мы также можем добавить график важности функции:

# Plot feature importance
df_feature = pd.DataFrame.from_dict(xgb.get_booster().get_fscore(),
orient='index')
df_feature.columns = ['Feature Importance']
feature_importance = df_feature.sort_values(by = 'Feature Importance', ascending= False).reset_index()
fig = px.bar(feature_importance, x = 'index', y = 'Feature Importance')
fig.update_xaxes(tickangle=45, title_text='Features')
fig.update_yaxes(title_text='Feature Importance')
st.plotly_chart(fig)

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

Шаг 6. Создайте репозиторий Github и разместите свой код.

Теперь наша сеть почти идеальна, поскольку мы предоставляем функции, включая (автоматическую) обработку данных, обучение, прогнозирование и даже настройку гиперпараметров.

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

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

Итак, нам нужно отправить его в облако и развернуть. В этом посте облако - это Heroku. Есть несколько способов загрузить исходный код вашего приложения на Heroku. Самый простой способ - привязать репозиторий GitHub к вашей учетной записи Heroku.

1. Зайдите на Github.com и создайте новую учетную запись.

2. Затем создайте новый репозиторий и назовите его как хотите:

3. После этого загрузите написанный нами python-скрипт app.py.

Смотрите репо после того, как я загрузил сюда все необходимые файлы:

Есть два файла, с которыми вы, возможно, не знакомы: requirements.txt и Procfile, так что это?

  • requirements.txt - это, по сути, текстовый файл, который включает зависимости с точки зрения создаваемых вами проектов / программ. Вам будет проще поддерживать и тестировать, а другим разработчикам проще установить правильные версии необходимых библиотек Python (или «пакетов») для запуска написанного нами кода Python. В этом проекте это будет так:
xgboost==0.82 
streamlit 
plotly 
mlxtend 
seaborn
  • Procfile - это просто одна строка кода, которая предоставляет инструкции по запуску для веб-серверов, которые указывают, какой файл должен быть выполнен первым, когда кто-то входит в приложение. В этом руководстве это будет:
web: streamlit run --server.enableCORS false --server.port $PORT app.py

Шаг 7. Создайте учетную запись Heroku и подключитесь к своему Github.

Как только все файлы будут загружены в ваше репозиторий Github, мы готовы развернуть его на Heroku.

  • Зарегистрируйтесь на Heroku.com и нажмите «Создать новое приложение».

  • Введите свое имя и регион

  • Подключитесь к своему репозиторию Github

  • Перейдите к развертыванию вручную и нажмите ветвь развертывания

  • И подождите -

Затем нажмите «Просмотр» и Бум! Создано ваше собственное веб-приложение.

См. URL: https: // streamlitdemocyrus.herokuapp.com /, он больше не работает только на вашем локальном компьютере, и теперь вы можете делиться с коллегами и друзьями.

Спасибо за прочтение! Также спасибо Моэзу Али за его замечательную статью для PyCaret и Heroku.

Мы будем благодарны за любые вопросы или предложения, вы можете связаться со мной по электронной почте [email protected] или в LinkedIn здесь: