如果存在二进制分类问题,则标签为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
最佳答案
您在这里有些困惑;您说的是准确性,同时显示了损失的公式。
您显示的方程式的确是用于二进制分类的cross-entropy loss formula(或简称为logistic损失)。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(即您的代码段中的
scores[0]
),而不是accuracy。损失和准确性是不同的东西;粗略地说,从业务角度来看,准确性是我们真正感兴趣的,而损失是学习算法(优化器)从数学角度试图使目标最小化的目标函数。更粗略地说,您可以将损失视为业务目标(准确性)对数学域的“转换”,这是分类问题中必不可少的转换(在回归问题中,损失和业务目标通常是损失)。相同,或至少原则上可以相同,例如RMSE)...
实际上是:为了计算准确性,我们在预测的概率中隐式设置了一个阈值(在二进制分类中通常为0.5,但是在高度不平衡的数据中可能有所不同);因此,在
model.evaluate
中,如果p[i] > 0.5
,Keras实际上会将我们的预测转换为1,否则将其转换为0。然后,通过简单地计数y_true==y_pred
(正确的预测)的情况并除以样本总数,得出[0,1]中的数字,即可计算出准确度。因此,总结一下:
关于python - Keras 如何计算准确率?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47508874/