2014-10-09 35 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

登錄損失需要接近零的良好的預測算法也說明,較大的負值意味着預測分析是關閉的,需要進行反思。