Эта статья была опубликована в рамках Блогатона по науке о данных.
Введение:
В реальном мире данные, которые мы собираем, большую часть времени будут сильно несбалансированными. Итак, что такое несбалансированный набор данных? Обучающие выборки неравномерно распределены по целевым классам. Например, если мы возьмем случай с классификацией личных кредитов, получить данные «не утверждено» не составит труда, в отличие от «утвержденных» деталей. В результате модель более предвзято относится к классу, который имеет большое количество обучающих экземпляров, что снижает способность модели прогнозировать.
Это также приводит к увеличению ошибок типа II в случае типичной задачи бинарной классификации. Этот камень преткновения не ограничивается только моделями машинного обучения, но также преимущественно наблюдается в области компьютерного зрения и НЛП. С этими проблемами можно эффективно справляться, используя разные методы для каждой области соответственно.
Примечания. В этой статье дается краткий обзор различных доступных методов увеличения данных, не вдаваясь в технические подробности. Все представленные здесь изображения взяты с Kaggle.
Оглавление
- Машинное обучение — несбалансированные данные (повышение и понижение частоты дискретизации)
- Компьютерное зрение — несбалансированные данные (увеличение данных изображения)
- НЛП — несбалансированные данные (гугл транс и весовые коэффициенты классов)
(1). Машинное обучение — несбалансированные данные:
Два основных метода, которые используются для устранения дисбаланса классов, — это апсемплинг/передискретизация и даунсэмплинг/недостаточная дискретизация. Процесс выборки применяется только к обучающему набору, и никакие изменения не вносятся в данные проверки и тестирования. Библиотека Imblearn на python пригодится для повторной выборки данных.
Повышение дискретизации – это процедура, при которой синтетически сгенерированные точки данных (соответствующие классу меньшинства) вводятся в набор данных. После этого процесса количество обеих меток почти одинаково. Эта процедура выравнивания предотвращает склонение модели к мажоритарному классу. Кроме того, взаимодействие (граница) между целевыми классами остается неизменным. Кроме того, механизм апсемплинга вносит в систему смещение из-за дополнительной информации.
мы можем взять задачу прогнозирования кредита Analytics Vidhya, чтобы объяснить шаги. Используемый здесь обучающий набор данных можно найти в ссылке на хакатон.
Все приведенные ниже коды можно полностью найти в репозитории GitHub.
SMOTE(SyntheticMinorityOversamplingTechnique) — апсемплинг:-
Это wo.
#import imblearn library from imblearn.over_sampling import SMOTENC oversample = SMOTENC(categorical_features=[0,1,2,3,4,9,10], random_state = 100) X, y = oversample.fit_resample(X, y)
Дублирование данных — повышающая дискретизация: при таком подходе существующие точки данных, соответствующие меткам, за которые проголосовали, выбираются случайным образом и дублируются.
from sklearn.utils import resample maxcount = 332 train_nonnull_resampled = train_nonnull[0:0] for grp in train_nonnull['Loan_Status'].unique(): GrpDF = train_nonnull[train_nonnull['Loan_Status'] == grp] resampled = resample(GrpDF, replace=True, n_samples=int(maxcount), random_state=123) train_nonnull_resampled = train_nonnull_resampled.append(resampled)
Понижающая выборка — это механизм, который уменьшает количество обучающих выборок, подпадающих под класс большинства. Так как это помогает уравнять количество целевых категорий. Удаляя собранные данные, мы, как правило, теряем так много ценной информации.
Tomek(T-Links):-
T-Link — это, по сути, пара точек данных из разных классов (ближайшие соседи). Цель состоит в том, чтобы отбросить выборку, которая соответствует
большинству, и, таким образом, свести к минимуму количество доминирующих меток. Это также увеличивает расстояние между двумя метками и, таким образом, повышает точность работы.
from imblearn.under_sampling import TomekLinks undersample = TomekLinks() X, y = undersample.fit_resample(X, y)
Центроид
На основе: Алгоритм пытается найти однородные кластеры в большинстве классов и сохраняет только центроид. Это уменьшит львиную долю мажоритарного лейбла. Он использует логику, используемую в кластеризации KMeans. Но много полезной информации теряется.
(2). Компьютерное зрение — несбалансированные данные:
Для неструктурированных данных, таких как изображения и вводимый текст, описанные выше методы балансировки не будут эффективны. В случае компьютерного зрения входными данными для модели является тензорное представление пикселей, присутствующих в изображении. Таким образом, просто случайное изменение значений пикселей (чтобы добавить больше входных записей) может полностью изменить смысл самого изображения. Существует концепция, называемая увеличением данных, когда изображение претерпевает множество преобразований, но сохраняет смысл нетронутым.
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img datagen = ImageDataGenerator( rotation_range=40, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest') img = load_img('images/0.jpg') x = img_to_array(img) x = x.reshape((1,) + x.shape) print(x.shape) # the .flow() command below generates batches of randomly transformed images # and saves the results to the `preview/` directory i = 0 for batch in datagen.flow(x, batch_size=1, save_to_dir='preview', save_prefix='vehichle', save_format='jpeg'): i += 1 if i > 19: break # otherwise the generator would loop indefinitely
Весь код вместе с предварительно обученной моделью можно найти в репозитории GitHub.
Ссылка может использоваться для подробного использования ImageDataGenerator.
(3). НЛП — несбалансированные данные:
Модели обработки естественного языка имеют дело с последовательными данными, такими как текст, движущиеся изображения, где текущие данные зависят от времени с предыдущими. Поскольку ввод текста относится к категории неструктурированных данных, мы по-разному обрабатываем такие сценарии. Например, если взять языковую модель классификации заявок, в которой ИТ-заявка должна быть отнесена к различным группам на основе последовательности слов, присутствующих во входном тексте.
Это один из полезных методов для увеличения числа групп меньшинств. Здесь мы переводим данное предложение на «неанглийский» язык, а затем снова переводим на «английский». Таким образом, важные детали входного сообщения сохраняются, но порядок слов / иногда новые слова с аналогичным значением вводятся в качестве новой записи и, таким образом, увеличивают количество недостаточного класса.
Введите текст — «предупреждение об использовании места на диске Windows» Дополненный данными текст — «Предупреждение об использовании места на диске Windows»
Несмотря на то, что значение приведенного выше предложения остается прежним, в него вводятся новые слова, что повышает обучаемость языковой модели за счет увеличения количества входных выборок.
Исполняемый ниже код можно найти в репозитории GitHub. Этот пример включает только один неанглийский код. Их много и весь список языковых кодов, которые можно использовать в гугл трансе, можно найти здесь.
from googletrans import Translatortranslator = Translator() def German_translation(x): print(x) german_translation = translator.translate(x, dest='de') return german_translation.text def English_translation(x): print(x) english_translation = translator.translate(x, dest='en') return english_translation.text x = German_translation("warning for using windows disk space") English_translation(x)
Веса классов. Второй вариант — использовать параметр весов классов в процессе подбора модели. Для каждого класса в цели назначается весовой коэффициент. Класс меньшинства получит больший вес по сравнению с большинством. В результате во время обратного распространения большая величина потерь связана с классом меньшинства, и модель будет уделять одинаковое внимание всем классам, присутствующим в выходных данных.
import numpy as np from tensorflow import keras from sklearn.utils.class_weight import compute_class_weight y_integers = np.argmax(raw_y_train, axis=1) class_weights = compute_class_weight('balanced', np.unique(y_integers), y_integers) d_class_weights = dict(enumerate(class_weights)) history = model.fit(input_final, raw_y_train, batch_size=32, class_weight = d_class_weights, epochs=8,callbacks=[checkpoint,reduceLoss],validation_data =(val_final, raw_y_val), verbose=1)
Первоначально опубликовано на https://www.coodingdessign.com 7 ноября 2020 г.