对数损失(与交叉熵有关)用于衡量分类模型的性能,其中预测输入为0到1之间的概率值。
我们的机器学习模型的目标是最小化该值。理想模型的对数损失为0。
随着预测概率与实际标签的偏离,对数损失会增加。因此,当实际观察标签为1时预测0.01的概率将很糟糕,并会导致较高的对数损失。更详细的解释和以及对数损失函数背后的数学原理可以参考这里。
准确性是您的预测值等于实际值的统计数。由于准确性是肯定或否定的,所以它并不总是一个好的指标。
对数损失会根据与实际标签相差多少来考虑预测的不确定性。这使我们对模型的性能有了更细微的了解。
下图显示了给出真实观察值(isDog = 1)时可能出现的对数损失值的范围。随着预测概率接近1,对数损失逐渐减少。但是,随着预测概率的降低,对数损失会迅速增加。日志丢失会惩罚两种类型的错误,尤其是那些肯定和错误的预测!

要从头开始计算对数丢失,我们需要包括MinMax函数(请参见下文)。Numpy通过np.clip()为我们实现了这一点。
def logloss(true_label, predicted, eps=1e-15):
p = np.clip(predicted, eps, 1 - eps)
if true_label == 1:
return -log(p)
else:
return -log(1 - p)
Scikit-learn提供了实用函数来计算日志丢失
从 sklearn.metrics 导入 log_loss
log_loss (y_true , y_pred , eps = 1e-15 )
Keras还提供了一种在模型训练期间指定损失函数的方法。在每个训练迭代之后运行计算。在我们的案例中,我们选择categorical_crossentropy,这是多类对数丢失的另一个术语:
model.compile(loss='categorical_crossentropy', optimizer='sgd')
以下等式演示了如何计算单个观测值的对数损失。当根据数据集评估模型时,您的对数损失分数就是所有观察值的平均对数损失。
在二分类(M = 2)中,公式等于:
例如,假设类别标签为1且预测概率为.25,则使用上面的公式,我们可以计算对数损失:
类似地,给定类别标签0和预测概率0.25,我们可以将对数损失计算为:
在Python中,我们可以更简单地表达这一点:
def logloss(true_label, predicted_prob):
if true_label == 1:
return -log(predicted_prob)
else:
return -log(1 - predicted_prob)
在多类别分类(M> 2)中,我们对观察中每个类别的预测取对数损失值的总和。
是求和的简写,或者在我们的情况下是跨类的所有对数损失值的总和
c=1是求和的起点(即第一类)
对数损失使用负对数来提供比较容易的指标。之所以采用这种方法,是因为小于1的正数对数会返回负值,这在比较两个模型的性能时会造成混淆。

使用上述公式计算对数损耗时,未定义0和1的预测输入值。为了避免出现此问题,对数损失函数通常将预测概率(p)调整为较小的值(ε)。
max(min(p, 1−10^−15), 10^-15)
p = 0
p = 1
对数损失和交叉熵根据上下文而略有不同,但是在机器学习中,计算0到1之间的错误率时,它们可以解决同一问题。作为演示,其中p和q是集合p∈{y,1-y}和q∈{ŷ,1-ŷ},我们可以将交叉熵重写为:
这与对数损失函数完全相同!
【来源】
【参考】