Время прочтения: 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 можно воспользоваться поиском для исследования всех возможностей библиотеки.