Ответ
Log Loss (Binary Cross-Entropy) станет неопределённым (NaN или бесконечным), потому что его формула требует, чтобы предсказания p были в интервале (0, 1).
Формула Log Loss для одного примера:
L(y, p) = -[y * log(p) + (1 - y) * log(1 - p)]
Ключевая проблема: Аргумент логарифма p и (1-p) должен быть положительным. Умножение p на 2:
- Если исходное
p > 0.5, то новое2p > 1. Тогда(1 - 2p) < 0, иlog(1 - 2p)не определён для отрицательных чисел. - Если исходное
pбыло мало (например, 0.1), то2p = 0.2всё ещё валидно, но для другого примера сp=0.6получим1.2, что уже приводит к ошибке.
Практическая демонстрация:
import numpy as np
from sklearn.metrics import log_loss
# Истинные метки и исходные валидные предсказания
y_true = np.array([1, 0, 1, 0])
p_original = np.array([0.9, 0.1, 0.6, 0.4]) # Все в (0,1)
original_loss = log_loss(y_true, p_original)
print(f"Original Log Loss: {original_loss:.4f}") # ~0.283
# НЕПРАВИЛЬНО: умножение без нормализации
p_scaled_wrong = p_original * 2
print("Scaled predictions:", p_scaled_wrong) # [1.8, 0.2, 1.2, 0.8]
# Попытка вычисления приведет к предупреждениям и NaN, т.к. значения >1 и <0
try:
wrong_loss = log_loss(y_true, p_scaled_wrong)
except Exception as e:
print(f"Ошибка: {e}") # На практике будет warning и NaN
Что если нормализовать? Если после умножения на 2 применить преобразование, возвращающее значение в [0,1] (например, сигмоиду), то это эквивалентно изменению калибровки модели. Предсказания станут более "уверенными" (ближе к 0 или 1). Если модель была уже хорошо откалибрована, такое усиление уверенности ухудшит Log Loss, так как он штрафует за излишнюю уверенность в неверных предсказаниях.
Вывод: Любое изменение масштаба предсказаний перед расчётом Log Loss требует их последующей нормализации в интервал (0,1). Прямое умножение без этого делает метрику невычислимой.
Ответ 18+ 🔞
Э, слушай, давай разжую эту математику, а то у некоторых уже глаза стекленеют. Представь, что Log Loss — это такой занудный бухгалтер, который принимает отчёты только по строгой форме. А форма эта — все твои предсказания вероятностей должны быть строго между нулём и единицей. Не ноль, не единица, и уж тем более не за пределами.
А теперь ты берёшь и все эти числа тупо умножаешь на два. Ну и что получится? Ёпта, половина значений вылетит за единицу, а другая половина, наоборот, может улететь в минуса. И наш бухгалтер, этот Log Loss, просто офигеет. Он смотрит на число 1.2 и такой: «Так, логарифм от (1 - 1.2), то есть от -0.2... Бля, а логарифм от отрицательного числа — это пиздец, неопределённость, NaN, конец света». И всё, метрика накрылась медным тазом. Вот тебе и вся магия.
Смотри, как это в коде выглядит, тут даже думать не надо:
import numpy as np
from sklearn.metrics import log_loss
# Нормальные, адекватные предсказания
y_true = np.array([1, 0, 1, 0])
p_original = np.array([0.9, 0.1, 0.6, 0.4])
original_loss = log_loss(y_true, p_original)
print(f"Исходный Log Loss: {original_loss:.4f}") # Всё ок, ~0.283
# А теперь делаем хуйню — умножаем на 2
p_scaled_wrong = p_original * 2
print("Умноженные предсказания:", p_scaled_wrong) # [1.8, 0.2, 1.2, 0.8]
try:
wrong_loss = log_loss(y_true, p_scaled_wrong)
except Exception as e:
print(f"И закономерная ошибка: {e}") # На деле будет warning и NaN
Видишь? Получилась манда с ушами. log_loss просто отказывается это считать, потому что log(1 - 1.2) — это уже за гранью добра и зла.
«А что если, — спросит хитрая жопа, — я потом эти числа обратно как-нибудь впихну в интервал (0, 1)?» Ну, например, через сигмоиду прогнать? Ну, теоретически да, тогда считать будет. Но это будет уже совсем другая история! Это как взять все твои предсказания и сделать их более уверенными — те, что были близки к 1, станут ещё ближе, те, что к 0 — ещё ближе к нулю. И если твоя модель изначально была хорошо откалибрована, то такая «уверенность» только навредит. Log Loss жестоко наказывает за излишнюю уверенность в неверном ответе. Так что после такой «оптимизации» твоя метрика, скорее всего, станет только хуже, ебать копать.
Короче, вывод простой, как хуй с горы: Log Loss — нелинейная и очень капризная штука. Тупо масштабировать её вход — всё равно что пытаться улучшить вкус супа, вылив в кастрюлю бензина. Не делай так. Если уж очень хочется что-то преобразовать, делай это аккуратно и с пониманием, что интервал (0, 1) — это святое. Иначе получишь не метрику, а NaN, и будешь сидеть и думать, э бошка, где же ты, сука, накосячил.