Уверенная ошибка дороже: как читать log loss
Две модели дают одинаковые классы и одинаковую accuracy. Но первая оценивает вероятность настоящего нарушения в 40%, вторая — в одну десятую процента. Для вероятностного решения это разные ошибки, хотя порог превратил обе в один неверный ответ.
Оценивать вероятность до порога
В бинарной задаче log loss берёт минус логарифм вероятности истинного класса и усредняет по объектам. Чем меньше вероятность правильного ответа, тем больше наказание. Поэтому уверенная ошибка обходится дороже осторожной.
Accuracy учитывает только итоговую метку. При пороге 0.5 вероятности 0.4 и 0.001 дают один класс, но сохраняют разную информацию о риске. Вероятностная метрика полезна, когда прогнозы участвуют в ранжировании, расчёте ожидаемой стоимости или последующем выборе порога.
Проверить вклад отдельной строки
Два объекта имеют истинные метки 0 и 1. Обе модели правильно решают первый и ошибаются на втором. Отличается лишь уверенность в ошибке. Посчитаем accuracy и log loss средствами sklearn, затем восстановим потери отдельных строк через вероятность истинного класса.
Массив p содержит вероятность класса 1. Для класса 0 истинная вероятность равна 1-p. Эта ориентация должна быть подтверждена classes_ обученной модели, если вероятности получены через predict_proba.
import numpy as np
from sklearn.metrics import accuracy_score, log_loss
y = np.array([0, 1])
p_a = np.array([0.1, 0.4])
p_b = np.array([0.1, 0.001])
acc_a = accuracy_score(y, p_a >= 0.5)
acc_b = accuracy_score(y, p_b >= 0.5)
loss_a = log_loss(y, p_a, labels=[0, 1])
loss_b = log_loss(y, p_b, labels=[0, 1])
true_p_b = np.where(y == 1, p_b, 1 - p_b)
per_row_b = -np.log(true_p_b)
print({"accuracy": [acc_a, acc_b], "log_loss": [loss_a, loss_b],
"row_losses_B": per_row_b.tolist()})
assert acc_a == acc_b == 0.5
assert loss_b > loss_a
assert np.isclose(loss_b, per_row_b.mean())Accuracy обеих моделей равна 0.5. Log loss B значительно выше из-за второго объекта. Вклад каждой строки показывает, где именно вероятностная оценка провалилась, и даёт id для проверки исходных признаков и разметки.
Проверить причину крупной потери
Уверенная ошибка может возникнуть из-за неверной метки, нового типа объекта или плохой оценки вероятности. Не удаляйте её автоматически как выброс: сначала восстановите вход и доступную на момент прогноза информацию. Для редких классов сохраните отдельные срезы и размеры выборок.
Нулевые и единичные вероятности требуют численной обработки: sklearn ограничивает их вблизи границ для вычисления логарифма. Это не превращает невозможный по прогнозу исход в безопасный. В примере все вероятности внутри диапазона, поэтому ручной расчёт совпадает без дополнительных оговорок.
Низкий log loss полезен, но не задаёт бизнес-порог и не заменяет матрицу ошибок. Две модели могут различаться по вероятностям и нагрузке очереди после выбранного порога. Сохраняйте оба слоя оценки.
Для сравнения версий используйте одни объекты и одно правило весов. Иначе изменение среднего наказания может отражать иной состав теста. Отдельная таблица крупных вкладов помогает выбрать следующий предметный эксперимент.
Закрепить на практике
В бесплатном уроке precision, recall и F1 вы отработаете оценку решений после порога. Затем сравните её с вероятностной потерей из статьи: одинаковые классы могут скрывать разную уверенность. Откройте бесплатный урок и задачи. Полная последовательность тем — в бесплатном курсе.
Продолжить на практике
- Машинное обучение с нуля на Python: первая модель ↗
Бесплатный курс машинного обучения на Python: обучите первую модель в scikit-learn, проверьте её качество и решите 106 задач в браузере.
