y[i]
是标签,实际上只会是0或1。
p[i]
是预测值,通常被理解为概率,它们是[0,1]范围内的实数(没有任何取整)。y[i] = 0
时,第一项消失;同样地,当y[i] = 1
时,第二项消失。y[0] = 1
,而我们预测p[0] = 0.99
(即相当好的预测)。和式的第二项消失了(因为1 - y [0] = 0
),而第一项变成了log(0.99) = -0.01
;因此,这个样本预测(i = 0
)对总体损失的贡献是0.01(由于和式前的“-”符号)。p[1] = 0.1
的预测相当糟糕;同样,第二项消失了,这个预测对总损失的贡献现在是-log(0.1) = 2.3
,比我们的第一个好预测要大,这是我们应该直观地期望的。p[2] = 0
做出了完美的预测;因此,第一项消失了,第二项变成了(1 - y[2]) * log(1 - p[2]) = 1 * log(1) = log(1) = 0
即我们没有损失贡献,正如我们直觉地预期的那样,因为我们在这里对于 i=2
做出了完美的预测。
逻辑损失公式简单地计算所有这些个别预测的误差,将它们相加,然后除以它们的数量 n
。
然而,这是 损失(即您片段中的 scores[0]
),而不是 准确率。
损失和准确率是不同的东西;粗略地说,准确率是我们从 商业 视角实际上感兴趣的内容,而损失是学习算法(优化器)尝试从 数学 视角最小化的目标函数。更粗略地说,您可以认为损失是商业目标(准确性)到数学领域的“翻译”,这种翻译在分类问题中是必要的(在回归问题中,通常损失和商业目标是相同的,或者至少原则上可以相同,例如 RMSE)...
Keras 会自动将我们的预测四舍五入为 0 或 1 吗?
实际上是这样的:为了计算准确度,我们在预测的概率中隐含地设置了一个阈值(通常在二元分类中为0.5,但在高度不平衡的数据情况下可能会有所不同)。因此,在model.evaluate
中,Keras实际上将我们的预测转换为1,如果p[i] > 0.5
,否则转换为0。然后,通过简单地计算y_true==y_pred
的情况(正确预测)并将其除以样本总数来计算准确度,从而得到[0,1]范围内的数字。
因此,总结一下: