Перейти к содержимому
НейроКуб
Открытый материал · 2 мин
Марк Суть

Веса классов в Keras изменили loss, а accuracy — нет. Где искать причину

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

В Keras веса классов могут изменить обучение, не изменив способ подсчёта accuracy. Причина в двух разных настройках: class_weight задаёт вклад примеров в функцию потерь, а метрики из обычного списка metrics не учитывают веса примеров.

Разделите обучение и измерение

В руководстве Keras class_weight — словарь от индекса класса к весу. Он позволяет усилить влияние редкой категории без повторного добавления её объектов в набор. sample_weight задаёт вес каждого примера отдельно; для входного Dataset веса передаются третьим элементом вместе с входами и метками.

Условный пример: из ста обращений девяносто обычных и десять аварийных. Модель, всегда выбирающая обычный класс, получает 90% accuracy, хотя не находит ни одного аварийного обращения. Это арифметический пример, а не результат обучения. Повышая вес аварийных объектов, вы меняете штраф за ошибки, но не превращаете общую точность в оценку качества редкого класса.

Минимальная проверка настройки

Согласно API обучения взвешенные метрики задают через weighted_metrics. Для уже созданной бинарной модели с выходом-вероятностью и метками 0/1 настройка может выглядеть так:

model.compile(
    optimizer="adam",
    loss="binary_crossentropy",
    metrics=[keras.metrics.BinaryAccuracy(name="acc")],
    weighted_metrics=[
        keras.metrics.BinaryAccuracy(name="weighted_acc")
    ],
)
model.fit(x_train, y_train, class_weight={0: 1.0, 1: 9.0})

Девятка здесь — условный выбор для пропорции 90 к 10, а не универсальный рецепт. Обычная acc остаётся невзвешенной; weighted_acc учитывает переданные веса. Одинаковые значения ещё не означают ошибку: при конкретном наборе предсказаний обе оценки могут совпасть.

Проверьте соответствие индексов реальным меткам. Если аварийным случаям соответствует ноль, усиление класса 1 решит другую задачу. Для одинакового сравнения сохраните разбиение, начальное состояние модели и параметры обучения; затем сопоставьте вариант без весов и вариант с весами.

Что смотреть на отложенных данных

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

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

Проверяйте, какой показатель изменился и почему. Веса помогают задать приоритет обучения; принять модель можно только после проверки ошибок нужного класса.

Комментарии

Пока нет комментариев. Начните обсуждение.