11

我刚刚将 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 以将其转换为正数。

我在这里做错了吗?

4

3 回答 3

9

是的,这应该会发生。这不是其他人所建议的“错误”。实际的日志丢失只是你得到的数字的正数。

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

这也在sklearn GridSearchCV with Pipelinescikit-learn 交叉验证中进行了描述,负值与均方误差

于 2014-12-08T18:42:01.353 回答
5

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

这样,更高的分数意味着更好的性能(更少的损失)。

于 2014-10-09T17:08:19.483 回答
-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还要考虑到predNx1 列向量的维度。

于 2014-10-10T13:11:58.337 回答