J'essaie de construire un classificateur multi-étiquettes afin d'affecter des sujets aux documents existants à l'aide de scikit
Je suis en train de traiter mes documents en les passant par les TfidfVectorizer
étiquettes à travers le MultiLabelBinarizer
et en créant un OneVsRestClassifier
avec un SGDClassifier
comme estimateur.
Cependant, lorsque je teste mon classificateur, je n'obtiens que des scores allant jusqu'à 0,29, ce qui d'après ce que j'ai lu est assez faible pour des problèmes similaires. J'ai essayé plusieurs options sur le TfidfVectorizer comme les mots vides, les unigrammes, le stemming et rien ne semble changer autant le résultat.
J'ai également utilisé GridSearchCV
pour obtenir les meilleurs paramètres pour mon estimateur et actuellement je n'ai plus d'idées sur ce qu'il faut essayer ensuite.
En même temps, ce que je comprends que je ne peux pas utiliser scikit.metrics
avec OneVsRestClassifier
alors comment puis - je obtenir de façon à comprendre ce qui ne va pas certains paramètres (F1, précision, rappel , etc.)?
Cela pourrait-il être un problème avec mon corpus de données?
Mise à jour: J'ai également essayé d' utiliser CountVectorizer
et HashingVectorizer
et les pipelining pour TfidfTransformer
mais les résultats sont similaires. Je suppose donc que l'approche du sac de mots fait mieux dans le domaine de la tokenisation et que le reste appartient au classificateur ...
score
sur le classificateur,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.
Réponses:
La précision du sous-ensemble est en effet une métrique sévère. Pour avoir une idée de la qualité du bon ou du mauvais 0,29, une idée:
Vous voudrez peut-être également calculer le score de hamming, pour voir si votre classificateur est sans aucune idée, ou s'il est plutôt bon, mais avez du mal à prédire correctement toutes les étiquettes. Voir ci-dessous pour calculer le score de hamming.
Voir Comment calculer la précision / le rappel pour la classification multiclasse-étiquette multiple? . J'ai oublié si sklearn le prend en charge, je me souviens qu'il avait certaines limites, par exemple sklearn ne prend pas en charge le multi-label pour la matrice de confusion . Ce serait une bonne idée de voir ces chiffres en effet.
Score de Hamming :
Dans un paramètre de classification à étiquettes multiples ,
sklearn.metrics.accuracy_score
ne calcule que la précision du sous - ensemble (3): c'est-à-dire que l'ensemble d'étiquettes prévu pour un échantillon doit correspondre exactement à l'ensemble d'étiquettes correspondant dans y_true.Cette façon de calculer la précision est parfois appelée, peut-être de manière moins ambiguë, rapport de correspondance exact (1):
Une autre façon typique de calculer la précision est définie en (1) et (2), et moins ambiguement appelée score de Hamming (4) (car elle est étroitement liée à la perte de Hamming), ou précision basée sur l'étiquette ). Il est calculé comme suit:
Voici une méthode python pour calculer le score de Hamming:
Les sorties:
(1) Sorower, Mohammad S. " Une étude de la littérature sur les algorithmes pour l'apprentissage multi-labels. " Oregon State University, Corvallis (2010).
(2) Tsoumakas, Grigorios et Ioannis Katakis. " Multi-label classification: An overview. " Dept. of Informatics, Université Aristote de Thessalonique, Grèce (2006).
(3) Ghamrawi, Nadia et Andrew McCallum. " Classification collective multi-labels " . Actes de la 14ème conférence internationale ACM sur la gestion de l'information et des connaissances. ACM, 2005.
(4) Godbole, Shantanu et Sunita Sarawagi. " Méthodes discriminatoires pour la classification multi-étiquetée. " Advances in Knowledge Discovery and Data Mining. Springer Berlin Heidelberg, 2004. 22-30.
la source
hamming_score
fonction génère des erreurs sur Keras: <ipython-input-34-16066d66dfdd> dans hamming_score (y_true, y_pred, normaliser, sample_weight) 60 '' '61 acc_list = [] ---> 62 pour i dans la plage (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: index retourné non-int (type NoneType )Le score de 0,29 n'est-il pas suffisant? À quoi ressemble votre matrice de confusion? Y a-t-il des sujets qui ne peuvent pas être séparés peut-être en ne regardant que le contenu des mots?
Sinon, essayez de contourner votre problème: supposez que les faibles scores sont en fait les meilleurs que votre classificateur puisse faire sur vos données. Cela signifierait que vos documents ne peuvent pas être classés en utilisant cette approche.
Pour tester cette hypothèse, vous avez besoin d'un ensemble de documents de test avec des caractéristiques connues de sac de mot (que vous créez vous-même). Vous devriez obtenir des scores de 100%.
Si vous ne le faites pas, vous avez un bug. Sinon, vous avez besoin d'une approche différente pour classer vos documents. Demandez-vous: en quoi les documents des différentes classes diffèrent-ils les uns des autres? Dois-je regarder d'autres fonctionnalités de mes documents, etc.
la source