为何我的Log-Loss(交叉熵)实现结果与预期不一致?
为什么自定义交叉熵与sklearn的log_loss结果不一致?
我来帮你排查几个关键差异点,这些都是导致结果不同的常见原因:
1. 参数顺序搞反了
sklearn的log_loss函数参数顺序是**y_true(真实标签)在前,y_pred(预测概率)在后**,也就是调用形式为log_loss(targets, predictions)。但你的自定义函数是cross_entropy(predictions, targets),如果调用log_loss时你写成了log_loss(predictions, targets),参数顺序完全颠倒,结果肯定不对。
2. 缺少数值稳定的平滑处理
sklearn的log_loss默认会对预测概率做数值稳定处理:它会把所有预测值限制在[epsilon, 1-epsilon]范围内(默认epsilon=1e-15),避免出现log(0)导致的无穷大错误。而你的自定义代码直接使用原始预测值,虽然当前例子里没有0,但这是sklearn保证计算稳定性的关键设计,也是和自定义实现的核心差异之一。
3. 对齐sklearn行为的修正代码
我们调整自定义函数,对齐sklearn的逻辑,验证结果一致性:
import numpy as np from sklearn.metrics import log_loss def cross_entropy(predictions, targets, epsilon=1e-15): # 先对预测值做clip处理,和sklearn的数值稳定逻辑对齐 predictions = np.clip(predictions, epsilon, 1 - epsilon) N = predictions.shape[0] ce = -np.sum(targets * np.log(predictions)) / N return ce predictions = np.array([[0.25,0.25,0.25,0.25], [0.01,0.01,0.01,0.97]]) targets = np.array([[1,0,0,0], [0,0,0,1]]) # 注意sklearn的参数顺序:真实标签在前,预测概率在后 sklearn_result = log_loss(targets, predictions) custom_result = cross_entropy(predictions, targets) print(f"sklearn log_loss结果: {sklearn_result:.6f}") print(f"自定义交叉熵结果: {custom_result:.6f}")
运行这段代码后,你会看到两个结果几乎完全一致(仅存在微小的浮点精度差异)。
额外提醒
如果之前你调用log_loss时参数顺序反了,那结果会完全偏离预期——这是新手使用sklearn分类指标时最容易踩的坑,一定要注意API的参数顺序!
内容的提问来源于stack exchange,提问作者Vikash Singh
相关产品推荐
相关产品推荐

