Веса классов в 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. Для обращений полезно сопоставить долю найденных аварийных случаев и число ложных тревог. Порог решения и допустимую нагрузку на оператора выбирают по своей задаче.
Проверяйте, какой показатель изменился и почему. Веса помогают задать приоритет обучения; принять модель можно только после проверки ошибок нужного класса.
Комментарии
Войдите, чтобы оставить комментарий
Пока нет комментариев. Начните обсуждение.