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

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

1. Классификатор дерева Хёффдинга и
2. Чрезвычайно быстрый классификатор дерева решений:

Оглавление:

  1. Моделирование потоковых данных
  2. Стратегия оценки инкрементных алгоритмов
  3. Классификатор дерева Хёффдинга
  4. ПРАКТИЧЕСКАЯ РАБОТА с рекой для классификатора деревьев Хеффдинга
  5. Чрезвычайно быстрый классификатор дерева решений
  6. ПРАКТИЧЕСКАЯ РАБОТА с рекой для чрезвычайно быстрого классификатора дерева решений

1. Моделирование потоковых данных:

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

  1. Генератор гиперплоскости. Поскольку мы можем плавно изменять ориентацию и положение гиперплоскости, регулируя относительные размеры весов, гиперплоскости идеально подходят для воспроизведения изменяющихся во времени понятий. Этот генератор вносит изменения в этот набор данных, добавляя дрейф к каждому взвешенному признаку, это вероятность того, что направление изменения изменится на противоположное, и это изменение применяется к каждому примеру.
    Ниже показано, как мы можем генерировать данные, используя реку. :
from river import synth
dataset = synth.Hyperplane(seed=42, n_features=2)
for x, y in dataset.take(5):
  print(x, y) 
# OUTPUT
#{0: 0.7319, 1: 0.5986} 1 
#{0: 0.8661, 1: 0.6011} 1 
#{0: 0.8324, 1: 0.2123} 0 
#{0: 0.5247, 1: 0.4319} 0 
#{0: 0.2921, 1: 0.3663} 0

2. Генератор Agarwal. Одним из первых источников данных для обучения изучающих дерево принятия решений был генератор потоков Agarwal. Набор данных содержит девять различных функций. Целевая переменная указывает, следует ли одобрить кредит. Возраст, зарплата, уровень образования, сумма кредита, стоимость дома, почтовый индекс, комиссионные, производитель автомобилей и количество лет владения домом — вот некоторые из характеристик или предикторов в этом наборе данных. Определено 10 функций для создания меток бинарных классов из функций. Предположительно, они определяют, должен ли быть одобрен кредит.

from river import synth
# classification_function accepts values between 0-9
dataset = synth.Agrawal(classification_function=0, seed=42)
for x, y in dataset.take(5):
   print(list(x.values()), y) 
# Output
[68690.2154, 81303.5729, 62, 4, 6, 2, 419982.4410, 11, 433088.0728]1 
[98144.9515, 0, 43, 2, 1, 7, 266488.5281, 6, 389.3829] 0 [148987.502, 0, 52, 3, 11, 8, 79122.9140, 27, 199930.4858] 0 [26066.5362, 83031.6639, 34, 2, 11, 6, 444969.2657, 25, 23225.2063]1 
[98980.8307, 0, 40, 0, 6, 1, 1159108.4298, 28, 281644.1089] 0

Ниже представлен более подробный обзор данных, сгенерированных с помощью генератора Agarwal:

Существует много других таких генераторов данных, таких как генератор потока светодиодов (с дрейфом концепции), генератор потока смешанных данных, генератор потока концепций STAGGER и т. д.

2. Стратегия оценки инкрементных алгоритмов:

Оценка алгоритмов добавочного машинного обучения немного отличается от традиционных методов машинного обучения. Обычно в машинном обучении мы используем контрольный набор тестов, который алгоритм машинного обучения никогда раньше не видел, и мы проверяем производительность нашей модели на этом наборе данных. Но при инкрементном обучении потоковых данных свойства данных, которые могут меняться со временем, нуждаются в новых способах оценки. Обучение/тестирование. Существует несколько способов оценки моделей инкрементного обучения, и наиболее часто используемые из них следующие:

1. Holdout: используйте более ранние данные для обучения и более поздние данные для тестирования. Значение, когда у вас есть входящие данные из потока. Используйте его часть для

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

4. Постепенная проверка. Предположим, что у вас есть обучающий набор размером с mtrain и тестовый набор размером с mpv. Прогрессивная проверка начинается с того, что обучающий набор изучает модель, а затем проверяет ее на первом примере тестового набора. Затем мы тестируем второй пример тестового набора и тренируемся на обучающем наборе плюс первый пример тестового набора. Операция повторяется для итераций mtest.

Пакет river содержит реализацию прогрессивной проверки.

ПРИМЕЧАНИЕ. Стратегия оценки отличается от показателей

3. Классификатор дерева Хёффдинга:

Самая большая проблема при разработке пошагового алгоритма на основе дерева решений заключается в том, что у нас нет доступа ко всем данным сразу. При потоковой передаче данных стоимость хранения данных и последующей загрузки их в память для обучения алгоритма будет очень высокой. Мы получаем только один проход по данным, как мы обсуждали в задачах добавочного обучения в части 1 серии. Эта невозможность не передавать данные более одного раза приводит к проблеме определения наилучшего атрибута разделения. В деревьях решений пакетного обучения (таких как ) мы можем выбрать наилучшее разделение после того, как разделение будет выполнено по различным атрибутам, и лучший из них выбирается на основе выбранных критериев (индекс Джини и т. д.). Для решения этой проблемы в статье Добыча высокоскоростных потоков данных было представлено дерево Хоффединга или алгоритм очень быстрого дерева решений (VFDT), в котором вместо использования ранее использованных экземпляров алгоритм ожидает поступления новых. Основное предположение о данных, которые делает VFDT, состоит в том, что данные не меняются с течением времени, и это помогает в построении дерева Хёффдинга. Алгоритм исходит из того, что небольшого размера выборки обычно достаточно для определения наилучшего атрибута разделения. Статистический результат, известный как граница Хёффдинга, поддерживает эту теорию. При преобразовании листа дерева в узел дерева VFDT использует границу Хёффдинга для накопления адекватной статистики новых входящих наблюдений в потоке данных.

Граница Хеффдинга утверждает (с вероятностью 1–£), что после n независимых наблюдений действительнозначной случайной величины x с диапазоном R истинное среднее значение x равно не менее µ − €, где µ – наблюдаемое среднее значение случайная величина x и €. Где € имеет следующее значение.

Алгоритм классификатора дерева Хёффдинга выглядит следующим образом:

4. ПРАКТИЧЕСКАЯ РАБОТА с рекой для классификатора дерева Хёффдинг:

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

а. благодатный_период: количество экземпляров, которые лист должен наблюдать между попытками разделения.
b. номинальные_атрибуты: список идентификаторов номинальных атрибутов. Если пусто, предполагается, что все числовые атрибуты должны рассматриваться как непрерывные.
c. split_confidence: Допускается ошибка в разделенном решении, значение ближе к 0 требует больше времени для принятия решения.

from river import synth
from river import evaluate
from river import metrics
from river import tree
gen = synth.Agrawal(classification_function=0, seed=42)
# Take 1000 instances from the infinite data generator
# The dataset object will have the data in form of streaming data
dataset = iter(gen.take(1000))
model = tree.HoeffdingTreeClassifier(grace_period=100,
split_confidence=1e-5,
nominal_attributes=['elevel', 'car', 'zipcode']
)
# We will use the accuracy metric to check  
metric = metrics.Accuracy()
# We evaluate our model using the Progressive Validation method
evaluate.progressive_val_score(dataset, model, metric)
# OUTPUT
# Accuracy: 83.78%

5. Чрезвычайно быстрый классификатор дерева решений:

Чрезвычайно быстрый классификатор дерева решений также называется классификатором Hoeffding AnyTime Tree (HATT). EFDT работает аналогично дереву Хёффдинга, однако разница заключается в том, как они делятся в узлах. Дерево Хеффдинга откладывает разбиение в узле до тех пор, пока не будет найдено наилучшее разбиение, а затем не принимает никаких дальнейших решений. Дерево Hoeffding Anytime Tree разбивается на узле, как только оно кажется целесообразным, и возвращается к нему, если становится доступным лучшее разделение. Дерево Hoeffding Anytime Tree не так быстро, как дерево Hoeffding с точки зрения обработки, но быстрее с точки зрения статистики. Ниже приведен псевдокод для чрезвычайно быстрого классификатора дерева решений.

6. ПРАКТИЧЕСКАЯ РЕКА для Чрезвычайно быстрого классификатора дерева решений:

Ниже приведен код для EFDT, реализованный с рекой. У нас все то же, что и в предыдущем примере: классификатор дерева Хеффдинга (набор данных, метрики и стратегия оценки), но вместо классификатора дерева Хеффдинга мы используем чрезвычайно быстрый классификатор дерева решений.

from river import synth
from river import evaluate
from river import metrics
from river import tree
gen = synth.Agrawal(classification_function=0, seed=42)
# Take 1000 instances from the infinite data generator
dataset = iter(gen.take(1000))
model = tree.ExtremelyFastDecisionTreeClassifier(grace_period=100, split_confidence=1e-5, nominal_attributes=['elevel', 'car', 'zipcode'], min_samples_reevaluate=100)
metric = metrics.Accuracy()
evaluate.progressive_val_score(dataset, model, metric)
Accuracy: 87.89%

В заключение мы видим, что классификатор чрезвычайно быстрого дерева решений дает относительно лучшие результаты, чем деревья Хоффеддинга.

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

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

Спасибо за чтение, это все для этой статьи. Больше контента, чтобы следовать. Пожалуйста, хлопайте в ладоши, если статья была вам полезна, и оставьте комментарий, если у вас есть какие-либо вопросы. Если вы хотите связаться со мной, учиться и расти вместе со мной или сотрудничать, вы можете связаться со мной любым из следующих способов:

Linkedin:- https://www.linkedin.com/in/virajdatt-kohir/
Twitter:- https://twitter.com/kvirajdatt
GitHub:- https:/ /github.com/Virajdatt
GoodReads:- https://www.goodreads.com/user/show/114768501-virajdatt-kohir

:) :):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)

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

  1. https://www.cms.waikato.ac.nz/~abifet/book/chapter_6.html
  2. https://riverml.xyz/dev/api/tree/HoeffdingTreeClassifier/
  3. https://riverml.xyz/dev/api/synth/Hyperplane/
  4. https://riverml.xyz/dev/api/synth/Agrawal/#fnref2:1
  5. https://hunch.net/~jl/projects/prediction_bounds/thesis/mathml/thesisse44.xml
  6. https://riverml.xyz/0.11.0/api/evaluate/progressive-val-score/#examples
  7. https://riverml.xyz/dev/api/tree/ExtremelyFastDecisionTreeClassifier/