Classificazione multiclasse e log_loss
Spero di poterlo chiarire con poche righe di codice / spiegazione.
Ho un elenco di 16.000 testi, etichettati in oltre 30 classi diverse che sono state gestite attraverso classificatori diversi; la mia predizione e la verità sul terreno corrispondono in media al 94%.
Ora sto dopo aver misurato qualcosa in più (non sono sicuro di cosa dovrei misurare oltre a un minimo di F1_score perché sto ancora imparando, però) e mi sono imbattuto in log_loss da sklearn, il cui risultato capisco che sia compreso tra 0 e 1. Quando è andato contro la mia previsione, tuttavia, il risultato è 1.48xxx, che è in realtà più alto.
Nel cercare di capire cosa c'era che non andava.
Ho esplorato il risultato di ComplementNB.predict_proba richiesto per log_loss e il valore corrisponde a quello del mio array di previsione.
Di seguito un codice:
from sklearn.metrics import log_loss
y = ... # This is my array of value that is my source of truth
labels = numpy.unique(y)
label_ary = [idx for gt in y for idx, lbl in enumerate(labels) if gt == lbl]
print(f'The log loss is {log_loss(label_ary, clf.predict_proba(X.toarray()))}')
Sia che io usi label_ary o y, in entrambe le circostanze ottengo lo stesso valore, il che significa che alcune conversioni all'interno di log_loss stanno già avvenendo.
Non sono sicuro se sto interpretando male i risultati o lo specifico della funzione.
Che cosa sto facendo di sbagliato? Grazie
Risposte
Interpretabilità della perdita di registro
La perdita di registro non è necessariamente compresa nell'intervallo [0; 1] - si aspetta solo che l'input sia in questo intervallo. Dai un'occhiata a questo esempio:$$ y_{pred} = 0.1 \\ y_{true} = 1.0 \\ log\_loss = -(log(y_{pred}) * y_{true} + (1 - y_{true}) * log(1 - y_{pred})) = -(log(0.1) * 1.0) = 2.302 $$In un caso estremo, la perdita di registro può anche essere uguale a infinito. Quindi non c'è niente di sbagliato nel codice e inoltre non ci sono molte cose interessanti che puoi derivare dal fatto che log_loss è minore o maggiore di 1. Quello che puoi fare con esso è lo stesso di qualsiasi funzione di perdita - confrontalo con un modello simile con diversi iperparametri e scegli quello con la perdita media più bassa come modello migliore (un processo chiamato ottimizzazione degli iperparametri).
Quando usare la sconfitta e quando segnare f1?
Supponiamo che tu abbia un set di dati e un problema di classificazione che desideri risolvere. Sai che puoi creare un modello statistico che restituisce le probabilità di una data classe. Sai anche che esiste (ipoteticamente) un algoritmo che classifica in base ad alcune euristiche che non richiedono addestramento. Vorresti sapere quale di questi è il migliore per il tuo problema. Quello che fai, se semplifichiamo un po ', è:
- Suddividi il tuo set di dati in set di addestramento, convalida e test.
- Usa il tuo treno per addestrare il modello
- Durante l'addestramento, il modello calcola la perdita per il treno e il set di convalida in ogni epoca (se non stai utilizzando reti neurali profonde, puoi e dovresti usare la convalida incrociata ).
- Perdita di trama per treno e set di convalida e verifica se il tuo modello è parziale (perdita di treno elevata e perdita di convalida elevata) o overfitting (perdita di treno bassa e perdita di convalida elevata) La minore perdita per la convalida è migliore.
- Eseguire 3. e 4. più volte per diversi iperparametri e selezionarne uno con la perdita di set di convalida più bassa. Ora disponi di un modello statistico addestrato.
- Ora usa il punteggio f1 per confrontare il tuo modello con l'algoritmo che conosci anche tu. Il punteggio più alto, meglio è. Si noti che supponendo che l'algoritmo restituisca classi e non probabilità se non è corretto anche per un solo esempio, la sua funzione di perdita di registro sarà uguale a infinito. Questo è il motivo per cui non possiamo utilizzare la perdita di registro come metrica per confrontare questi due metodi.
In breve, è necessario utilizzare la perdita come metrica durante il processo di addestramento / convalida per ottimizzare i parametri e gli iperparametri e il punteggio f1 (e possibilmente molte altre metriche, ad esempio Area sotto curva ) durante il processo di test per selezionare il metodo migliore per risolvere il problema. In questo modo è possibile confrontare diversi metodi per risolvere il problema, anche quelli che non utilizzano affatto l'apprendimento automatico.