Как вычислить двоичные потери в журнале для образца модели ML scikit-learn - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь применить двоичную потерю в журнале к модели Naive Bayes ML, которую я создал. Я сгенерировал набор данных категориального прогноза (yNew) и набор данных вероятности (вероятностьYes) и не могу успешно запустить их в функции потери журнала.

Простая функция sklearn.metrics дает один результат потери журнала - неуверен, как интерпретировать эту

from sklearn.metrics import log_loss
ll = log_loss(yNew, probabilityYes, eps=1e-15)
print(ll)
.0819....

более сложная функция возвращает значение 2,55 для каждого НЕТ и 2,50 для каждого ДА (всего 90 столбцов) - опять же, не знаю, как интерпретировать это

def logloss(yNew,probabilityYes):
epsilon = 1e-15
probabilityYes = sp.maximum(epsilon, probabilityYes)
probabilityYes = sp.minimum(1-epsilon, probabilityYes)

#compute logloss function (vectorised)
ll = sum(yNew*sp.log(probabilityYes) +
            sp.subtract(1,yNew)*sp.log(sp.subtract(1,probabilityYes)))
ll = ll * -1.0/len(yNew)
return ll

print(logloss(yNew,probabilityYes))
2.55352047 2.55352047 2.50358354 2.55352047 2.50358354 2.55352047 .....

1 Ответ

0 голосов
/ 23 октября 2019

Вот как вы можете вычислить потери на выборку:

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

Код, адаптированный с здесь .

...