Python 3.x sklearn的log_损失提供nan,而tensorflow.loss.log_损失有效
我有一个二进制分类问题。 我正在使用来自Python 3.x sklearn的log_损失提供nan,而tensorflow.loss.log_损失有效,python-3.x,tensorflow,scikit-learn,log-likelihood,Python 3.x,Tensorflow,Scikit Learn,Log Likelihood,我有一个二进制分类问题。 我正在使用来自tensorflow.loss.log\u loss的log\u loss 为了检查,我使用sklearn.metrics.log\u loss。大多数情况下,这两个函数给出相同的结果(只是数据类型不同)。在某些情况下,sklearn函数返回NaN,而tf.loss.log\u loss返回正确的值 数据如下: 代码: 似乎发生了一些log(0),但是为什么tensorflow没有这个问题呢 将两个数组的数据类型更改为64位浮点可以修复此问题 dtype
tensorflow.loss.log\u loss
的log\u loss
为了检查,我使用sklearn.metrics.log\u loss
。大多数情况下,这两个函数给出相同的结果(只是数据类型不同)。在某些情况下,sklearn
函数返回NaN
,而tf.loss.log\u loss
返回正确的值
数据如下:
代码:
似乎发生了一些
log(0)
,但是为什么tensorflow没有这个问题呢 将两个数组的数据类型更改为64位浮点可以修复此问题
dtype=np.float64
例如,添加
y\u pred=y\u pred.astype(np.float64)
另一种解决问题的方法是为log\u loss
提供eps=1e-7
,这是float32
更合适的epsilon,也是tensorflow使用的。
但是,Scikit使用
1e-15
作为默认值(预期为float64
)。这看起来像是您在我得到相同结果时偶然发现了一个bug。它看起来像某种形式的溢出,因为获取列表的子部分效果很好,所以它不是一个特定的值。为什么?我也偶然发现了这个问题,但奇怪的是,将我的numpy数组转换为pandas系列的dtype float64解决了这个问题!非常感谢。我使用了scikit learnpermutation\u importance
,因此得到了NaN表示重要性。在记分器中设置eps可解决此问题。:)
dtype=np.float64