You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:05:18