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 的准确率更高。有问题?

keras如何定义“准确度”和“损失”?

如何提高keras模型的准确率,防止过拟合

Keras 分类器上的准确率、召回率和 FMeasure 的 Sklearn Metrics

如何在 Keras 中绘制 MLP 模型的训练损失和准确度曲线?