Комплексный проект машинного обучения с использованием Streamlit, FastAPI и Docker.

Введение

Что такое мошенничество с кредитными картами?

По данным Института правовой информации:

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

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

Если вы хотите ознакомиться с завершенным проектом и исходным кодом, вы можете перейти по ссылке ниже:



Схема проекта

Вот шаги, которые будут выполнены в этом проекте:

  1. Источник данных
  2. Анализ данных
  3. Построение модели
  4. Оценка модели
  5. Развертывание модели с помощью FastAPI
  6. Взаимодействие API с интерфейсом Streamlit
  7. Объединение внешнего интерфейса и внутреннего интерфейса с помощью docker-compose

Источник данных

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

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



Настройка нашей среды

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

Чтобы загрузить наш набор данных с помощью Google Colab, мы будем использовать API Kaggle для загрузки набора данных. Вы можете получить доступ к API Kaggle, создав учетную запись Kaggle и загрузив свой ключ аутентификации Kaggle JSON.

https://research.google.com/colaboratory/

Самый простой способ загрузить данные kaggle в Google Colab | Наука о данных и машинное обучение

Загрузка набора данных

Теперь мы можем загрузить набор данных с помощью Kaggle API, запустив следующий код в других ячейках:

!pip install -q kaggle

Загрузите файл kaggle.json с помощью API kaggle в Google Colab.

from google.colab import files

files.upload()

Эта ячейка создает скрытую папку .kaggle в нашем корневом каталоге и копирует файл kaggle.json в эту папку.

! mkdir ~/.kaggle
! cp kaggle.json ~/.kaggle/
! chmod 600 /root/.kaggle/kaggle.json

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

!kaggle datasets download -d ealaxi/paysim1
!unzip /content/paysim1.zip

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

Анализ данных

Выше мы видим, что набор данных содержит в общей сложности 11 столбцов и более 6 миллионов строк.

Набор данных также сильно несбалансирован: только 0,12% транзакций помечены как мошеннические. Некоторые обходные пути могут быть сделаны при работе с несбалансированными данными, такими как:

  • Метод передискретизации синтетического меньшинства (SMOTE)
  • Неполная выборка

Но мы не будем применять здесь какую-либо технику для простоты. Вы можете прочитать о SMOTE, недостаточной выборке и работе с несбалансированными данными, перейдя по ссылкам ниже;





Разработка функций

На изображении выше показаны столбцы в наборе данных. Это описание каждого столбца:

  • Столбец шагов: количество часов, затраченных на выполнение транзакции.
  • Столбец типа: Тип транзакции, которая имела место. В этой колонке 5 категорий, а именно; «ОПЛАТА», «ПЕРЕВОД», «ВНЕС НАЛИЧНЫХ», «ДЕБЕТ», «ВНЕС НАЛИЧНЫХ».
  • nameOrig: имя/идентификатор отправителя.
  • oldbalanceOrg: Баланс отправителя до совершения транзакции.
  • newbalanceOrg: Баланс отправителя после совершения транзакции.
  • nameDest: имя/идентификатор получателя.
  • oldbalanceDest: Баланс получателя до совершения транзакции.
  • newbalanceDest: Баланс получателя после совершения транзакции.
  • isFraud: это транзакции, совершенные мошенническими агентами внутри симуляции.
  • isFlaggedFraud: бизнес-модель направлена ​​на контроль массовых переводов с одной учетной записи на другую и помечает незаконные попытки. Незаконной попыткой в ​​этом наборе данных является попытка передачи более 200 000 за одну транзакцию.

Мы будем удалять столбцы «nameOrig» и «nameDest», а также преобразовывать столбец «type» из категориальных данных в числовые данные с использованием кодировки меток.

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

  • Оценка точности: точность — это метрика, используемая в задачах классификации, используемая для определения процента точных прогнозов. Мы вычисляем его, разделив количество правильных прогнозов на общее количество прогнозов.
  • Оценка точности: Точность количественно определяет количество прогнозов положительного класса, которые на самом деле принадлежат к положительному классу.
  • Оценка отзыва: отзыв определяет количество положительных прогнозов класса, сделанных из всех положительных примеров в наборе данных.
  • Оценка F1: F-Measure или F1 Score обеспечивает единую оценку, которая уравновешивает как точность, так и отзыв в одном числе.
  • Матрица путаницы. Матрица путаницы — это метод обобщения эффективности алгоритма классификации. Одна только точность классификации может ввести в заблуждение, если у вас неодинаковое количество наблюдений в каждом классе или если в вашем наборе данных более двух классов.

Метрики производительности в машинном обучении [Полное руководство] — neptune.ai

Построение модели

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

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

Классификация в машинном обучении | Алгоритмы классификации | Эдурека

4 типа задач классификации в машинном обучении (machinelearningmastery.com)

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

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

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

Во фрагменте кода выше;

  • Мы устанавливаем нашу переменную X, удаляя столбец «isFraud», потому что это наш целевой столбец.
  • Столбец «isFraud» впоследствии назначается нашей переменной y.
  • Затем данные были разделены на набор для обучения и тестирования, а затем к набору для обучения была применена логистическая регрессия.
  • Используя объявленную ранее функцию «оценить модель», мы затем оценили модель.

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

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

Вы можете прочитать больше об оценке точности модели по ссылкам ниже:

Машинное обучение — Почему точность не лучший показатель для оценки моделей классификации? - Перекрестная проверка (stackexchange.com)

«Классификация ML-Почему точность не лучший показатель для оценки?? | КРИШНА РАДЖ | Середина"

Случайный лесной классификатор

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

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

Сохраняем нашу модель

Теперь мы можем сохранить нашу модель случайного леса в виде файла рассола «.pkl», используя joblib.

import joblib
joblib.dump(rfc, "credit_fraud.pkl")

Развертывание нашей модели с помощью FastAPI, Streamlit и Docker

В этом разделе мы развернем нашу сохраненную модель как API с помощью FastAPI и создадим внешний интерфейс для получения входных данных от пользователя, которые будут использоваться для прогнозирования того, является ли транзакция по кредитной карте мошеннической или нет. Dockerfile и файл docker-compose также будут использоваться для компиляции нашего проекта.

Что такое API?

Интерфейс прикладных программ (API) – это набор подпрограмм, протоколов и инструментов для создания программных приложений. По сути, API определяет, как должны взаимодействовать программные компоненты.

Что такое FastAPI?

FastAPI – это веб-платформа для разработки RESTful API на языке Python. FastAPI основан на Pydantic и подсказках типов для проверки, сериализации и десериализации данных, а также автоматического автоматического создания документов OpenAPI. Он полностью поддерживает асинхронное программирование и может работать с Uvicorn и Gunicorn.

Вы можете проверить эти ссылки на документацию FastAPI и как это работает 👇

FastAPI (tiangolo.com)

Использование FastAPI для создания веб-API Python — настоящий Python

tiangolo/fastapi: инфраструктура FastAPI, высокая производительность, простота в освоении, быстрота написания кода, готовность к работе (github.com)

Что такое Streamlit?

Streamlit — это фреймворк для приложений с открытым исходным кодом на языке Python. Он помогает нам создавать веб-приложения для обработки данных и машинного обучения за короткое время. Он совместим с основными библиотеками Python, такими как scikit-learn, Keras, PyTorch, SymPy (латекс), NumPy, pandas, Matplotlib и т. д.

Вы можете узнать больше информации о Streamlit ниже 👇

Streamlit • Самый быстрый способ создавать приложения для работы с данными и делиться ими

https://www.analyticsvidhya.com/blog/2021/06/build-web-app-instantly-for-machine-learning-using-streamlit/

Что такое Docker?

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

Что такое Docker-Compose?

Docker Compose – это инструмент, разработанный для помощи в определении и совместном использовании многоконтейнерных приложений. С помощью Compose мы можем создать файл YAML для определения служб и с помощью одной команды можем все развернуть или разорвать.

Более подробную информацию о Docker и docker-compose можно найти ниже 👇

https://www.docker.com/

https://docs.docker.com/compose/

Структура проекта

Этот проект состоит из двух частей: внешнего интерфейса на основе Streamlit и внутреннего интерфейса на основе FastAPI, и все приложение упаковано с использованием Docker.

Настройка приложения Streamlit с помощью Docker

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

📦Frontend
 ┣ 📂.streamlit
 ┃ ┗ 📜config.toml 
 ┣ 📜Dockerfile
 ┣ 📜app.py
 ┗  image.png
 ┗ 📜requirements.txt

В app.py вы создаете свою веб-страницу и используете для этого виджеты Streamlit.

Для пользовательских тем для вашего приложения Streamlit их можно определить в файле конфигурации: ./.streamlit/config.toml. Перейдите по этой ссылке для более подробной информации.

Это зависимости для приложения Streamlit:

numpy==1.21.6
requests==2.23.0
streamlit==1.10.0

Ниже приведен файл Dockerfile, который я использовал для создания приложения Streamlit. Он состоит из зависимостей, которые я перечислил в файле requirements.txt. После запуска команды сборки эти зависимости будут установлены с соответствующими версиями.

Код для нашего приложения Streamlit приведен ниже:

Приведенный выше код выполняет следующие действия;

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

Команда для создания моего Dockerfile:

docker build -t myapp:latest .

Для запуска приложения используйте эту команду в терминале:

docker run -p 8501:8501 myapp:latest

Вы должны получить это в результате:

Затем вы можете просмотреть свое приложение в браузере, используя URL-адрес сети: http://localhost:8501/

Настройка бэкенда с FastAPI и Docker

Мы будем использовать FastAPI и Dockerfile для развертывания нашей модели в качестве API для получения прогнозов.

Модель случайного леса, которую мы сохранили как «credit_fraud.pkl», будет использоваться для прогнозирования. Эта модель будет запущена через веб-интерфейс для получения прогнозов из выборки тестовых данных, которую предоставит конечный пользователь.

Это моя внутренняя структура репозитория:

📦Backend
 ┣ 📜Dockerfile
 ┣ 📜credit_fraud.pkl
 ┣ 📜app.py
 ┗ 📜requirements.txt

В файле app.py загружается модель и создается API для получения атрибутов из тестовых данных и создания связанного с ним прогноза.

Вот зависимости, которые я использовал в этом проекте для серверной части:

fastapi==0.68.0
gunicorn==20.1.0
uvicorn==0.14.0
pandas==1.3.1
scikit-learn==1.0.2
scipy==1.8.1
six==1.16.0
joblib==1.0.1
numpy==1.21.6
pydantic==1.9.1
httptools
uvloop

Это Dockerfile, используемый для серверной части:

Чтобы уточнить последнюю команду в бэкэнд-файле Dockerfile, ниже приведены определенные настройки для Uvicorn:

— host 0.0.0.0 определяет адрес для размещения сервера.

— порт 8000 определяет порт для размещения сервера.

app:app сообщает Uvicorn, где он может найти приложение FastAPI ASGI — например, «в файле ‘app.py’ вы найдете приложение ASGI, app = FastAPI().

— reload включает автоматическую перезагрузку, чтобы сервер перезапустился после внесения изменений в кодовую базу.

Код для API приведен ниже:

Это шаги, которые объясняют приведенный выше код:

  1. Класс модели «обнаружение мошенничества» был создан для определения всех параметров нашей модели машинного обучения. Первые два значения являются целыми типами, а остальные — типами с плавающей запятой.
  2. Затем модель загружается с помощью библиотеки заданий, а затем сохраняется как переменная с именем «модель». Этот объект модели будет использоваться для получения прогнозов.
  3. Функция маршрута «/predict» объявляет параметр с именем «данные» типа модели «fraudDetection». К этому параметру можно получить доступ как к словарю. Объект словаря позволит вам получить доступ к значениям параметров в виде пар ключ-значение.
  4. Теперь вы сохраняете все значения параметров, отправленные клиентом. Эти значения теперь передаются функции прогнозирования модели, и у вас есть прогноз для предоставленных данных.

Из папки «backend» в вашем терминале создайте образ, выполнив:

$ docker build -t backend .

Запустите контейнер:

$ docker run -p 8000:8000 backend

В браузере перейдите по адресу http://localhost:8000/. Тебе следует увидеть:

Credit Card Fraud Detection API 🙌🏻

Note: add "/docs" to the URL to get the Swagger UI Docs or "/redoc"

Вы можете получить доступ к документации API, если перейдете по адресу http://localhost:8000/docs.

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

Теперь мы определим файл docker-compose.yml, который создаст службу для нашего API и службу для внешнего приложения Streamlit.

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

Это файл docker-compose, который использовался для объединения внутренних и внешних контейнеров:

Файл docker-compose настроен так, что нам больше не нужно собирать каждый Dockerfile из разных образов за раз. Мы могли бы сделать это одним махом, выполнив команду docker-compose:

docker-compose up -d --build

Образ для службы Frontend и Backend были построены, потому что они еще не существовали.

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

Для просмотра изменений полезно использовать следующие команды:

docker-compose stop

И затем, если вы не добавили никаких новых зависимостей, вам не нужно снова пересобирать ваши образы Streamlit и FastAPI, и вы можете просто использовать эту команду, чтобы увидеть изменения:

docker-compose up -d

Заключение

В заключение мы смогли создать модель машинного обучения, которая могла бы обнаруживать мошеннические транзакции по кредитным картам, развернуть нашу модель как API с помощью FastAPI, создать внешнее приложение с помощью Streamlit и объединить оба приложения с помощью docker-compose.

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

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

Репозиторий, содержащий исходный код, находится здесь.

Рекомендации

https://testdriven.io/blog/fastapi-streamlit/

«Развертывание моделей машинного обучения с помощью Streamlit, FastAPI и Docker | Рихаб Феки | Середина"

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

  1. Следуйте за мной на канале.
  2. Связь со мной в LinkedIn и Twitter.
  3. Связь с Zummit Africa в LinkedIn