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

Понимание дисбаланса классов

Прежде чем мы углубимся в технику веса класса, давайте сначала поймем, что означает дисбаланс классов. В задаче классификации дисбаланс классов возникает, когда один класс имеет значительно больше выборок, чем другой класс (классы). Например, в задаче бинарной классификации, если класс A имеет 90 % выборок, а класс B — только 10 %, возникает проблема дисбаланса классов.

Почему важен дисбаланс классов

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

Использование весов классов для устранения дисбаланса классов

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

Шаги для реализации весов классов

  1. Поймите дисбаланс данных: проанализируйте распределение классов в вашем наборе данных и определите классы меньшинства и большинства.
  2. Рассчитать веса классов: Определите соответствующие веса классов на основе выбранной вами схемы взвешивания. Общие методы включают в себя равное взвешивание, обратную частоту классов или пользовательские веса, основанные на знании предметной области.
  3. Реализуйте веса классов в модели: отрегулируйте функцию потерь, чтобы включить веса классов во время компиляции модели. Большинство библиотек машинного обучения поддерживают эту функцию.
  4. Обучите модель: продолжайте обучение модели, используя взвешенную функцию потерь, которая придает большее значение классу меньшинства.
  5. Оцените результаты: после обучения оцените производительность модели на отдельном наборе проверок или тестов, обращая внимание на показатели для всех классов, чтобы обеспечить сбалансированную производительность.

Функция потерь логистической регрессии с весами классов

В логистической регрессии стандартная бинарная функция кросс-энтропийных потерь может быть изменена для включения весов классов. Предположим, у нас есть два класса, 0 и 1, с весами классов w_0 и w_1 соответственно. Модифицированная функция потерь может быть выражена следующим образом:

L(y, p) = -(w_0 * y * log(p) + w_1 * (1 - y) * log(1 - p))

Когда y = 0 (истинно отрицательный класс), потеря составляет -w_1 * log(p), где p – прогнозируемая вероятность для класса 1. Модель будет более наказана за неправильную классификацию положительного класса, когда w_1 выше, что помогает больше сосредоточиться на классе меньшинства.

Когда y = 1 (истинно положительный класс), потеря составляет -w_0 * log(1 — p), где 1 — p — это прогнозируемая вероятность для класса 0. Точно так же модель будет более наказана за неправильную классификацию отрицательного класса, когда w_0 выше.

Как получить веса классов (w_0 и w_1)

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

Метод обратной частоты класса

Метод обратной частоты класса вычисляет веса класса на основе количества выборок в каждом классе. Для задачи бинарной классификации с классами 0 и 1 формула вычисления весов классов выглядит следующим образом:

weight_0 = total_samples / (2 * class_0_samples)
weight_1 = total_samples / (2 * classtotal_samplessamples)

Где:

  • total_samples — общее количество выборок в наборе данных.
  • class_0_samples — количество выборок в мажоритарном классе (класс 0).
  • class_1_samples — количество образцов в классе меньшинства (класс 1).
  • 2 is the number of classes here.

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

import numpy as np

def calculate_class_weights(y):
    unique_classes, class_counts = np.unique(y, return_counts=True)
    total_samples = len(y)
    class_weights = {}

    for class_label, class_count in zip(unique_classes, class_counts):
        class_weight = total_samples / (2.0 * class_count)
        class_weights[class_label] = class_weight

    return class_weights

# Assuming 'y' contains the class labels (0s and 1s) for the binary classification problem
class_weights = calculate_class_weights(y)
print("Class weights:", class_weights)

В приведенном выше коде функция calculate_class_weights принимает массив y, содержащий метки классов (0 и 1) для задачи двоичной классификации. Затем он вычисляет веса классов, используя обратную формулу частоты классов, и возвращает словарь с весами для каждого класса. Переменная total_samples хранит общее количество выборок в наборе данных, а unique_classes и class_counts содержат уникальные метки классов и соответствующие им значения.

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

Реализация весов классов в логистической регрессии

Чтобы реализовать веса классов в логистической регрессии, вы можете использовать популярные библиотеки машинного обучения, такие как TensorFlow/Keras или Scikit-learn.

Использование весов классов в TensorFlow/Keras

from tensorflow.keras import models, layers

# Assuming you have calculated class_weights
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'], class_weight=class_weights)

Использование весов классов в Scikit-learn

from sklearn.linear_model import LogisticRegression

# Assuming you have calculated class_weights
logreg = LogisticRegression(class_weight=class_weights)

Последние мысли

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

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