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

Проблемы с несбалансированными данными?

  • В то время как обучение модели приводит к тому, что модель склоняется к классу меньшинства, это означает, что наша модель будет очень хорошо изучать особенности нашего класса большинства и не сможет уловить особенности нашего класса меньшинства.
  • Оценка точности может вводить в заблуждение.

Способы обработки несбалансированного набора данных!

→ Соберите больше данных.

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

→ Используйте разные показатели производительности

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

Кривая ROC не должна использоваться для несбалансированных данных, поскольку это может интерпретировать неверный результат. Если модель хорошо работает с несбалансированными данными, мы должны использовать кривую точности-отзыва.
Потому что в кривой ROC-AUC частота ложных срабатываний (ложные срабатывания / общие реальные отрицательные результаты) не падает резко, когда общее реальное значение Минусов огромное количество. В то время как точность (истинные положительные / (истинные положительные + ложные положительные)) очень чувствительна к ложным срабатываниям и не зависит от большого общего реального отрицательного знаменателя.

→ Пробуем разные алгоритмы

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

→ Повторная выборка данных

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

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

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

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

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

import imblearn
from imblearn.over_sampling import RandomOverSampler
oversample = RandomOverSampler(sampling_strategy='minority')

X_over, y_over = oversample.fit_resample(X, y)

Перейдите по этой ссылке, чтобы узнать больше о функции передискретизации.

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

  1. Ограничением недостаточной выборки является то, что удаляются примеры из класса большинства, которые могут быть полезными, важными или, возможно, критическими для подбора надежной границы принятия решения.
  2. Этот подход может быть более подходящим для тех наборов данных, где есть дисбаланс классов, хотя достаточное количество примеров в классе меньшинства, такая полезная модель может быть подходящей.
import imblearn
from imblearn.over_sampling import RandomUnderSampler
undersample = RandomUnderSampler(sampling_strategy='minority')

X_under, y_under = undersample.fit_resample(X, y)

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

Создание синтетических образцов:

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

SMOTE - это метод передискретизации. Он работает путем создания синтетических образцов из второстепенного класса вместо создания копий.
Алгоритм выбирает два или более похожих экземпляра (используя мера расстояния) и возмущение экземпляра по одному атрибуту за раз на случайную величину в пределах разницы с соседними экземплярами.

from imblearn.over_sampling import SMOTE
sm = SMOTE(random_state = 123)
X_train_res,Y_train_res = sm.fit_sample(X,Y.ravel())

Назначение весов классов вручную:

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

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

Каждый алгоритм классификации имеет гиперпараметр, а именно «вес_класса».
По умолчанию, когда значение не передается, вес, присвоенный каждому классу, равен, например, 1.

  • Один из распространенных приемов - присвоение class_weight = "balance" при создании экземпляра алгоритма.
Logistic_model = LogisiticRegression(class_weight =
                                    "balanced").fit(x_train,y_train)
  • Другой способ - вручную присвоить веса различным меткам классов с использованием синтаксиса, такого как class_weight = {0: 2, 1: 1}. Классу 0 присвоен вес 2, а классу 1 - вес 1.
#class_weights = {class_label : weight}
class_weights = {0:2, 1:1}
Logistic_model = LogisiticRegression(class_weight =
                                 class_weights).fit(x_train,y_train)

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

from sklearn.model_selection import GridSearchCV
class_weight = np.linespace(0.05, 1.5, 20)
grid_para = {'class_weight' : [{0: x, 1: 1.0-x} for x in 
             class_weight]
gridsearch = GridSearchCV(estimator = LogisticRegression(),
                          param_grid = grid_para,
                          scoring = 'f1',
                          cv = 3)
gridsearch.fit(x_train, y_train)
print(gridsearch.best_params_)

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

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

ПРИВЕТСТВЕННОГО УЧЕНИЯ !!!!!

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

Также свяжитесь со мной в LinkedIn.