Время прочтения: 4 мин.

Традиционный подход в задачах машинного обучения заключается в обработке данных отдельными пакетами, где предсказание формируется за один раз, исходя из тренировочного датасета. Такой статичный подход чаще всего реализуют с использованием Scikit-learn, Tensorflow или PyTorch, где требуется переобучение с нуля, т.е. на всех данных (и на новых, и на старых). Однако, обеспечение постоянной доступности к данным является жестким ограничением для применения ML в большинстве приложений из реального мира, где происходит их непрерывная генерация данных. Кроме того, для хранения исторических данных требуются выделенные ресурсы хранения и обработки, что в некоторых случаях могут быть непрактично (например, хранение сетевых логов дата-центра).

Инкрементный подход заключается в непрерывной обработке данных и расширении знаний модели на их основе. Другими словами, машинное обучение выполняется в потоковой среде. При использовании такого ML метода, данные в модель передаются последовательно и далее используются для обновления предсказания на последующих данных, которое выполняется на всех шагах обучения. Инкрементное машинное обучение, подходит для решения задач, когда невозможно обучение на всём датасете (например, алгоритмы, работающие с внешней памятью). Непрерывное обучение отлично показывает себя в задачах прогнозирования временных рядов, фильтрации спама, рекомендательных системах, прогнозировании CTR и интернете вещей.

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

Модели машинного обучения в библиотеке River представляют собой расширенные классы специализированных миксинов в зависимости от ML задачи, например, классификация, регрессия, кластеризация и т.д. Это обеспечивает совместимость всей библиотеки и облегчает расширение /модификацию существующих моделей и создание новых моделей, совместимых с river. Все прогностические модели выполняют две основные функции: обучают и прогнозируют.

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

Для работы c библиотекой необходим Python 3.6 или выше. Установка может быть выполнена с помощью pip:

pip install river

Импортируем встроенный датасет:

 from pprint import pprint
 from river import datasets
 dataset = datasets.Phishing()

Пример записи из данного датасета:

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

 from river import compose
 from river import linear_model
 from river import metrics
 from river import preprocessing

 model = compose.Pipeline(
 	preprocessing.StandardScaler(),
 	linear_model.LogisticRegression()
 )

 metric = metrics.Accuracy()

 for x, y in dataset:
 	y_pred = model.predict_one(x)      # предсказание
 	metric = metric.update(y, y_pred)  # обновление метрики
	model = model.learn_one(x, y)      # обучение

Сравнительный анализ

Сравнительный анализ был проведен на реализации 3 ML алгоритмов: Гауссовский наивный Байес (GNB), Логистическая регрессия (LR) и Дерево Хеффдинга (HT).

В таблице 1 показана одинаковая точность для всех моделей.

В таблице 2 показано время обработки (обучение модели и предсказания) для тех же алгоритмов.

Результаты исследования показали, что модели river в целом работают быстрее остальных. Тесты выполнялись на наборе данных Elec2 (данные об энергозатратах Australian New South Wales Electricity Market, M. Harries, J. Gama, A. Bifet – 2009), который содержит 45312 записи с 8 числовыми характеристиками. Указанное время обработки — это среднее время 7 экспериментов, проведенных на системе с четырехъядерным процессором Intel Core i5 с частотой 2,4 ГГц и 16 ГБ оперативной памяти.

Дополнительные тесты для других задач и пакетов ML доступны в репозитории проекта

Результаты сравнительного анализа показали, что на тестах метод работает так же хорошо, но при этом быстрее своих более ограниченных родителей (creme и scikit-multiflow).

Ещё один небольшой пример, показывающий полную задачу ML (обучение, предсказание и метрика), легко реализуемую в паре строк кода:

from river import evaluate
from river import metrics
from river import synth
from river import tree

stream = synth.Waveform(seed=42).take(1000)
model = tree.HoeffdingTreeClassifier()
metric = metrics.Accuracy()
evaluate.progressive_val_score(stream, model, metric)

Приложения библиотеки River, как правило, столь же разнообразны, как и в традиционных пакетных подходах, включая: классификацию, регрессию, кластеризацию и обучение признакам представлениям), multi-label и multi-output learning, прогнозирование, обнаружение аномалий и др. На странице River можно воспользоваться поиском для исследования всех возможностей библиотеки.