Пасо-проект

Балансировка и расширение структурированных данных

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

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

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

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

Краткий обзор пасо

Попутно мы познакомим вас с инструментами paso Class Balancing. Как было показано в предыдущей статье, paso поддерживает и совместим с текущими структурами машинного обучения и глубокого обучения. paso - это пакет, написанный на Python и немного C (для скорости), который изначально предназначался для объединения передовых практик и современных сервисов, классов и функций для машинного обучения и глубокого обучения. Обучающееся сообщество. paso расширился и предлагает декораторы, классы и методы, которые вы можете использовать в своих конвейерах или настраиваемом коде с или без принятия всего пакета paso.

Трубопровод состоит из ступеней. Каждый шаг преобразует входной набор данных. Шаг вернет измерение (или словарь измерений), выведет график или преобразованный набор данных. Примечание. Он отличается, но совместим с конвейером Scikit - Learn.

Paso в настоящее время предлагает следующие классы: Inputer, Splitters, Cleaners, Encoders, Scaler, Balancers, Augmenters и Learners. Все классы обеспечивают ведение журнала, файлы описания и контрольные точки. Последний класс, Learners, реализует методы: обучение, прогнозирование, оценка, перекрестная проверка и оптимизация гиперпараметров.

Обсуждение будет разделено на следующие основные сегменты:

  • Сначала мы загружаем несбалансированный набор данных класса с помощью paso Inputer.
  • Во-вторых, я рассмотрю некоторые методы балансировки классов, предлагаемые в paso.
  • Затем я покажу, что некоторые из расширений структурированных данных, предлагаемых в paso, являются производными от методов балансировки классов.
  • Затем я намекаю, что эти методы могут быть неадекватными не только для балансировки увеличения структурированных данных.
  • Наконец, я завершаю эту статью разделом «Обсуждение» и «Резюме».

Как обычно, исходный код всех примеров, отобранных в этой статье, также доступен в виде одной полной записной книжки (ipynb).



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

from paso.base import Paso,Log,PasoError
from loguru import logger
session = Paso(parameters_filepath='../parameters/default-lesson.3.yaml').startup()

Набор данных: дрожжи3

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

Я выбрал набор yeast3dataset, который изучается биологами и учеными с конца 1990-х годов. Он загружается с https://sci2s.ugr.es/keel/imbalanced.php.

Мы загружаем набор данных yeast3 в фрейм данных набора данных. Класс пространственных объектов будет содержать значения класса.

Особенности этого набора данных:

Класс: прогнозируемая, зависимая или целевая функция. Соотношение 0-го класса к 1-му классу составляет 8: 1.

Mcg: метод МакГеока для распознавания сигнальной последовательности.

Gvh: метод фон Хейне для распознавания сигнальной последовательности.

Alm: оценка программы прогнозирования области, охватывающей мембрану, ALOM.

Mit: оценка дискриминантного анализа аминокислотного содержания N-концевой области (длиной 20 остатков) митохондриальных и немитохондриальных белков.

Erl: наличие подстроки «HDEL» (считается, что она действует как сигнал для удержания в просвете эндоплазматического ретикулума). Двоичный атрибут.

Pox: сигнал пероксисомного нацеливания на C-конце.

Vac: оценка дискриминантного анализа аминокислотного содержания вакуолярных и внеклеточных белков.

Nuc: оценка дискриминантного анализа сигналов ядерной локализации ядерного и неядерного белка.

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

Немного о файлах описания

Вместо использования аргументов ключевого слова, закрепленных в коде, я буду использовать файл описания. Одно рабочее определение описания (из Википедии):

«Показывая отношения между концепциями и категориями в предметной области или предметной области».

Мы используем файлы описания, потому что:

  • описание объекта (набор данных, модель и т. д.) изменяется без изменения кода;
  • Производительность синтаксического анализа файла описания и Python примерно одинакова, поскольку оба используют динамическую типизацию. В случае языка со статической типизацией проблем с производительностью, вероятно, не будет. Однако вычислительные ресурсы для анализа метаданных объекта очень малы по сравнению с действиями, выполняемыми экземпляром класса во всех случаях, с которыми до сих пор встречались.
  • Файл описания не зависит от языка. В настоящее время он отформатирован как файл YAML, но также может быть преобразован как файл JSON или XML.

Файлы описания состоят из иерархии пар ключ-значение. В будущей статье я подробно расскажу о файлах описания - различных файлах описания, которые можно просмотреть по адресу https://github.com/bcottman/paso/tree/master/descriptions.

Перед балансировкой очень важно разделить.

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

Проверка основывается на начальном наборе данных поезда в надежде, что это будет выборка прошлых и будущих данных, которые тестовый набор данных извлекает из остатка обучающего набора. В этом случае наш набор проверки обозначается как X_test, y_test. Другая ситуация, когда выполняется обучение, валидация и тестирование из исходного набора данных, заключается в разделении исходного набора данных для получения набора данных поезда и набора данных проверки. Затем снова разделитесь в поезде, чтобы пройти тренировку и проверить. Порядок не имеет значения, если второе разбиение также находится в наборе данных поезда. Здесь обучающий набор будет составлять 70%, а набор для проверки (тестирования) будет составлять 30% от исходного набора данных.

X, y = DataFrame_to_Xy(dataset, inputer.target)
splitter = Splitters(description_filepath=splitter_file)
X_train,X_test, y_train, y_test = splitter.transform(X, y,random_state=11)
train = X_train.copy()
Xy_to_DataFrame(train, y_train, inputer.target)
train.groupby([inputer.target]).count()

Использование ученика RandomForest

Прежде чем сбалансировать класс, давайте запустим программу обучения RandomForest с универсальными гиперпараметрами классификации (показанными выше в файле описания для RadomForest) в yeast3dataset.

from paso.learners.learners import Learners
learner = Learners(description_filepath=learner_file)
learner.train(X_train,y_train)
learner.cross_validate(X_train,y_train,description_filepath=cv_file)learner.evaluate(X_test, y_test)

Это довольно хорошо сочетается с f1 из 0.8207. Что происходит, когда мы балансируем класс 1 с классом 0 за счет передискретизации?

Коротко о перекрестной проверке

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



и подробное обсуждение перекрестной проверки в:



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

Класс paso для работы с несбалансированными классами



«Учимся на несбалансированных данных.
В этом сообщении блога я рассмотрю ряд соображений и методов работы с несбалансированными данными, когда… www.jeremyjordan. меня"



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



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

методы отбора проб работают по-разному при разных уровнях дисбаланса.

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

  1. Вес назначение: эти различные методы придают больший вес классам меньшинств и меньшему - классам большинства. В набор данных не добавляется никакой реальной информации. Вместо этого это регулирование разными классами. Мы не встречали случаев, когда это было бы лучше, чем другие, за исключением случаев, когда достигается крайняя недостаточная дискретизация или избыточная дискретизация .
  2. Выброс устранение: после кластерного анализа удалите точки данных, наиболее удаленные от центроида и за пределами кластера. Удаление Datapoint должно выполняться под наблюдением человека (т.е. вручную). Например, зарплата в 2000000 долларов в год, вероятно, является реальной точкой отсчета основного распределения, тогда как длина паука в 50 метров, вероятно, неверна. Некоторые утверждают, что не следует удалять всю строку, а вместо этого ложное значение заменяется чем-то более разумным, например, медианным или средним. В любом случае устранение приводит к снижению информативности.
  3. Недостаточная выборка. Члены большинства классов уменьшаются с помощью различных стратегий выборки. Недостаточная выборка обычно является одним из худших подходов, поскольку объем данных в наборе данных уменьшается. Опять же, потеря информации, в которую большинство моделей вписывается, хуже с уменьшением данных. Вы также должны быть осторожны с недостаточной подгонкой, которая, когда набор обучающих данных (с неполной выборкой) никогда не имеет лучшей метрики потерь, чем набор данных проверки или тестирования.
  4. Передискретизация. Члены меньшинств увеличиваются за счет различных стратегий генерации синтетических данных. SMOTE (Техника передискретизации синтетического меньшинства) и ADASYN ( Адаптивная синтетическая) являются наиболее известными в категории передискретизации. . Передискретизация обычно является одним из лучших подходов, поскольку количество выборок увеличивается. Все модели лучше подходят с увеличением данных. Однако было бы лучше, если бы вы были осторожны с переобучением. Переобучение происходит, когда набор обучающих данных (с избыточной выборкой) имеет лучшую метрику потерь, чем набор данных проверки или тестирования.

Предупреждение.
Только SMOTEC может балансировать наборы данных с категориальными функциями.
Все остальные примут набор данных только с непрерывными функциями.

Приведены следующие методы передискретизации:

  • RandomeOverSample
  • SMOTE
  • ADASYN
  • BorderLineSMOTE
  • SVSMOTE
  • SMOTENC

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

Приведены следующие методы недостаточной выборки:

  • RandomUnderSample
  • ClusterCentroids
  • различные версии SMOTE
  • ADASYN

Методы исключения выбросов (приводящие к недостаточной выборке):

  • NearMiss
  • EditedNearestNeighbour
  • CondensedNearestNeighbour

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

Все доступные стратегии баланса классов показаны с помощью:

from paso.pre.cleaners import Balancers
class_balancer = Balancers(description_filepath=balancer_file)
o.classBalancers()

Я собираюсь увеличить выборку классов меньшинств, используя SMOTE. Рекомендую прочитать,



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

balancer = Balancers(description_filepath=balancer_file)
X_train,y_train = balancer.transform(X_train,y_train)
train = X_train.copy()
Xy_to_DataFrame(train, y_train, inputer.target)
train.groupby([inputer.target]).count()

from paso.learners.learners import Learners
learner = Learners(description_filepath=learner_file)
learner.train(X_train,y_train)
learner.cross_validate(X_train,y_train,description_filepath=cv_file)learner.evaluate(X_test, y_test)

Обратите внимание, что с классом, уравновешивающим ложноположительный результат для бывшего меньшинства, класс 1 снизился с 21 до 15 (хорошо) (как показано в матрице путаницы). В то время как класс бывшего большинства увеличился с 6 до 9 (плохо). Что еще более важно, f1 увеличилось до 0.8356 иlogloss уменьшилось до 0.1346. Похоже, что балансировка SMOTEклассов помогла нам подобрать yeast3 набор данных.

Дополните yeast3 dataset

Теперь мы можем дополнить (увеличить на 100% объем данных) синтетическими данными, сгенерированными методом дисбаланса классов с помощью SMOTE. Результат аналогичен увеличению изображения в том, что мы выполнили увеличение структурированных данных, увеличив количество строк в theyeast3dataset с синтетическими данными.

from paso.pre.cleaners import Augmenters
augmenter = Augmenters(description_filepath=balancer_file)
ratio = 1.0
X_augment,y_augment = augmenter.transform(X_train,y_train,ratio=ratio, verbose=True)
_, _, occurCount = np.unique(
    y_augment, return_index=True, return_counts=True
)
occurCount

learner = Learners(description_filepath=learner_file,target=inputer.target)
learner.train(X_augment,y_augment )
learner.cross_validate(X_augment,y_augment ,description_filepath=cv_file)
learner.evaluate(X_test, y_test)

Передискретизация данных с использованием кластерной выборки SMOTE в лучшем случае неоднозначна. И logloss, и f1 увеличились! Это указывает на то, что кластеры yeast3 не имеют круглую форму, требуемую SMOTE.Next, я буду дополнительно увеличивать набор данных, используя SMOTE три раза, каждый раз удваивая количество строк набора данных. График logloss по сравнению с количеством строк и f1показывает:

Выводы и резюме

Я не могу утверждать, что SMOTE не генерирует хорошие псевдоданные. Для этого нам нужно оптимизировать гиперпараметры учащегося для каждого дополнения, посмотреть на форму данных с помощью PCA и кластерного анализа, попробовать разных учащихся и попробовать разные аугментеры данных, помимо SMOTE. Я сделаю это во второй части статьи.

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

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

Другие статьи о paso:



В следующих статьях я более подробно расскажу о пасо:

  • Дополнение структурированных данных другими методами дополнения.
  • и более

Если у вас есть услуга или функция или вы видите ошибку, оставьте проект paso в виде примечания.

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

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