Преодоление дисбаланса классов в машинном обучении: Как использовать взвешенную бинарную кросс-энтропию в Keras для достижения максимальной точности моделей
В современной обработке данных и машинном обучении одна из наиболее актуальных проблем — это дисбаланс классов в бинарной классификации. Дисбаланс возникает, когда количество примеров одного класса значительно превышает количество примеров другого. Это может привести к тому, что машина обучится предсказывать в основном больший класс, игнорируя меньший, что существенно снижает эффективность модели на практике. В этой статье мы рассмотрим, как применять взвешенную бинарную кросс-энтропию (Weighted BCE) в Keras для справедливой оценки обоих классов.
Понимание BCE Loss
Бинарная кросс-энтропия — популярный метод оценки ошибок в задачах бинарной классификации. Эта метрика измеряет расхождение между истинным значением и предсказанными вероятностями. Формула BCE учитывает вероятности принадлежности к классу 1 или 0, и чем больше расхождение, тем выше значение потерь. Однако данный метод может быть неэффективен при дисбалансе классов, так как меньший класс может быть плохо представлен в обучающем наборе данных, что приводит к его недооценке моделью.
Взвешенная BCE Loss в Keras
Использование sample_weight
Одним из способов устранения дисбаланса классов при обучении модели является использование параметра sample_weight. Этот параметр позволяет задать индивидуальные веса для каждого образца в данных, усиливая или ослабляя их вклад в функцию потерь.
Пример кода:
from keras.models import Sequential
from keras.layers import Dense
from keras.losses import BinaryCrossentropy
import numpy as np
y_true = np.array([0, 1, 0, 0]) # Истинные метки
y_pred = np.array([0.6, 0.3, 0.2, 0.8]) # Предсказанные вероятности
class_weights = np.array([0.5, 7.4]) # Задаем веса для классов
model = Sequential()
model.add(Dense(1, activation='sigmoid', input_shape=(1,)))
bce_loss = BinaryCrossentropy()
model.compile(optimizer='adam', loss=bce_loss)
sample_weights = np.where(y_true == 1, class_weights[1], class_weights[0])
model.fit(y_pred, y_true, sample_weight=sample_weights, epochs=10)
Создание пользовательской функции потерь
Для более тонкой настройки можно написать свою функцию потерь, что позволит внести коррективы в расчет потерь с учетом весов классов:
import tensorflow as tf
from tensorflow.keras import backend as K
def weighted_binary_crossentropy(weights):
def loss(y_true, y_pred):
bce = K.binary_crossentropy(y_true, y_pred)
weight_vector = y_true * weights[1] + (1 - y_true) * weights[0]
weighted_bce = weight_vector * bce
return K.mean(weighted_bce)
return loss
class_weights = [0.5, 7.4] # Веса для классов
model = Sequential()
model.add(Dense(1, activation='sigmoid', input_shape=(1,)))
weighted_bce = weighted_binary_crossentropy(class_weights)
model.compile(optimizer='adam', loss=weighted_bce)
model.fit(X_train, y_train, epochs=10)
Расчет весов для классов
Определение весов классов может быть основано на их распределении в данных. Это помогает уравновесить влияние классов в функции потерь, что особенно важно при значительном дисбалансе:
no_class_count = 480473341 # Примеры без класса
class_count = 3279159 # Примеры с классом
total_samples = no_class_count + class_count
no_class_weight = total_samples / (2 * no_class_count)
class_weight = total_samples / (2 * class_count)
class_weights = [no_class_weight, class_weight]
Использование BinaryFocalCrossentropy
Дополнительным методом решения проблемы дисбаланса служит использование функции потерь BinaryFocalCrossentropy, которая помимо взвешивания также фокусируется на трудных для классификации примерах:
from keras.losses import BinaryFocalCrossentropy
model = Sequential()
model.add(Dense(1, activation='sigmoid', input_shape=(1,)))
bce_loss = BinaryFocalCrossentropy(from_logits=False, gamma=2)
model.compile(optimizer='adam', loss=bce_loss)
model.fit(X_train, y_train, epochs=10)
Здесь параметр gamma помогает усилить внимание на примерах, которые модель обычно предсказывает неверно, увеличивая их вес в функции потерь.
Различные подходы к взвешиванию потерь в Keras предоставляют мощные инструменты для балансировки классов и улучшения общей точности моделей в условиях дисбаланса. Это ключ к созданию эффективных и справедливых моделей машинного обучения.
Подпишитесь на наш Telegram-канал
Практический аспект: реализация на реальных данных
Важно понимать, что теоретические аспекты взвешивания классов необходимо адаптировать к условиям реальных данных. В зависимости от специфики задачи и характеристик датасета, параметры взвешивания могут требовать тщательной настройки и тестирования.
Тестирование и валидация модели
Независимо от выбранного метода обучения модели, критически важным является этап тестирования. После того как модель обучена с использованием взвешенной функции потерь, необходимо оценить её способность правильно классифицировать новые, ранее не виденные данные. Особое внимание следует уделить метрикам, таким как точность, полнота и F1-мера для обоих классов.
Для валидации модели используйте разделенные на начальном этапе тестовые данные. Это позволит увидеть, насколько эффективно модель справляется с дисбалансом классов в “дикой природе”.
Примеры применения на реальных данных
Рассмотрим пример из медицинской отрасли, где дисбаланс классов часто встречается, например, при диагностировании редких заболеваний. В таких случаях, правильное взвешивание классов может значительно повысить точность предсказаний модели, уменьшая число ложноположительных и ложноотрицательных результатов.
В другом примере, в финансовой аналитике для обнаружения мошенничества с кредитными картами, большинство транзакций будет нормальным, а мошеннические операции — редким исключением. Здесь взвешенная BCE потеря может помочь модели эффективно распознавать редкие случаи мошенничества, предостерегая институты от значительных финансовых потерь.
Заключение
Имплементация взвешенной бинарной кросс-энтропии в Keras представляет собой мощный инструмент для балансировки обучения моделей в условиях дисбаланса классов. Она не только улучшает общую точность модели, но и обеспечивает более справедливую оценку обоих классов, что критически важно во многих прикладных областях.
Применение различных методов, от простых весов классов до более сложных фокальных потерь, позволяет разработчикам гибко настраивать модели под специфику имеющихся данных. В конечном итоге, правильно настроенные веса значительно повышают качество моделирования, делая машинное обучение более эффективным инструментом в решении реальных задач.
Для более глубокого изучения данной темы и ознакомления с дополнительными примерами и методиками вы можете обратиться к следующим ресурсам:
- Официальная документация Keras по BinaryCrossentropy
- Официальная документация TensorFlow по BinaryFocalCrossentropy
Использование данных методов поможет в создании надежных и точных предсказательных моделей, способных справляться с дисбалансом классов и улучшать результаты во многих областях применения.
Подпишитесь на наш Telegram-канал









