Решаем, нужно ли пополнить торговый автомат

В течение 2020 года латиноамериканская IBM провела марафон кодирования, который включал в себя задачи с использованием некоторых из самых прорывных технологий на рынке, таких как облачные вычисления, машинное обучение, IoT, контейнеры, обработка естественного языка (NLP), наука о данных и другие. .





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

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

Данные

Данные были собраны с помощью гаджета IoT и состояли примерно из 17 тыс. Строк со следующими функциями:

  • ID
  • Время
  • Станция
  • Широта
  • Долгота
  • Движение
  • 8 видов вкусов

У целевого объекта есть только два возможных значения: normal или restock.

На рисунке ниже представлена ​​структура собранных нами данных.

Функциональная инженерия

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

Затем были созданы две характеристики со средним и медианным количеством банок от каждого аромата. Из даты и времени каждой строки мы также извлекли функцию день недели.

Для категориальной функции, станции метро, мы преобразовали каждую станцию ​​метро в новый столбец и присвоили столбцу значение или 0 (Истина / Ложь). Это позволяет избежать неправильного масштабирования значения и называется горячим кодированием. Мы реализовали один из самых простых - с пандами и методом get_dummies ().

Данные балансировки

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

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



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

Выбор функции

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

Использовался метод рекурсивного исключения признаков (RFE). Следующее описание кратко объясняет, как работает алгоритм, ссылка на документацию также находится ниже.

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



После запуска селектора функций с помощью XGBClassifier лучшие результаты показали:

  • все вкусы
  • будний день
  • и станции метро

AutoML

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

TPOT - это библиотека с открытым исходным кодом для выполнения AutoML в Python. Он использует популярную библиотеку машинного обучения Scikit-Learn для преобразования данных и алгоритмов машинного обучения. Он работает на основе алгоритма стохастического поиска, чтобы эффективно обнаруживать наиболее эффективный конвейер модели для заданного набора данных.



Недостатком большинства алгоритмов AutoML является то, что чем больше переменных и чем больше сценариев вы хотите протестировать, тем больше времени потребуется на выполнение. Это требует больших вычислительных затрат. Итак, учитывая ограниченное время, мы провели наш TPOT только с 10 поколениями.

Результатом, что не удивительно, стал XGBoostClassifier, один из наиболее применяемых методов в мире соревнований по машинному обучению. Полный вывод метода TPOT следующий:

XGBClassifier(learning_rate=0.001, max_depth=9, min_child_weight=9, n_estimators=100, nthread=1, subsample=0.4)

Оценка модели

Набор данных был разделен в пропорции 80/20 для целей обучения / тестирования. И мы получили следующие результаты:

Матрица путаницы также доступна ниже:

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

Заключение и некоторые замечания

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

Кроме того, мы могли видеть, что производительность, полученная с помощью этого конвейера, была удовлетворительной, поскольку в Behind the Code Marathon мы оба попали в 100 лучших заявок Бразилии. В конкурсе приняли участие более 70 тысяч участников.

Код, приведенный в качестве примера в этой статье, доступен по адресу https://github.com/camilabga/tnt-challenge/.