Keras 是如何计算准确率的?
Posted
技术标签:
【中文标题】Keras 是如何计算准确率的?【英文标题】:How does Keras calculate the accuracy? 【发布时间】:2018-05-10 13:41:05 【问题描述】:如果存在二元分类问题,则标签为 0 和 1。 我知道预测是一个浮点数,因为 p 是属于该类的概率。
以下是交叉熵损失函数。
但是p不一定是0或者1,那么Keras是如何计算准确率的呢? Keras 会自动将我们的预测四舍五入为 0 还是 1?
例如,在下面的代码中,准确率是 0.749,但目标是 0 和 1,预测是浮点数,不一定是 0.0 或 1.0。
>>> scores = model.evaluate(x=test_Features,
y=test_Label)
>>> scores[1]
0.74909090952439739
【问题讨论】:
【参考方案1】:你在这里有点困惑;你谈到准确性,同时显示损失的公式。
您展示的方程式确实是用于二元分类的cross-entropy loss formula(或简称为逻辑损失)。
y[i]
是标签,实际上是 0 或 1。
p[i]
是预测,通常解释为概率,是 [0,1] 中的实数(没有任何四舍五入)。
现在对于每个i
,总和中只有一个术语会存在 - 第一个术语在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(由于总和前面的 -
符号)。
现在假设下一个样本的真实标签又是1,即y[1] = 1
,但是这里我们对p[1] = 0.1
做了一个相当差的预测;再次,第二项消失了,这个预测对整体损失的贡献现在是-log(0.1) = 2.3
,这确实比我们的第一个良好预测要大,正如我们应该直观地预期的那样。
作为最后一个例子,我们假设y[2] = 0
,我们在这里对p[2] = 0
做了一个非常好的预测;因此,第一项消失,第二项变为
(1 - y[2]) * log(1 - p[2]) = 1 * log(1) = log(1) = 0
即正如我们直观预期的那样,我们没有造成任何损失,因为我们在这里对i=2
做出了非常好的预测。
逻辑损失公式只是计算各个预测的所有这些误差,将它们相加,然后除以它们的数量n
。
不过,这是 loss(即您的 sn-p 中的 scores[0]
),而不是 accuracy。
损失和准确性是不同的东西;粗略地说,准确度是我们从商业角度真正感兴趣的,而损失是学习算法(优化器)试图从数学角度最小化的目标函数em> 观点。更粗略地说,您可以将损失视为业务目标(准确性)到数学领域的“转换”,这是分类问题中所必需的转换(在回归问题中,通常损失和业务目标是相同,或者至少原则上可以相同,例如 RMSE)...
Keras 会自动将我们的预测四舍五入为 0 还是 1?
其实是的:为了计算准确率,我们在预测概率中隐式设置了一个阈值(在二元分类中通常为 0.5,但在数据高度不平衡的情况下可能会有所不同);因此,在model.evaluate
中,如果p[i] > 0.5
,Keras 实际上将我们的预测转换为 1,否则转换为 0。然后,通过简单地计算y_true==y_pred
(正确预测)的情况并除以样本总数来计算准确率,得到[0,1]中的数字。
所以,总结一下:
损失的计算没有四舍五入 准确性的计算存在隐式阈值操作【讨论】:
以上是关于Keras 是如何计算准确率的?的主要内容,如果未能解决你的问题,请参考以下文章
从 Keras model.predict_generator 计算准确率
F1 比在 keras 回调中使用 sklearn 的准确率更高。有问题?