Estoy tratando de construir un clasificador de etiquetas múltiples para asignar temas a documentos existentes usando scikit
Estoy procesando mis documentos pasándolos a través de las TfidfVectorizer
etiquetas MultiLabelBinarizer
y creando un OneVsRestClassifier
con un SGDClassifier
estimador.
Sin embargo, cuando pruebo mi clasificador solo obtengo puntajes de hasta .29, que según lo que he leído es bastante bajo para problemas similares. Probé varias opciones en el TfidfVectorizer, como palabras vacías, unigramas, derivaciones y nada parece cambiar tanto el resultado.
También solía GridSearchCV
obtener los mejores parámetros para mi estimador y actualmente no tengo ideas sobre qué probar a continuación.
Al mismo tiempo, por lo que entiendo que no puedo usar scikit.metrics
con el OneVsRestClassifier
modo cómo puedo conseguir algunas métricas (F1, precisión, cobertura, etc.) con el fin de averiguar lo que está mal?
¿Podría ser un problema con mi corpus de datos?
Actualización: También he intentado usar CountVectorizer
y HashingVectorizer
y la canalización a TfidfTransformer
pero los resultados son similares. Así que supongo que el enfoque de la bolsa de palabras está funcionando mejor en el dominio de tokenización y el resto depende del clasificador ...
fuente
score
en el clasificador,Returns the mean accuracy on the given test data and labels. In multi-label classification, this is the subset accuracy which is a harsh metric since you require for each sample that each label set be correctly predicted.
Respuestas:
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:
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.
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:
Salidas:
(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.
fuente
hamming_score
errores de función en Keras: <ipython-input-34-16066d66dfdd> en hamming_score (y_true, y_pred, normalize, sample_weight) 60 '' '61 acc_list = [] ---> 62 para i en rango (y_true.shape [ 0]): 63 set_true = set (np.where (y_true [i]) [0]) 64 set_pred = set (np.where (y_pred [i]) [0]) TypeError: índice devuelto non-int (tipo NoneType )¿El puntaje de 0.29 no es suficiente? ¿Cómo es tu matriz de confusión? ¿Hay algunos temas que no se pueden separar quizás solo mirando el contenido de la palabra?
De lo contrario, intente resolver su problema: suponga que los puntajes bajos son en realidad lo mejor que su clasificador puede hacer en sus datos. Eso significaría que sus documentos no son clasificables utilizando este enfoque.
Para probar esta hipótesis, necesita un conjunto de documentos de prueba con características conocidas de bolsa de palabras (que usted mismo crea). Deberías obtener puntajes del 100%.
Si no lo hace, entonces tiene un error. De lo contrario, necesita un enfoque diferente para clasificar sus documentos. Pregúntese: ¿en qué se diferencian los documentos de las diferentes clases? ¿Necesito mirar otras características de mis documentos, etc.
fuente