为啥logloss是负数?
Posted
技术标签:
【中文标题】为啥logloss是负数?【英文标题】:Why is the logloss negative?为什么logloss是负数? 【发布时间】:2014-12-04 15:31:56 【问题描述】:我刚刚将 sklearn 中的 log loss 应用于逻辑回归:http://scikit-learn.org/stable/modules/generated/sklearn.metrics.log_loss.html
我的代码如下所示:
def perform_cv(clf, X, Y, scoring):
kf = KFold(X.shape[0], n_folds=5, shuffle=True)
kf_scores = []
for train, _ in kf:
X_sub = X[train,:]
Y_sub = Y[train]
#Apply 'log_loss' as a loss function
scores = cross_validation.cross_val_score(clf, X_sub, Y_sub, cv=5, scoring='log_loss')
kf_scores.append(scores.mean())
return kf_scores
但是,我想知道为什么产生的对数损失是负数。我希望它们是正数,因为在文档中(请参阅上面的链接)日志损失乘以 -1 以将其转换为正数。
我在这里做错了吗?
【问题讨论】:
【参考方案1】:可以在here 找到类似的讨论。
这样,更高的分数意味着更好的性能(更少的损失)。
【讨论】:
不,这里不是这样。请考虑给出答案而不是猜测。经过一些测试后,我认为它实际上似乎是 sklearn 框架中的一个错误。【参考方案2】:我用其他几种方法交叉检查了 sklearn 的实现。这似乎是框架内的一个实际错误。请考虑使用以下代码来计算对数损失:
import scipy as sp
def llfun(act, pred):
epsilon = 1e-15
pred = sp.maximum(epsilon, pred)
pred = sp.minimum(1-epsilon, pred)
ll = sum(act*sp.log(pred) + sp.subtract(1,act)*sp.log(sp.subtract(1,pred)))
ll = ll * -1.0/len(act)
return ll
还要考虑到act
和pred
的维度必须是Nx1 列向量。
【讨论】:
【参考方案3】:是的,这应该会发生。这不是其他人所建议的“错误”。实际的日志丢失只是你得到的数字的正数。
SK-Learn 的统一评分 API 始终会最大化分数,因此需要最小化的分数被取反,以便统一评分 API 正常工作。因此,返回的分数在应该最小化的分数时被否定,如果是应该最大化的分数,则保留为正数。
这也在sklearn GridSearchCV with Pipeline 和scikit-learn cross validation, negative values with mean squared error 中有所描述
【讨论】:
感谢您的回答。这是有道理的,但仍然很奇怪。我找不到任何来自 Sklearn 的文件来确认这一点。以上是关于为啥logloss是负数?的主要内容,如果未能解决你的问题,请参考以下文章