Жизнь в цифровом мире также означает производство данных. За следующие 8 минут, которые вы потратите на чтение этой статьи, мир сгенерирует около 10,4 тысячи терабайт данных. По данным платформы Gartner, это означает более миллиона встреч через Zoom или более 2 миллионов публикаций в Instagram. Все эти ценные данные используются крупными компаниями, чтобы знать предпочтения своих пользователей, продавать продукты, предлагать услуги и делать прогнозы. Он также используется в научных исследованиях и медицинских областях для классификации диагнозов.

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

Цель этой статьи — представить все необходимые шаги для создания и развертывания модели классификатора дерева решений, включая поиск набора данных, выполнение экспериментального анализа данных, предварительную обработку данных, обучение и тестирование модели, а также развертывание конвейера в рабочей среде. Для этого будет использоваться несколько инструментов, таких как Weight & Bias (Wandb) для контроля версий данных, артефактов, экспериментов и моделей; FastAPI как веб-фреймворк для разработки RESTful API; Github Actions для непрерывной интеграции (CI) и Heruko для непрерывной доставки (CD) и развертывания.

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

РАБОЧИЙ ПРОЦЕСС

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

(I) Выбор набора данных

Первым действием был выбор базы данных для работы. Существует множество платформ, на которых хранится несколько баз данных, некоторые из них совершенно бесплатны. Набор данных, используемый в этом проекте, называется Pima Indias Diabetes Dataset от Национального института диабета, болезней органов пищеварения и почек, его можно найти на kaggle. Основная цель набора данных — предсказать, есть ли у пациента диабет, на основе определенных измерений. Все пациенты, включенные в этот набор данных, являются женщинами в возрасте 21 года и старше из индийского происхождения. Это подводит нас к следующему шагу.

(II) Извлечение, преобразование и загрузка (ETL)

Первым шагом процесса ETL является импорт необработанных данных. Как упоминалось ранее, WandB будет использоваться для хранения всех артефактов этого проекта, включая первую версию набора данных.

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

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

Даже показывая, что нет пропущенных данных, важно перепроверить все столбцы и попытаться понять все значения. При этом мы можем найти некоторые значения равные нулю во многих параметрах, таких как глюкоза, артериальное давление, толщина кожи, инсулин и характеристики ИМТ. Это означает, что эти случаи следует рассматривать как пропущенные значения. Во избежание утечки данных эти отсутствующие значения будут обработаны после разделения данных. Кроме того, можно заметить, что набор данных несбалансирован: в столбце «Результат» больше классов, равных 0, чем классов, равных 1.

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

(III) Проверка данных

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

  • набор данных имеет 9 столбцов;
  • набор данных содержит более 500 строк;
  • каждый столбец имеет ожидаемый тип данных;
  • столбец результатов имеет только известные классы (0 или 1);
  • есть данные только о женщинах от 18 до 90 лет

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

!pytest . -vv

(IV) Разделение данных

Теперь нам нужно разделить наши данные на обучающие и тестовые наборы данных, используя Holdout. Для этого мы собираемся использовать метод из библиотеки sklearn под названием train_test_split. С помощью этого метода мы можем перетасовать набор данных, используя определенное начальное число, а также установить размер каждого разделения. Как мы проверили в процессе EDA, мы используем несбалансированный набор данных. Чтобы сохранить одинаковые пропорции в каждой части набора данных, sklearn автоматизирует этот процесс, когда мы выбираем столбец результатов как стратифицированный. После разделения набора данных оба среза сохраняются в WandB как артефакты.

(V) Поезд

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

Чтобы создать конвейер, необходимо создать класс селектора функций и преобразователь для обработки всех данных в зависимости от их типа. Как было проверено во время процесса EDA, набор данных имеет только два типа: int для беременностей, глюкозы, кровяного давления, толщины кожи и инсулина; и плавающий тип для функции родословной ИМТ и диабета. Поэтому нам нужно создать два класса для обработки каждого из них.

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

Пришло время создать наш конвейер для кодирования функций на основе их типов (int и float).

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

  • Критерий: Джини и энтропия;
  • Разделитель: случайный и лучший;
  • Модель нормализации: MinMax, z-значение и не нормализовано;
  • Случайное состояние: 41;
  • Максимальная_глубина: 4.

На этом этапе наилучшая точность проверки составила 72,53% при использовании критерия Джини, нормализованной модели, равной MinMax, и случайного разделителя. Эта модель была сохранена и сохранена в WandB для использования при тестировании и развертывании.

(VI) тест

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

При этом была достигнута точность 73,16%. При необходимости мы можем вернуться к разделу поезда и попробовать использовать другие гиперпараметры для проверки других конфигураций модели. Важно не забыть сохранить модель в WandB, чтобы использовать ее для развертывания.

РАЗВЕРНУТЬ

Наша модель дерева решений будет развернута с использованием FastAPI в качестве веб-фреймворка, нашего собственного RESTful API, действий GitHub для реализации передового опыта непрерывной интеграции и непрерывной доставки (CI/CD) и Heroku для развертывания. Вы можете найти реализованный API в source/api/main.py, тогда как тесты находятся в source/api/test_main.py.

(I) Настройка среды

Первым шагом здесь является создание среды conda со следующими зависимостями:

(II) Непрерывная интеграция с действиями GitHub

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

Чтобы использовать WandB, необходимо сохранить ваш ключ API в секрете на GitHub. В данном случае он был сохранен как WANDB_KEY_ID. При этом вы по-прежнему можете использовать действия GitHub и WandB, не делясь личным ключом API.

(III) Развертывание с помощью Heroku

Heroku — это облачная платформа как услуга (PaaS), которая поддерживает различные языки и позволяет пользователям развертывать приложения. Для наших целей мы будем использовать Heroku для запуска приложения Python, состоящего из API для вывода машинного обучения. Все, что нам нужно сделать здесь, это:

  • Зарегистрируйтесь бесплатно и испытайте Heroku.
  • Теперь пришло время создать новое приложение. Очень важно подключить приложение к нашему репозиторию GitHub и включить автоматическое развертывание.
  • Установите Heroku CLI, следуя инструкциям.
  • Войдите в героку с помощью терминала
heroku login
  • В корневой папке проекта проверьте уже созданные проекты heroku.
heroku apps
  • Проверьте правильность сборки:
heroku buildpacks --app prima-indians-app
  • При необходимости обновите пакет сборки:
heroku buildpacks:set heroku/python --app prima-indians-app
  • Когда вы запускаете скрипт в автоматизированной среде, вы можете управлять Wandb с помощью переменных среды, установленных до запуска скрипта или внутри скрипта. Настройте доступ к Wandb на Heroku, если используете интерфейс командной строки:
heroku config:set WANDB_API_KEY=xxx --app prima-indians-app
  • Инструкции по запуску приложения содержатся в файле Procfile, который находится на самом высоком уровне каталога вашего проекта. Создайте файл Procfile с помощью:
web: uvicorn source.api.main:app --host=0.0.0.0 --port=${PORT:-5000}
  • Настройте удаленный репозиторий для Heroku:
heroku git:remote --app prima-indians-app
  • Переместите все файлы в удаленный репозиторий в Heroku. Приведенная ниже команда установит все пакеты, указанные в requirements.txt, на виртуальную машину Heroku.
git push heroku main
  • Проверьте запуск удаленных файлов:
heroku run bash --app prima-indians-app
  • Если все предыдущие шаги были выполнены успешно, после открытия вы увидите сообщение ниже: https://prima-indias-app.herokuapp.com/.
  • В целях отладки всякий раз, когда вы можете получить самые последние журналы вашего приложения, используйте команду heroku logs:
heroku logs

Теперь мы можем проверить нашу развернутую модель. Его можно найти по адресу: https://prima-indians-app.herokuapp.com/docs. Вы можете отправить запрос GET с файлом json со всей информацией о первой индийской женщине, как описано в разделе Рабочий процесс, и получить ответ, если она здорова или страдает диабетом.

И ответ:

ЗАКЛЮЧИТЕЛЬНЫЕ МЫСЛИ

Я надеюсь, что в конце этой статьи вы сможете построить свою собственную модель классификации и развернуть ее. Удачи!