Практическое введение в инкрементное обучение на 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