2014-10-09 97 views
6

我刚刚应用的日志损失sklearn logistic回归的:http://scikit-learn.org/stable/modules/generated/sklearn.metrics.log_loss.html为什么logloss为负?

我的代码看起来是这样的:

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

我在这里做错了什么?

回答

5

可以找到类似的讨论here

以这种方式,分数越高意味着更好的表现(更少的损失)。

+0

不,这里不是这种情况。请考虑给出答案而不是猜测。经过一些测试,我宁愿相信它在sklearn框架中似乎是一个错误。 – toom 2014-10-10 13:08:46

-1

我用其他几种方法交叉检查了sklearn实现。这似乎是该框架内的一个实际错误。相反,考虑follwoing代码计算日志丢失:

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

3

是的,这是应该发生的。这不像别人所说的那样是一个“错误”。实际的日志丢失只是您获得的数字的正面版本。

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

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

0

登录损失需要接近零的良好的预测算法也说明,较大的负值意味着预测分析是关闭的,需要进行反思。

相关问题