Практическое введение в инкрементное обучение на Python с использованием scikit-multiflow

Вступление

Данные повсюду вокруг нас. Будь то изображения профиля, твиты, сенсорные приложения, транзакции по кредитным картам, электронные письма или новостные ленты, данные здесь… и генерируются с невероятной скоростью. С этими кажущимися бесконечными потоками данных одной из ключевых задач является создание облегченных моделей, которые всегда готовы к прогнозированию и адаптации к изменениям в распределении данных. Ограничения традиционных методов машинного обучения в этих условиях привели к развитию методов онлайн-обучения (также называемых инкрементальным обучением).

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

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

На каждой итерации модель предсказывает метку класса, показывает истинную метку, а затем обновляется

Инкрементное обучение относится к семейству масштабируемых алгоритмов, которые учатся последовательно обновлять модели из бесконечных потоков данных¹. В то время как в «традиционном» машинном обучении нам предоставляется полный набор данных, состоящий из пар (входные и выходные данные), в инкрементальном обучении у нас нет всех данных, доступных при создании модели. Вместо этого точки данных поступают по одной, и мы должны построить «живую» модель, которая учится и адаптируется по мере поступления данных. Инкрементная модель имеет следующие характеристики²:

  • Он может предсказать в любое время
  • Он может адаптироваться к дрейфу концепций - т.е. изменениям в распределении данных⁴. Приведу конкретный пример: если мы заинтересованы в построении модели, которая предсказывает, сколько денег банк должен ссудить, финансовый кризис может изменить суммы или факторы, которые необходимо учитывать. В этом случае модели необходимо повторно изучить много информации.
  • Он способен обрабатывать бесконечный поток данных с ограниченными ресурсами (время и память). Это означает, что он не может хранить все данные обучения, как в обычных подходах к машинному обучению.

Работа с потоками данных в Python

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

Первое, что мы хотим сделать, это установить scikit-multiflow.

pip install -U scikit-multiflow

Импорт генератора данных прост и может быть выполнен с помощью следующей команды:

from skmultiflow.data import SEAGenerator

Здесь мы собираемся работать с генератором SEA, но есть много других доступных вариантов (подробности см. В документации: https://scikit-multiflow.github.io/scikit-multiflow/). Генератор SEA позволяет генерировать бесконечный поток данных с 6 входами и 2 выходами. Этот конкретный поток данных содержит частый резкий сдвиг концепций.

Использовать генератор довольно просто. Первое, что нам нужно сделать, это инициализировать его следующим образом:

stream = SEAGenerator()      # create a stream
stream.prepare_for_use()     # prepare the stream for use

Затем, если мы хотим получить образец данных, все, что нам нужно сделать, это

X,Y = stream.next_sample()

где X, вход, представляет собой 6-мерный массив np.array, а Y, выход, представляет собой 2-мерный массив np.array.

Простой онлайн-классификатор

Теперь давайте создадим простой классификатор для потока данных SEA. Есть много дополнительных моделей, доступных с scikit-multiflow, одна из самых популярных - Hoeffding Trees.

Hoeffding Trees

Деревья Хёффдинга³ строятся с использованием очень быстрого обучения дерева решений (VFDT), системы постоянного времени, которая строит деревья решений с использованием постоянной памяти и постоянного времени для каждого примера. Представленный в 2000 году Педро Домингосом и Джеффом Халтеном, он использует хорошо известный статистический результат, границу Хёффдинга, чтобы гарантировать, что его результат асимптотически идентичен результату традиционного ученика.

В scikit-multiflow создание дерева Хёффдинга выполняется следующим образом

from skmultiflow.trees import HoeffdingTree
tree = HoeffdingTree()

Обучение дерева Хёффдинга для классификации

Если мы хотим обучить дерево потоку данных SEA, мы можем просто перебрать любое количество точек данных, которое нам нужно.

correctness_dist = []
for i in range(nb_iters):
   X, Y = stream.next_sample()        # get the next sample
   prediction = tree.predict(X)       # predict Y using the tree     
   if Y == prediction:                # check the prediction
     correctness_dist.append(1)
   else:
     correctness_dist.append(0)   
   
   tree.partial_fit(X, Y)             # update the tree

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

import matplotlib.pyplot as plt
time = [i for i in range(1, nb_iters)]
accuracy = [sum(correctness_dist[:i])/len(correctness_dist[:i]) for i in range(1, nb_iters)]plt.plot(time, accuracy)

Альтернативный подход с Scikit-Multiflow

В scikit-multiflow есть встроенный способ сделать то же самое с меньшим количеством кода. Что мы можем сделать, так это импортировать класс EvaluatePrequential:

Затем мы можем настроить «оценщик» следующим образом

evaluator=EvaluatePrequential(show_plot=True,max_samples=nb_iters)

Установка параметра show_plot = True позволит отображать всплывающее окно с графиком точности классификации в реальном времени.

Теперь, когда оценщик настроен, мы можем использовать его для постепенного обучения нашего дерева Хёффдинга в потоке данных SEA, как и раньше:

evaluator.evaluate(stream=stream, model=tree)

Заключение

Надеюсь, это руководство помогло вам понять основы инкрементального обучения. Более того, я надеюсь, что теперь вы понимаете, как использовать scikit-multiflow для базовых задач обучения потокам данных.

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

[1] Дойен Саху и др., Глубокое обучение в Интернете: изучение глубоких нейронных сетей на лету (2017 г.), 1711.03705

[2] Джесси Рид и др., Пакетно-инкрементное обучение в сравнении с инкрементным обучением в динамических и развивающихся данных (2012), 978–3–642–34156–4_29

[3] Педро Домингос и Джефф Халтен, Майнинг высокоскоростных потоков данных (2000), 347090.347107

[4] Мааян Харел и др., Обнаружение дрейфа концепции посредством передискретизации (2014 г.), citation.cfm