Keras 如何计算准确率?
- 2025-04-15 09:21:00
- admin 原创
- 28
问题描述:
如果存在二元分类问题,标签为 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:
您在这里有点困惑;您谈论的是准确性,同时展示了损失的公式。
您展示的等式确实是二元分类的交叉熵损失公式(或简称为逻辑损失)。
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
的贡献为 0.01(由于和式前面的符号)。i=0
`-`
现在假设下一个样本的真实标签再次为 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
。
尽管如此,这是损失(即scores[0]
在您的代码片段中),而不是准确性。
损失和准确率是两码事;粗略地说,准确率才是我们从业务角度真正感兴趣的,而损失则是学习算法(优化器)从数学角度试图最小化的目标函数。更粗略地说,你可以把损失看作是业务目标(准确率)到数学领域的“翻译”,这种翻译在分类问题中是必要的(在回归问题中,损失通常和业务目标相同,或者至少在原理上相同,例如 RMSE)……
Keras 会自动将我们的预测四舍五入为 0 或 1 吗?
确实如此:为了计算准确率,我们在预测概率中隐式地设置了一个阈值model.evaluate
(在二分类中通常为 0.5,但在数据高度不平衡的情况下可能会有所不同);因此,在 中,Keras 实际上将我们的预测转换为 1,否则p[i] > 0.5
转换为 0。然后,准确率的计算方法是简单地计算(正确预测)的案例数,y_true==y_pred
并除以样本总数,得到一个介于 [0,1] 之间的数字。
总结一下:
损失计算不进行四舍五入
有一个隐式阈值操作用于计算准确度
扫码咨询,免费领取项目管理大礼包!