La precisione del sottoinsieme è in effetti una metrica severa. Per avere un'idea di quanto sia buono o cattivo 0,29, qualche idea:
- guarda quante etichette hai una media per ogni campione
- guarda l'accordo inter-annotatore, se disponibile (in caso contrario, prova te stesso a vedere quale precisione del sottoinsieme si ottiene quando sei il classificatore)
- pensa se l'argomento è ben definito
- guarda quanti campioni hai per ogni etichetta
Potresti anche voler calcolare il punteggio di hamming, per vedere se il tuo classificatore è all'oscuro o è piuttosto decente ma hai problemi a prevedere correttamente tutte le etichette. Vedi sotto per calcolare il punteggio di martellamento.
Allo stesso tempo, da quello che ho capito non posso usare scikit.metrics con OneVsRestClassifier, quindi come posso ottenere alcune metriche (F1, precisione, richiamo ecc.) In modo da capire cosa c'è che non va?
Vedi Come calcolare la precisione / richiamo per la classificazione multiclasse-multilabel? . Ho dimenticato se sklearn lo supporta, ricordo che aveva alcune limitazioni, ad esempio sklearn non supporta multi-etichetta per matrice di confusione . Sarebbe una buona idea vedere davvero questi numeri.
Punteggio di Hamming :
In un'impostazione di classificazione multilabel , sklearn.metrics.accuracy_score
calcola solo l' accuratezza del sottoinsieme (3): ovvero l'insieme di etichette previsto per un campione deve corrispondere esattamente all'insieme corrispondente di etichette in y_true.
Questo modo di calcolare l'accuratezza è talvolta chiamato, forse meno ambiguamente, rapporto di corrispondenza esatta (1):
Un altro modo tipico per calcolare l'accuratezza è definito in (1) e (2), e meno ambiguamente indicato come il punteggio di Hamming (4) (poiché è strettamente correlato alla perdita di Hamming) o accuratezza basata sull'etichetta ). È calcolato come segue:
Ecco un metodo Python per calcolare il punteggio di Hamming:
# Code by /programming//users/1953100/william
# Source: /programming//a/32239764/395857
# License: cc by-sa 3.0 with attribution required
import numpy as np
y_true = np.array([[0,1,0],
[0,1,1],
[1,0,1],
[0,0,1]])
y_pred = np.array([[0,1,1],
[0,1,1],
[0,1,0],
[0,0,0]])
def hamming_score(y_true, y_pred, normalize=True, sample_weight=None):
'''
Compute the Hamming score (a.k.a. label-based accuracy) for the multi-label case
/programming//q/32239577/395857
'''
acc_list = []
for i in range(y_true.shape[0]):
set_true = set( np.where(y_true[i])[0] )
set_pred = set( np.where(y_pred[i])[0] )
#print('\nset_true: {0}'.format(set_true))
#print('set_pred: {0}'.format(set_pred))
tmp_a = None
if len(set_true) == 0 and len(set_pred) == 0:
tmp_a = 1
else:
tmp_a = len(set_true.intersection(set_pred))/\
float( len(set_true.union(set_pred)) )
#print('tmp_a: {0}'.format(tmp_a))
acc_list.append(tmp_a)
return np.mean(acc_list)
if __name__ == "__main__":
print('Hamming score: {0}'.format(hamming_score(y_true, y_pred))) # 0.375 (= (0.5+1+0+0)/4)
# For comparison sake:
import sklearn.metrics
# Subset accuracy
# 0.25 (= 0+1+0+0 / 4) --> 1 if the prediction for one sample fully matches the gold. 0 otherwise.
print('Subset accuracy: {0}'.format(sklearn.metrics.accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)))
# Hamming loss (smaller is better)
# $$ \text{HammingLoss}(x_i, y_i) = \frac{1}{|D|} \sum_{i=1}^{|D|} \frac{xor(x_i, y_i)}{|L|}, $$
# where
# - \\(|D|\\) is the number of samples
# - \\(|L|\\) is the number of labels
# - \\(y_i\\) is the ground truth
# - \\(x_i\\) is the prediction.
# 0.416666666667 (= (1+0+3+1) / (3*4) )
print('Hamming loss: {0}'.format(sklearn.metrics.hamming_loss(y_true, y_pred)))
Uscite:
Hamming score: 0.375
Subset accuracy: 0.25
Hamming loss: 0.416666666667
(1) Sorower, Mohammad S. " Un sondaggio sulla letteratura sugli algoritmi per l'apprendimento multi-etichetta. " Oregon State University, Corvallis (2010).
(2) Tsoumakas, Grigorios e Ioannis Katakis. " Classificazione multi-etichetta: una panoramica. " Dipartimento di Informatica, Università Aristotele di Salonicco, Grecia (2006).
(3) Ghamrawi, Nadia e Andrew McCallum. " Classificazione collettiva multietichetta. " Atti della 14a conferenza internazionale ACM sulla gestione delle informazioni e delle conoscenze. ACM, 2005.
(4) Godbole, Shantanu e Sunita Sarawagi. " Metodi discriminatori per la classificazione multietichettata. " Progressi nella scoperta della conoscenza e nel data mining. Springer Berlin Heidelberg, 2004. 22-30.