Машинное обучение в реальном времени: онлайн-обучение с PubNub

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

Что такое машинное обучение?

Машинное обучение — это просто пересечение статистики и компьютерных наук. Традиционно статистические вычисления выполняются на небольшом наборе данных, чтобы найти линию наилучшего соответствия (корреляции). Линейная регрессия (y = mx + b) — самый простой статистический метод, но для более сложных наборов данных используются более сложные методы (например, градиентный спуск).

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

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

Онлайн обучение

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

Это позволяет получить массу преимуществ:

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

Основное преимущество, которое мы собираемся использовать сегодня, — это возможность направлять поток данных в реальном времени в модель машинного обучения. Модель будет корректироваться и обновляться при каждом новом фрагменте потока данных и «забывать» старые данные на основе заданного периода времени. Мы собираемся использовать PubNub в качестве нашей сети потоков данных на основе структуры, приведенной ниже.

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

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

В стохастическом (случайном) градиентном спуске мы итерируем чашу случайным образом. В отличие от GD, который плавно проходит вниз по чаше, SGD движется вниз по чаше зигзагами и может даже отскакивать от минимума, что делает его «шумным»; однако с очень большими наборами данных SGD сходится к минимуму за гораздо меньшее количество итераций, чем GD, и все же дает хорошее приближение к глобальному минимуму.

Код Python для вашей онлайн-системы машинного обучения

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

Чтобы получить рекомендации, посетите репозиторий этого проекта.

Шаг 1: ПабНуб

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

Поскольку мы будем строить наш алгоритм на Python, мы будем использовать PubNub's Python SDK. В терминале введите:

Затем создайте файл Python и импортируйте зависимости PubNub.

Создайте экземпляр PubNub с ключами публикации и подписки, которые вы получили при создании учетной записи PubNub.

Чтобы опубликовать наш поток данных в реальном времени, нам понадобится обратный вызов публикации, реализованный следующим образом:

ПРИМЕЧАНИЕ. Чтобы упростить демонстрацию этого руководства, мы публикуем и подписываем данные в реальном времени в одном и том же файле Python. На практике данные будут публиковаться сторонним производителем, а клиентская программа, содержащая алгоритм машинного обучения, будет подписываться на эти данные.

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

Ниже создайте экземпляр прослушивателя обратного вызова и подписчика по отношению к указанному каналу следующим образом:

Шаг 2: Предварительная обработка данных и потоковая передача данных

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

Создайте новый файл Python в каталоге вашего проекта и используйте этот код для создания CSV-файла набора данных.

Теперь, когда у нас есть набор данных для работы, давайте вернемся к нашему исходному файлу Python и разберем данные на управляемые фрагменты.

Для чтения данных из CSV воспользуемся библиотекой Pandas. Мы также собираемся использовать библиотеку Python Numpy для преобразования данных в структуру данных, которую может понять наш алгоритм машинного обучения. В верхней части файла Python импортируйте библиотеки.

Теперь мы будем считывать данные порциями. Каждый фрагмент будет содержать 200 строк (наблюдений) вместе со всеми столбцами (атрибутами) каждого наблюдения.

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

Шаг 3: Машинное обучение

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

Первое, что нам нужно сделать, это создать несколько переменных и экземпляров класса для нашего обратного вызова подписчика, который будет использоваться при каждом входящем сообщении. Это включает в себя саму модель ML, поскольку нам нужно повторно использовать предыдущую модель для ее обновления. Мы также будем использовать MinMax Scaler для масштабирования входящих данных, чтобы большие колебания значений данных не искажали наши результаты.

В самом верху обратного вызова подписчика объявите эти переменные и экземпляры:

Теперь в вашем обработчике сообщений поместите этот блок кода:

Как вы можете видеть выше, мы выполнили следующие шаги:

  1. Отформатировал фрагмент в рабочую структуру данных
  2. Подгонка и преобразование фрагмента в наш скейлер
  3. Разбил исходный блок данных на две матрицы X (независимые переменные) и y (зависимые переменные).
  4. Частично подгоните две матрицы к нашему ученику, чтобы постепенно учиться на нем.
  5. Отображение точности модели при каждом последующем обновлении

Терминальный выход

Поздравляем! Если вы зашли так далеко, пришло время увидеть плоды своего труда! Вы должны ожидать, что ваш терминал будет печатать каждую эпоху обучения (обработанный фрагмент), а также текущую точность алгоритма:

Если мы позволим алгоритму работать некоторое время, средняя точность проверки сходится примерно к 70%, что неплохо для синтетически сгенерированного набора данных!

Вывод

Не стесняйтесь присылать нам любые ваши вопросы, проблемы или комментарии по адресу [email protected].

Если вы все еще хотите узнать больше о машинном обучении PubNub, вот несколько других статей, которые могут вас заинтересовать: