为什么logloss是负数



我刚刚在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,以便将其转化为正数。

我是不是做错了什么?

是的,这是应该发生的。这并不像其他人所说的那样是一个"bug"。实际的日志丢失只是你得到的数字的正版本。

SK-Learn的统一评分API总是将分数最大化,因此需要最小化的分数被否定,以使统一评分API正确工作。因此,当返回的分数是应该最小化的分数时,返回的分数被否定,而如果返回的分数应该最大化,则返回的分数为正。

这也在带有管道的sklearn GridSearchCV和scikit learn交叉验证中进行了描述,负值的均方误差

类似的讨论可以在这里找到。

这样一来,分数越高意味着表现越好(损失越小)。

我将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列向量。

相关内容

  • 没有找到相关文章

最新更新