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

Увеличение данных

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

Увеличение данных для изображений

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

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

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

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

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

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

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

mixup_image = t × image1 + (1 − t) × image2,
где t – действительное число от 0 до 1. Целью этого смешанного изображения является комбинация исходных целей, полученных с использованием одного и того же значения t:

mixup_target = t × target1 + (1 − t) × target2.

Эксперименты9 с наборами данных ImageNet-2012, CIFAR-10 и несколькими другими показали, что смешение улучшает обобщение моделей нейронных сетей. Авторы смеси также обнаружили, что она повышает устойчивость к состязательным примерам и стабилизирует обучение генеративно-состязательных сетей (GAN).

В дополнение к методам, показанным на рис. 3.14, если вы ожидаете, что входные изображения в вашей производственной системе будут сжаты сверх меры, вы можете имитировать сверхсжатие, используя некоторые часто используемые методы сжатия с потерями и форматы файлов, такие как JPEG или GIF.

Только обучающие данные подвергаются дополнению. Конечно, генерировать все эти дополнительные примеры заранее и хранить их нецелесообразно. На практике методы увеличения данных применяются к исходным данным «на лету» во время обучения.

Увеличение данных для текста

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

  • Замена случайных слов в предложении их близкими синонимами. Для предложения «Машина остановилась возле торгового центра». некоторые эквивалентные предложения:

«Автомобиль остановился возле торгового центра».

«Машина остановилась возле торгового центра».

«Автомобиль остановился возле торгового центра».

  • Аналогичный метод использует гиперонимы вместо синонимов. Гипероним – это слово, имеющее более общее значение. Например, «млекопитающее» — это гипероним слов «кит» и «кошка»; «транспортное средство» — это гипероним слов «автомобиль» и «автобус». Из нашего примера выше мы могли бы создать следующие предложения:

«Автомобиль остановился возле торгового центра».

«Машина остановилась возле здания».

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

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

  • Другой полезный метод увеличения текстовых данных — обратный перевод. Чтобы создать новый пример из текста, написанного на английском языке (это может быть предложение или документ), сначала переведите его на другой язык l с помощью системы машинного перевода. Затем переведите его обратно с lна английский язык. Если текст, полученный с помощью обратного перевода, отличается от исходного текста, вы добавляете его в набор данных, назначая ту же метку, что и исходный текст.

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

Работа с несбалансированным набором данных

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

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

Хотя формального определения несбалансированных данных не существует, примите во внимание следующее практическое правило. Если есть два класса, то сбалансированные данные будут означать половину набора данных, представляющего каждый класс. Небольшой дисбаланс классов обычно не является проблемой. Если класс A ➡️ 60% примеров, класс B ➡️ 40% примеров, то использовать популярный алгоритм машинного обучения в его стандартной постановке, он не должен вызывать существенного снижения производительности. Однако, когда дисбаланс классов выше, чем указано выше, использование стандартной формулировки алгоритма обучения, который обычно одинаково взвешивает ошибки, сделанные в обоих классах, может быть не столь эффективным и потребует модификации.

Одним из изменений в стандартной формулировке является добавление параметра веса. Если дисбаланс 80:20. Тогда вес ошибок класса с высокой выборкой равен 0,2, а с низкой выборкой — 0,8. Это решение может оказаться неэффективным для данных с более высоким номером. классов.

Решения классового дисбаланса:

Передискретизация/повышение дискретизации

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

SMOTE и ADASYN во многом работают одинаково. Для данного примера xi класса меньшинства они выбирают k ближайших соседей. Обозначим это множество из k примеров как Sk. Синтетический пример xnew определяется как xi + λ(xzi − xi), где xzi — это пример класса меньшинства, выбранного случайным образом из Sk. Гиперпараметр интерполяции λ представляет собой произвольное число в диапазоне [0, 1]. (См. иллюстрацию для λ = 0,5 на рисунке 2.)

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

from imblearn.over_sampling import SMOTE
from sklearn.datasets import make_classification

# Generate example data
X, y = make_classification(n_classes=2, class_sep=2,
                           weights=[0.1, 0.9], n_informative=3,
                           n_redundant=1, flip_y=0, n_features=20,
                           n_clusters_per_class=1, n_samples=1000,
                           random_state=10)

# Apply SMOTE
smote = SMOTE(sampling_strategy='auto')
X_resampled, y_resampled = smote.fit_resample(X, y)

В этом примере мы генерируем синтетический набор данных, используя make_classification, что создает проблему бинарной классификации с размером класса меньшинства 10%. Затем мы применяем SMOTE, используя SMOTE из imblearn, с параметром sampling_strategy, установленным на «авто», что означает, что SMOTE изменит стратегию выборки, чтобы сбалансировать два класса. Наконец, мы подгоняем преобразователь SMOTE к данным и передискретизируем данные, чтобы создать новый набор сбалансированных выборок в X_resampled и y_resampled.

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

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

Недостаточная выборка может быть выполнена случайным образом; то есть примеры, которые следует удалить из класса большинства, могут быть выбраны случайным образом. В качестве альтернативы примеры для выхода из класса большинства могут быть выбраны на основе некоторого свойства. Одним из таких свойств являются ссылки Tomek. Связь Tomek существует между двумя примерами xi и xj, принадлежащими к двум разным классам, если в наборе данных нет другого примера xk, более близкого к либо xi, либо xj, чем последние два относятся друг к другу. Близость можно определить с помощью такой метрики, как косинусное сходство или евклидово расстояние.

На рис. 3 видно, как удаление примеров из класса большинства на основе ссылок Tomek помогает установить четкую границу между примерами двух классов.

Вот пример использования Tomek Links с imblearn:

from imblearn.under_sampling import TomekLinks
from sklearn.datasets import make_classification

# Generate example data
X, y = make_classification(n_classes=2, class_sep=2,
                           weights=[0.1, 0.9], n_informative=3,
                           n_redundant=1, flip_y=0, n_features=20,
                           n_clusters_per_class=1, n_samples=1000,
                           random_state=10)

# Apply Tomek Links
tomek = TomekLinks()
X_resampled, y_resampled = tomek.fit_resample(X, y)

Подобно примеру кода для SMOTE, он генерирует данные точно так же. Затем мы применяем ссылки Tomek, используя TomekLinks из imblearn. Наконец, мы подгоняем преобразователь Tomek Links к данным и делаем предварительную выборку данных, чтобы создать новый набор сбалансированных выборок в X_resampled и y_resampled.

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

from imblearn.under_sampling import ClusterCentroids
from sklearn.datasets import make_classification

# Generate example data
X, y = make_classification(n_classes=2, class_sep=2,
                           weights=[0.1, 0.9], n_informative=3,
                           n_redundant=1, flip_y=0, n_features=20,
                           n_clusters_per_class=1, n_samples=1000,
                           random_state=10)

# Apply ClusterCentroids
cc = ClusterCentroids(random_state=0)
X_resampled, y_resampled = cc.fit_resample(X, y)

Подобно примеру кода для SMOTE, он генерирует данные точно так же. Затем мы применяем недостаточную выборку на основе кластера, используя ClusterCentroids из imblearn. Наконец, мы подгоняем преобразователь ClusterCentroids к данным и делаем предварительную выборку данных, чтобы создать новый набор сбалансированных выборок в X_resampled и y_resampled.

3.9.3 Гибридные стратегии

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

Другая возможная стратегия состоит в объединении недостаточной выборки на основе кластера с SMOTE.

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

Краткое содержание:

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

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

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

Оставайтесь с нами😀 до следующего раза.