来自sklearn的log_loss给出了nan,而tensorflow.losses.log_loss则有效

时间:2018-05-03 14:37:25

标签: python-3.x tensorflow scikit-learn log-likelihood

我有二进制分类问题。 我正在使用tensorflow.losses.log_loss中的log_loss。

要检查,我使用sklearn.metrics.log_loss。大多数情况下,这两个函数给出相同的结果(只有dtype的差异)。在某些情况下,sklearn函数返回NaN,而tf.losses.log_loss返回正确的值。

数据在这里: https://pastebin.com/BvDgDnVT

代码:

import sklearn.metrics
import tensorflow as tf
y_true = [... see pastebin link]
y_pred = [... see pastebin link]
loss_sk = sklearn.metrics.log_loss(y_true, y_pred, labels=[0, 1]) # -> returns NaN
with tf.Session() as sess:
    loss_tf = tf.losses.log_loss(y_true, y_pred).eval(session=sess) # -> returns 0.0549

似乎发生了一些log(0),但为什么tensorflow没有这个问题呢?

2 个答案:

答案 0 :(得分:3)

将两个数组的dtype更改为64位浮点数将其修复

dtype=np.float64

答案 1 :(得分:2)

解决此问题的另一种方法是将eps=1e-7提供给log_loss,这对于float32来说是更合适的epsilon,并且是tensorflow所使用的。 但是,Scikit使用1e-15作为默认值(期望float64)。