Вот как вы можете вычислить потери на выборку:
import numpy as np
def logloss(true_label, predicted, eps=1e-15):
p = np.clip(predicted, eps, 1 - eps)
if true_label == 1:
return -np.log(p)
else:
return -np.log(1 - p)
Давайте проверим это с некоторыми фиктивными данными (нам на самом деле не нужна модель для этого):
predictions = np.array([0.25,0.65,0.2,0.51,
0.01,0.1,0.34,0.97])
targets = np.array([1,0,0,0,
0,0,0,1])
ll = [logloss(x,y) for (x,y) in zip(targets, predictions)]
ll
# result:
[1.3862943611198906,
1.0498221244986778,
0.2231435513142097,
0.7133498878774648,
0.01005033585350145,
0.10536051565782628,
0.41551544396166595,
0.030459207484708574]
Из приведенного выше массива вы сможете убедить себя в том, что чем дальше предсказание от соответствующей истинной метки, тем больше потери, как мы могли бы ожидать интуитивно.
Давайте просто подтвердим, что приведенное выше вычислениесогласуется с общей (средней) потерей, возвращенной scikit-learn:
from sklearn.metrics import log_loss
ll_sk = log_loss(targets, predictions)
ll_sk
# 0.4917494284709932
np.mean(ll)
# 0.4917494284709932
np.mean(ll) == ll_sk
# True
Код, адаптированный с здесь .