Русский
Русский
English
Статистика
Реклама

Nearmiss

Борьба с несбалансированностью классов с помощью модуля NEARMISS

11.06.2021 14:22:51 | Автор: admin

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

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

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

Давайте рассмотрим работу этого метода на практике. Для начала установим необходимые нам библиотеки через стандартный pip в cmd:

pip install pandaspip install numpypip install sklearnpip install imblearn

Я буду использовать набор данных о сессиях, связанных с поведением пользователей на веб-страницах онлайн-магазина.

import pandas as pdimport numpy as npdf = pd.read_csv('online_shoppers_intention.csv')df.shape

(12330, 18)

Столбец для прогнозирования называется Revenue и может принимать 2 значения: True (пользователь совершил покупку) и False (пользователь не совершил покупку). Посмотрим, какое количество наблюдений приходится на каждый из классов.

df['Revenue'].value_counts()

Как видно, классы являются несбалансированными, поскольку делятся примерно в соотношении 85% и 15%.

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

Y = df['Revenue']X = df.drop('Revenue', axis = 1)feature_names = X.columnsfrom sklearn.model_selection import train_test_splitX_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.3, random_state = 97)

Посмотрим на размерность сформированных наборов данных:

print('Размерность набора данных X_train: ', X_train.shape)print('Размерность набора данных Y_train: ', Y_train.shape)print('Размерность набора данных X_test: ', X_test.shape)print('Размерность набора данных Y_test: ', Y_test.shape)

Далее воспользуемся логистической регрессией и выведем отчёт с основными показателями классификации.

from sklearn.linear_model import LogisticRegressionlregress1 = LogisticRegression()lregress1.fit(X_train, Y_train.ravel())prediction = lregress1.predict(X_test)print(classification_report(Y_test, prediction))

Отметим, что точность модели 88%. Колонка recall показывает меру полноты классификатора, способность классификатора правильно находить все положительные экземпляры.Из неё видно, что отзыв миноритарного класса гораздо меньше, то есть модель более склонна к классу большинства.

Перед применением метода NearMiss выведем количество наблюдений каждого класса:

print('Перед применением метода кол-во меток со значением True: {}'.format(sum(y_train == True)))print('Перед применением метода кол-во меток со значением False: {}'.format(sum(y_train == False)))

Перед применением метода количество меток со значением True: 1334

Перед применением метода количество меток со значением False: 7297

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

from imblearn.under_sampling import NearMissnm = NearMiss()X_train_miss, Y_train_miss = nm.fit_resample(X_train, Y_train.ravel())print('После применения метода кол-во меток со значением True: {}'.format(sum(Y_train_miss == True)))print('После применения метода кол-во меток со значением False: {}'.format(sum(Y_train_miss == False)))

После применения метода количество меток со значением True: 1334

После применения метода количество меток со значением False: 1334

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

lregress2 = LogisticRegression()lregress2.fit(X_train_miss, Y_train_miss.ravel())prediction = lregress2.predict(X_test)print(classification_report(Y_test, prediction))

Значение отзывов меньшинства повысилось до 84%. Но из-за того, что выборка большего класса значительно уменьшилась, понизилась точность модели до 61%. Таким образом, этот метод действительно помог справиться с несбалансированностью классов.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru