2014-10-09 12 views
6

Ho appena applicata la perdita di registro nella sklearn per la regressione logistica: http://scikit-learn.org/stable/modules/generated/sklearn.metrics.log_loss.htmlPerché il logloss è negativo?

Il mio codice simile a questa:

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 

Tuttavia, mi chiedo il motivo per cui le perdite risultanti logaritmiche sono negativi. Mi aspetterei che fossero positivi poiché nella documentazione (vedi il mio link sopra) la perdita del log è moltiplicata per un -1 per trasformarlo in un numero positivo.

Sto facendo qualcosa di sbagliato qui?

risposta

5

una discussione simile può essere trovata here.

In questo modo, un punteggio più alto significa prestazioni migliori (meno perdite).

+0

No questo non è il caso qui. Per favore considera di dare una risposta invece di una supposizione. Dopo alcuni test, credo piuttosto che sembra essere un errore nel framework sklearn. – toom

-1

Ho verificato l'implementazione di sklearn con diversi altri metodi. Sembra essere un bug reale all'interno del framework. Invece considerare il codice follwoing per il calcolo della perdita di registro:

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 

Anche prendere in considerazione che le dimensioni del act e pred devono NX1 vettori colonna.

3

Sì, questo dovrebbe succedere. Non è un 'bug' come altri hanno suggerito. La perdita reale del registro è semplicemente la versione positiva del numero che stai ricevendo.

L'API di punteggio unificata di SK-Learn massimizza sempre il punteggio, pertanto i punteggi che devono essere ridotti al minimo vengono annullati affinché l'API di punteggio unificata funzioni correttamente. Il punteggio restituito viene quindi annullato quando si tratta di un punteggio che dovrebbe essere minimizzato e lasciato positivo se si tratta di un punteggio che dovrebbe essere massimizzato.

Questo è anche descritto in sklearn GridSearchCV with Pipeline in scikit-learn cross validation, negative values with mean squared error

0

Perdita Log deve essere vicino allo zero per buon algoritmo predittivo, grande valore negativo significherebbe analisi predittiva è spento e deve essere ripensamento.