Python 如何计算scikit学习ML模型每个样本的二进制日志损失

Python 如何计算scikit学习ML模型每个样本的二进制日志损失,python,numpy,machine-learning,scikit-learn,loss,Python,Numpy,Machine Learning,Scikit Learn,Loss,我试图将二进制日志丢失应用于我创建的朴素贝叶斯ML模型。我生成了一个分类预测数据集(yNew)和一个概率数据集(probabilityYes),但无法在日志丢失函数中成功运行它们 简单的sklearn.metrics函数提供单个日志丢失结果-不确定如何解释此结果 from sklearn.metrics import log_loss ll = log_loss(yNew, probabilityYes, eps=1e-15) print(ll) .0819.... def logloss(y

我试图将二进制日志丢失应用于我创建的朴素贝叶斯ML模型。我生成了一个分类预测数据集(yNew)和一个概率数据集(probabilityYes),但无法在日志丢失函数中成功运行它们

简单的sklearn.metrics函数提供单个日志丢失结果-不确定如何解释此结果

from sklearn.metrics import log_loss
ll = log_loss(yNew, probabilityYes, eps=1e-15)
print(ll)
.0819....
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 .....
更复杂的函数为每个NO返回2.55的值,为每个YES返回2.50的值(总共90列)-同样,不知道如何解释这一点

from sklearn.metrics import log_loss
ll = log_loss(yNew, probabilityYes, eps=1e-15)
print(ll)
.0819....
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 .....

以下是如何计算每个样本的损失:

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)
让我们用一些虚拟数据检查一下(我们实际上不需要模型):

从上面的数组中,您应该能够说服自己,预测离相应的真实标签越远,损失就越大,正如我们直观地预期的那样

让我们确认上述计算与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
代码改编自[链接现已失效]