Сегодня поговорим про Python-библиотеку River, которая позволяет быстро и дешево обновлять модели машинного обучения в производственной среде в режиме реального времени. Чем потоковые ML-конвейеры отличаются от пакетных и с какими сложностями при их реализации может столкнуться Data Scientist.
Что такое потоковое машинное обучение
Data Scientist’ы обычно используют пакетное обучение для ML-моделей. Пакетный конвейер машинного обучения обычно включает:
- разделение данных на обучающие и тестовые наборы;
- подгонка модели к тренировке;
- вычисление производительности модели на тестовом наборе;
- запуск модели в производство.
Однако после запуска в производство следует убедиться, что модель надежна при изменении входных данных и периодически переобучать ее на новом наборе. По мере роста объема данных обучение ML-модели требует больше времени и ресурсов. Поэтому пакетное обучение не лучший вариант, когда приложение требует частых обновлений модели или ограничены вычислительные ресурсы для хранения и обработки больших данных.
При потоковом обучении ML-модель постепенно обучается на потоке данных, не ожидая полного пакета. Поэтому каждый шаг обучения становится быстрым и дешевым, что делает его идеальным для приложений, которые быстро меняются, и для компаний с ограниченными вычислительными ресурсами.
Одним из прикладных инструментов, который позволяет организовать такое обучение ML-модели на лету, является Python-библиотека River. Она имеет открытый исходный код, работает быстро и отлично сочетается с остальной частью экосистемы Python. Установить River можно с помощью менеджера пакетов pip:
pip install river
Потоковое обучение в реальном времени накладывает ряд ограничений на выполнение довольно простых операций. В частности, достаточно сложно вычислить среднее значение, т.к. общее количество измерений неизвестно. Вместо этого придется использовать текущую статистику для оценки скользящего среднего, обновляя его каждый раз при появлении новых значений.
River.compose предоставляет несколько методов, аналогичных тем, что есть в sklearn.compose, для создания конвейера машинного обучения. Также библиотека имеет следующие функциональные возможности:
- линейные модели с широким набором оптимизаторов;
- ближайшие соседи, деревья решений, наивный байесовский метод;
- обнаружение аномалий;
- обнаружение дрейфа;
- рекомендательные системы;
- прогнозирование временных рядов;
- несбалансированное обучение;
- кластеризация;
- извлечение и выбор признаков;
- онлайн-статистика и показатели;
- встроенные наборы данных;
- прогрессивная проверка модели;
- моделирование конвейеров обработки данных.
Будучи потоковой библиотекой машинного обучения, River работает с данными, которые представляют собой последовательность отдельных элементов, набор фичей, которые могут появляться и исчезать со временем. Происхождение потока данных не имеет значения: можно использовать River независимо от того, откуда поступают данные. Однако, следует помнить о разнице между реактивными и проактивными потоками данных:
- реактивными считаются потоки данных, в которых данные поступают извне и эти события невозможно контролировать. Например, события пользовательского поведения на сайте, на которые нужно реагировать.
- проактивными называются потоки данных, над которыми есть контроль. Например, можно считывать данные из файла или очереди сообщений с заданной скоростью и в нужном порядке.
Таким образом, потоковое машинное обучение сводится к тому, чтобы превратить реактивные потоки в упреждающие наборы данных. События обычно регистрируются в базе данных и обрабатываются в автономном режиме для построения KPI или моделей обучения. Кроме того, необходимо обеспечить, чтобы модели, обученные в автономном режиме на проактивных наборах данных, правильно работали в рабочей среде с реактивными потоками. Таким образом, потоковое машинное обучение полностью противоположно традиционному способу пакетного Machine Learning, который заключается в одновременном обучении модели на всех пакетных данных. Потоковая ML-модель представляет собой динамический объект с состоянием, который продолжает учиться и не должен пересматривать прошлые данные. Как это реализуется в Python-библиотеке River, рассмотрим далее.
Потоковый ML с Python-библиотекой River
Машинное обучение включает в себя множество различных задач: классификацию, регрессию, обнаружение аномалий, прогнозирование временных рядов и пр. Библиотека River позволяет решать эти задачи в потоковом режиме, а также поддерживает некоторые более простые задачи. Например, рассчитать скользящее среднее значение потока данных.
River состоит из набора классов, которые реализуют различные алгоритмы онлайн-обработки. Большинство этих классов представляют собой модели машинного обучения, которые могут обрабатывать одну выборку за раз для обучения или для вывода.
Потоковая обработка отличается от пакетной тем, что векторизация не дает никакого ускорения, поэтому популярные Python-библиотеки числовой обработки, такие как numpy и PyTorch имеют слишком много накладных расходов. В этом случае собственные структуры данных Python работают быстрее. Поэтому River использует словари, которые позволяют назвать каждую функцию и могут содержать любой тип данных. Они обеспечивают прозрачную поддержку полезной нагрузки JSON, обеспечивая кажущуюся интеграцию с веб-приложениями. Преимущество потокового Machine Learning в том, что можно создавать ML-модели, которые делают прогнозы, а также извлекают уроки из этого потока данных по мере их поступления.
Однако, в процессе разработки модели, у Data Scientist’а обычно нет доступа к потоку данных в реальном времени: есть лишь автономный набор данных, на котором можно оценить ML-модель. River предоставляет несколько наборов данных, которые можно читать онлайн, по одной выборке за раз. При этом следует максимально точно воспроизвести рабочий сценарий, чтобы модель работала так же хорошо в производственной среде.
Оценка потоковой ML-модели отличается от ее традиционного пакетного аналога. В последнем случае обычно выполняется кросс-валидация, в результате чего набор данных разделяется на набор данных для обучения и набор данных для оценки. Но это не совсем точно отражает процесс генерации данных, происходящий в рабочей среде. Оценка потоковой модели включает в себя обучение и вывод в том же порядке, что и в производственной среде, позволяя воспроизвести производственный сценарий и оценить модель с более высокой точностью, чем при кросс-валидации.
Пожалуй, это и есть главное преимущество потоковых ML-конвейеров: воспроизведение наборов данных в правильном порядке гарантирует, что создаваемые модели будут работать в рабочей среде так, как ожидается. Впрочем, нарушить это может дрейф концепции, который характерен и для пакетного обучения. Дополнительным плюсом потоковых моделей является их адаптируемость: они продолжают постоянно учиться и сами приспосабливаются к изменениям, тогда как пакетные модели необходимо переобучать с нуля.
Справедливости ради стоит отметить, что потоковое машинное обучение требуется далеко не во всех сценариях. В большинстве случаев пакетные ML-конвейеры отлично справляются с задачами сбора и доставки данных к модели. Однако, потоковый режим необходим, если:
- нужна модель, которая может учиться на новых данных, не возвращаясь к прошлым измерениям;
- нужна модель, устойчивая к дрейфу концепции;
- нужно разработать ML-модель так, чтобы она была ближе к тому, что происходит в производственном контексте, который обычно основан на событиях.
Как применять эти и другие современные инструменты MLOps в проектах аналитики больших данных, вы узнаете на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
Источники