2014-10-09 19 views
6

Ich bewarb nur die Log-Verlust in sklearn für logistische Regression: http://scikit-learn.org/stable/modules/generated/sklearn.metrics.log_loss.htmlWarum ist das Logloss negativ?

Mein Code sieht ungefähr so ​​aus:

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 

aber ich frage mich, warum die resultierenden logarithmischen Verluste negativ sind. Ich würde erwarten, dass sie positiv sind, da in der Dokumentation (siehe mein Link oben) der Logverlust mit -1 multipliziert wird, um ihn in eine positive Zahl umzuwandeln.

Mache ich hier etwas falsch?

Antwort

5

eine ähnliche Diskussion kann here gefunden werden.

Auf diese Weise bedeutet eine höhere Punktzahl bessere Leistung (weniger Verlust).

+0

Nein, das ist hier nicht der Fall. Bitte denken Sie daran, eine Antwort zu geben anstatt zu raten. Nach ein paar Tests glaube ich eher, dass es tatsächlich ein Fehler im sklearn-Framework zu sein scheint. – toom

-1

Ich überprüfte die sklearn Implementierung mit mehreren anderen Methoden. Es scheint ein tatsächlicher Fehler innerhalb des Frameworks zu sein. Stattdessen sollten Sie die Log-Verlust der follwoing Code für die Berechnung:

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 

nehmen auch berücksichtigen, dass die Abmessungen von act und pred müssen Nx1 Spaltenvektoren.

3

Ja, das soll passieren. Es ist kein "Bug" wie andere vorgeschlagen haben. Der tatsächliche Protokollverlust ist einfach die positive Version der Nummer, die Sie erhalten.

Die vereinheitlichte Scoring-API von SK-Learn maximiert immer die Punktzahl, so dass Scores, die minimiert werden müssen, negiert werden, damit die vereinheitlichte Scoring-API korrekt funktioniert. Die Punktzahl, die zurückgegeben wird, wird daher negiert, wenn es sich um eine Punktzahl handelt, die minimiert werden sollte, und positiv, wenn es sich um eine Punktzahl handelt, die maximiert werden sollte. Dies spiegelt sich auch in sklearn GridSearchCV with Pipeline und in scikit-learn cross validation, negative values with mean squared error

0

Log-Verlust sein muss in der Nähe von Null für eine guten Vorhersagealgorithmus, großer negativer Wert würde bedeuten, prädiktive Analyse ausgeschaltet ist und sein muss umdenken beschrieben

.