问题描述
逻辑回归的负对数似然由 [...] 给出,这也称为交叉熵误差函数。
— Page 246,Machine Learning: A Probabilistic Perspective,2012
所以我试了一下,发现有点不同:
.\gradlew.bat test
为什么?
解决方法
首先,sklearn.metrics.log_loss
将自然对数(math.log
或 numpy.log
)应用于概率,而不是以 2 为底的对数。
其次,您显然得到了 -0.0
,因为 y_true
中的对数概率乘以零。对于二元情况,对数损失是
-logP(y_true,y_pred) = -(y_true*log(y_pred) + (1-y_true)*log(1-y_pred))
第三,您忘记在代码中取对数损失的平均值。
from math import log
def bin_cross_entropy(p,q):
n = len(p)
return -sum(p[i]*log(q[i]) + (1-p[i])*log(1-q[i]) for i in range(n)) / n
bin_cross_entropy(y_true,y_pred) # 0.6931471805599453