对数损失和交叉熵损失的结果不同

问题描述

逻辑回归的负对数似然由 [...] 给出,这也称为交叉熵误差函数

— Page 246,Machine Learning: A Probabilistic Perspective,2012

所以我试了一下,发现有点不同:

.\gradlew.bat test

为什么?

解决方法

首先,sklearn.metrics.log_loss自然对数math.lognumpy.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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...