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

  • Непрерывная доставка. Специалисты по обработке данных разрабатывают и тестируют модели машинного обучения, которые необходимо постоянно гибко развертывать в производственной среде. Каждую неделю мы обучаем и развертываем модели машинного обучения в производственной среде.
  • Обнаружение мошенничества в реальном времени. Система обнаружения мошенничества (совокупность моделей машинного обучения) должна оценивать риск платежной транзакции максимум за 100 миллисекунд (0,1 секунды).
  • Высокая доступность и масштабируемость. Система должна быть высокодоступной со скоростью 99,99%. Он также должен быстро расширяться, потому что iyzico - это очень быстрорастущий стартап (количество транзакций iyzico увеличилось на 800% в прошлом году).
  • Кривая обучения. Наш технологический стек должен иметь низкую кривую обучения. Стек также должен легко поддерживать связь между специалистом по данным и разработчиком программного обеспечения. Наши инженеры всегда борются с чрезмерным проектированием.
  • Открытый исходный код: поскольку мы стартап и любим открытый исходный код, стек технологий должен быть полностью открытым. Мы пытаемся внести свой вклад в проекты с открытым исходным кодом.
  • Быстро. Девиз нашей компании - «просто, быстро и весело». Мы должны действовать быстро при создании прототипов и развертывании MVP наших продуктов.
  • Локально: из-за правил оплаты мы не можем запускать программное обеспечение в облаке. Наше решение должно быть развернуто локально.

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

  • Нашим основным критерием было время выхода на рынок, и нам нужно легко и быстро развертывать модели машинного обучения. Это очень простая задача - легко обучить модель с помощью prediction.io через его REST API:

  • Spark - это масштабируемый механизм обработки данных. Его можно легко масштабировать по мере роста объема данных.

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

Основные проблемы:

  • Невозможно развернуть существующую модель в производственной среде с помощью prediction.io. Вам следует снова обучиться в производственной среде, потому что фреймворк тяжелый и может запускать только модели, которые он обучил, в той же среде.
  • Prediction.io и Spark требуют слишком много оборудования, даже если вы работаете с небольшим объемом данных. Например, почти 16 ГБ ОЗУ требуется для обучения модели с 1 миллионом транзакций с 100 функциями с деревом решений . Общедоступное облако с функциями автоматического масштабирования не может использоваться из-за нормативных требований, и нам нужно выделить дополнительные серверы с большой оперативной памятью только для обучения.
  • Когда количество функций увеличивается, время прогнозирования увеличивается экспоненциально на сайте prediction.io.
  • Экспериментировать со Spark и prediction.io сложно. Специалистам по обработке данных необходимо построить модель с помощью облегченного фреймворка (Python, R, IPython и т. Д.) Для быстрого экспериментирования. Более того, разработчики также хотели бы иметь возможность развертывать модели, созданные ими в среде песочницы, в производственной среде.
  • У Spark хорошее сообщество разработчиков. Однако у prediction.io нет стабильного сообщества, и внести свой вклад сложно. Он реализован с помощью Scala, и поддержка и масштабирование кода Scala - еще одна сложная проблема.

После того, как эти проблемы стали мучить нас, мы начали искать легкую платформу машинного обучения с открытым исходным кодом. Для нас было легко перейти на другую платформу машинного обучения, поскольку мы реализовали «Разработка функций» и «Конвейер данных» с Java 8, и нам не нужно было менять сторону разработки функций. Мы изменим только модель обучения и инфраструктуру развертывания.

Команда специалистов по обработке и анализу данных протестировала фреймворки Tensor Flow, Spark ML (существующий фреймворк) и H2O и проанализировала тесты производительности. Метрики тестов были:

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

После тщательного анализа мы решили перейти на фреймворк H2O. Причины миграции:

  • Модели машинного обучения можно преобразовать в простой POJO, и эту модель легко развернуть в любой среде Java. Чтобы специалист по данным мог построить модель с помощью R и Python и передать эту модель команде разработчиков в формате POJO.
  • Управление выпусками и цикл DevOps упрощаются с моделью POJO ML.
  • Потребности в оборудовании уменьшились. Например, для обучения с 1 миллионом транзакций и 100 функциями со случайным лесом (с 64 деревьями) требуется почти 16 ГБ ОЗУ на Spark ML, 10 ГБ ОЗУ на Tensor Flow и 2 ГБ ОЗУ на H2O.
  • С H2O легко проводить эксперименты в локальной среде. Вы можете просто запустить фреймворк с помощью команды «java -jar h2o.jar» и поэкспериментировать с Python и R в записной книжке браузера.

Затем мы, наконец, перешли со Spark ML на H2O и получили следующие результаты:

  • 60 ГБ ОЗУ. Spark ML и prediction.io нуждались в этой оперативной памяти во время обучения модели
  • 12 ядер сохранено. Эти ядра понадобились Spark ML и prediction.io, чтобы сократить время обучения модели.
  • Время отклика уменьшилось почти в 10 раз (с 300 миллисекунд до 35 миллисекунд):

  • Производительность механизма защиты от мошенничества (точность, отзыв и измерение F) не изменилось:

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

Для получения более подробной информации вы можете присылать свои вопросы на адрес [email protected] и в нашу команду по разработке данных (Мустафа Кирач, Кадрие Доган, Кемал Топрак Учар , Yalçın Yenigün) свяжется с вами.

Использованная литература: