Сокращение разрыва между PoC и интегрированным решением для двоичной классификации

Когда я впервые услышал, что примерно только 13% проектов по обработке и анализу данных идет в производство, я был очень разочарован. В то время, с моим ограниченным опытом машинного обучения в Jupyter Notebooks, было не так ясно, что будет после стадии PoC и как. Кроме того, развертывание машинного обучения может быть достигнуто разными способами - это зависит от цели проекта, доступных инструментов и стоимости этих инструментов, поэтому трудно понять, какой путь выбрать в качестве начала. К счастью, недавно у меня была возможность пройти курс Full Stack ML on GCP от AICamp, в котором рассказывалось о развертывании модели на платформе Google AI. При этом я решил разработать этот проект, PoC-классификацию Scikit-learn с последующим обучением и развертыванием на платформе Google AI, а также запуск с помощью облачной функции.

Проблема

Я использовал набор данных о намерениях покупателей в Интернете [1], предоставленный репозиторием машинного обучения UCI. Здесь данные были объединены таким образом, что каждая строка соответствует сеансу от другого пользователя, с 12 330 образцов (сеансов). Доход (Верно или Неверно) используется в качестве моего целевого столбца. Основываясь на функциях потока кликов, таких как BounceRate, категория посещенных страниц и время, проведенное на этих страницах (ProductRelated, информационное и т. Д.), Я хотел оценить показатели точности двух моделей: XGBoost и его пары Gradient. Повышение. Подробное описание всех функций в наборе данных приведено в исходной ссылке.

Из рисунка 1 видно, что данные не содержат нулевых значений.

PoC

Первоначально из-за наличия категориальных и логических переменных они кодировались с помощью LabelEncoder из sklearn.preprocessing. Последовательно проверялась корреляция между признаками:

Хотя есть указание на более высокую корреляцию в верхней левой части графика по сравнению с остальными, самые высокие значения были обнаружены для ProductRelated_Duration x ProductRelated и ExitRates x BounceRates. Поэтому я исключил ProductRelated_Duration и ExitRates из списка функций, которые служили исходными данными для моделей, а затем и для обучения GCP.

Более того, поскольку целевые классы сильно несбалансированы (10 422 сеанса с доходом = False и 1 908 True), я применил алгоритм передискретизации, Технику передискретизации синтетических меньшинств, SMOTE - для решения этой проблемы. Впоследствии я применил разделение на поезд / тест с 20% данных, зарезервированных для проверки.

Наконец, я протестировал производительность двух классификаторов, XGboost и Gradient Boosting, сравнив их точность:

Хотя наблюдается некоторое переоснащение из-за разницы в оценке обучения и тестирования, модель XGBoost привела к более высокой общей производительности, о чем также можно судить из отчетов о классификации:

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

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

Итак, давайте развернем модель XGBoost!

Развертывание

Здесь я воспользуюсь встроенной функцией обучения на платформе Google AI Platform, поскольку там доступен XGBoost. Если вы хотите напрямую использовать модель Scikit-learn, разработанную на этапе PoC, можно экспортировать ее, например, с помощью sklearn.externals.joblib. Более подробную информацию можно найти по этой ссылке. Таким образом, этап разработки разделен на:

  • Создание учебной работы;
  • Развертывание модели;
  • Создайте облачную функцию для взаимодействия с внешними приложениями.

Как упоминалось ранее, часть кода преобразует форму измененного набора данных (после кодирования и выбора функций) в формат, который принимает платформа Google AI. Целевой столбец должен быть первым и определен как строка или int , в то время как входные переменные имеют значение с плавающей запятой. Входной CSV-файл доступен в репозитории этого проекта здесь.

Создание учебной работы

Во-первых, необходимо загрузить CSV-файл в хранилище. Перейдите в раздел «Хранилище» ›создать корзину, выберите имя и укажите свой регион:

Затем нажмите СОЗДАТЬ и загрузите файл. После этого перейдите в Google AI Platform ›Jobs и нажмите NEW TRAINING JOB. В нашем случае, поскольку XGBoost доступен как встроенный алгоритм, выберите этот и последующие «XGBoost» на шаге алгоритма обучения и нажмите ДАЛЕЕ:

На шаге Данные обучения выберите файл, загруженный в корзину, с помощью кнопки ОБЗОР. В «Проверочных данных» мы будем использовать то же разделение (20%), что и в PoC. Выберите выходной путь обучения - это может быть тот же самый сегмент - и нажмите ДАЛЕЕ.

Самая важная часть - это третья, аргументы алгоритма. Здесь вы сначала определяете цель, которая в нашем случае является двоичной: логистической, поскольку это проблема классификации, eval_metric и booster . Обратите внимание, что результатом этого типа цели является вероятность того, что образец относится к положительному или истинному классу. Для eval_metric задано значение ошибка, чтобы оценить классификацию, и gbtree как ускоритель, который используется по умолчанию. Вдобавок я выбрал для HyperTune три параметра: num_boost_round, max_depth, и eta. Подробное описание каждого из них можно увидеть в документации XGboost.

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

На последнем этапе, Настройки задания, определите имя задания и выберите тот же регион, который выбран для сегмента хранилища. Выберите Scale Tier = Basic и нажмите DONE. Отлично, ваше задание по обучению запущено (: это займет около нескольких минут.

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

Развертывание модели

После того, как ваше учебное задание будет завершено, на экране сведений о задании выберите успешную пробную версию и нажмите РАЗВЕРТИТЬ МОДЕЛЬ:

Введите название модели, выберите тот же регион и нажмите ПОДТВЕРДИТЬ. Последняя часть теперь - присвоить ему версию:

Нажмите СОХРАНИТЬ, подождите еще несколько минут, и у вас будет развернутая модель машинного обучения.

Создание облачной функции

Облачные функции допускают бессерверное развертывание и возможность вызывать модель машинного обучения через REST API. Чтобы настроить эту часть, перейдите в Cloud Functions на GCP и выберите CREATE NEW FUNCTION. Здесь выберите имя функции и снова выберите тот же регион. Оставьте триггер как HTTP.

Нажмите «Далее» и определите время выполнения исходного кода (здесь я выбрал Python 3.7) и введите точку входа с тем же именем, что и используемая функция.

Код, показанный на рисунке 16, также доступен в репозитории. Используя HTTP-ссылку облачной функции, можно использовать внешнее приложение, такое как Postman, и отправлять запросы и получать прогнозы:

Опять же, важно отметить, что результат - это прогнозируемая вероятность того, что в нашем случае для этого сеанса Revenue = True. Аналогичный тест можно провести и внутри Google AI Platform в разделе «Модели› Тестирование и использование »с использованием входных данных в формате JSON.

Это оно! Теперь у вас есть развернутая облачная модель, которую можно вызывать с помощью внешнего приложения и возвращать прогнозы.

Надеюсь, вам понравился этот пост, и он вдохновил вас выйти за рамки PoC для Jupyter Notebooks (:

Ссылки:

[1] Сакар, С.О., Полат, С.О., Катирчиоглу, М. и др. Прогнозирование покупательского намерения онлайн-покупателей в реальном времени с использованием многослойного персептрона и рекуррентных нейронных сетей LSTM. Neural Comput & Applicant 31, 6893–6908 (2019). Https://doi.org/10.1007/s00521-018-3523-0