La precisión del subconjunto es de hecho una métrica severa. Para tener una idea de lo bueno o malo que es 0.29, alguna idea:
- mira cuántas etiquetas tienes un promedio para cada muestra
- mire el acuerdo entre anotadores, si está disponible (si no, intente ver qué precisión de subconjunto se obtiene cuando es el clasificador)
- pensar si el tema está bien definido
- mira cuántas muestras tienes para cada etiqueta
También es posible que desee calcular la puntuación de hamming, para ver si su clasificador no tiene idea, o si es bastante bueno, pero tiene problemas para predecir todas las etiquetas correctamente. Vea a continuación para calcular el puntaje de Hamming.
Al mismo tiempo, por lo que entiendo, no puedo usar scikit.metrics con OneVsRestClassifier, entonces, ¿cómo puedo obtener algunas métricas (F1, Precisión, Recuperación, etc.) para descubrir qué está mal?
Consulte ¿Cómo calcular la precisión / recuperación para la clasificación multiclase-multilabel? . Olvidé si sklearn lo admite, recuerdo que tenía algunas limitaciones, por ejemplo, sklearn no admite etiquetas múltiples para matriz de confusión . Sería una buena idea ver estos números de hecho.
Puntuación de Hamming :
En una configuración de clasificación de múltiples etiquetas , sklearn.metrics.accuracy_score
solo calcula la precisión del subconjunto (3): es decir, el conjunto de etiquetas pronosticado para una muestra debe coincidir exactamente con el conjunto de etiquetas correspondiente en y_true.
Esta forma de calcular la precisión se denomina a veces, quizás menos ambiguamente, relación de coincidencia exacta (1):
Otra forma típica de calcular la precisión se define en (1) y (2), y se conoce de manera menos ambigua como el puntaje de Hamming (4) (ya que está estrechamente relacionado con la pérdida de Hamming), o precisión basada en etiquetas . Se calcula de la siguiente manera:
Aquí hay un método de Python para calcular la puntuación de 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)))
Salidas:
Hamming score: 0.375
Subset accuracy: 0.25
Hamming loss: 0.416666666667
(1) Sorower, Mohammad S. " Una encuesta bibliográfica sobre algoritmos para el aprendizaje de etiquetas múltiples " . Oregon State University, Corvallis (2010).
(2) Tsoumakas, Grigorios e Ioannis Katakis. " Clasificación multi-etiqueta: una visión general " . Departamento de Informática, Universidad Aristóteles de Salónica, Grecia (2006).
(3) Ghamrawi, Nadia y Andrew McCallum. " Clasificación colectiva de etiquetas múltiples " . Actas de la 14ª conferencia internacional de ACM sobre gestión de la información y el conocimiento. ACM, 2005.
(4) Godbole, Shantanu y Sunita Sarawagi. " Métodos discriminatorios para la clasificación de etiquetas múltiples " . Avances en el descubrimiento de conocimiento y la minería de datos. Springer Berlin Heidelberg, 2004. 22-30.