为什么logloss是负面的?

时间:2014-10-09 15:58:07

标签: scikit-learn metric loss

我刚刚将sklearn中的日志丢失应用于逻辑回归: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,以便将其变为正数。

我在这里做错了吗?

3 个答案:

答案 0 :(得分:6)

是的,这应该发生。这不是其他人建议的“错误”。实际的日志丢失只是您获得的数字的正面版本。

SK-Learn的统一评分API总是最大化分数,因此需要最小化的分数被否定才能使统一评分API正常工作。因此,当分数应该被最小化并且如果它是应该被最大化的分数时,则返回的分数被否定。

sklearn GridSearchCV with Pipelinescikit-learn cross validation, negative values with mean squared error

中也对此进行了描述

答案 1 :(得分:5)

可以找到类似的讨论here

通过这种方式,得分越高意味着表现越好(损失越少)。

答案 2 :(得分:-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

另请注意actpred的尺寸必须为Nx1列向量。