Ich versuche, einen Multi-Label-Klassifikator zu erstellen, um vorhandenen Dokumenten mithilfe von Scikit Themen zuzuweisen
Ich bearbeite meine Dokumente, indem ich sie über TfidfVectorizer
die Etiketten durch die MultiLabelBinarizer
und OneVsRestClassifier
mit einerSGDClassifier
als Schätzer erstellte.
Beim Testen meines Klassifikators erhalte ich jedoch nur Punkte bis zu 0,29 , was nach meiner Lektüre für ähnliche Probleme ziemlich niedrig ist. Ich habe mehrere Optionen auf dem TfidfVectorizer ausprobiert, wie Stoppwörter, Unigramme, Stemming und nichts scheint das Ergebnis so sehr zu verändern.
Habe ich auch benutzt GridSearchCV
, um die besten Parameter für meinen Schätzer zu erhalten, und derzeit habe ich keine Ideen, was ich als nächstes versuchen soll.
Gleichzeitig kann ich nach meinem Verständnis nicht verwenden scikit.metrics
, mit OneVsRestClassifier
wie kann ich einige Metriken erhalten (F1, Präzision, Rückruf usw.), um herauszufinden , was falsch ist?
Könnte es ein Problem mit meinem Datenkorpus sein?
Update: Ich habe auch versucht, sie zu verwenden CountVectorizer
und zu HashingVectorizer
pipelining, TfidfTransformer
aber die Ergebnisse sind ähnlich. Ich vermute also, dass der Bag-of-Word-Ansatz im Bereich der Tokenisierung am besten funktioniert und der Rest dem Klassifikator überlassen bleibt ...
quelle
score
auf dem Klassifikator läuft ,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.
Antworten:
Die Genauigkeit der Teilmenge ist in der Tat eine harte Metrik. Um ein Gefühl dafür zu bekommen, wie gut oder schlecht 0,29 ist, haben wir eine Idee:
Sie können auch die Hamming-Punktzahl berechnen, um festzustellen, ob Ihr Klassifikator ahnungslos oder anständig gut ist, aber Probleme bei der korrekten Vorhersage aller Bezeichnungen haben. Siehe unten, um die Hamming-Punktzahl zu berechnen.
Siehe Berechnen der Genauigkeit / des Rückrufs für die Klassifizierung mit mehreren Klassen und mehreren Etiketten. . Ich habe vergessen , ob sklearn es unterstützt, ich erinnere es einige Einschränkungen hatte, zB sklearn nicht Multi-Label für Verwirrung Matrix unterstützt . Das wäre eine gute Idee, um diese Zahlen in der Tat zu sehen.
Hamming-Punktzahl :
In einer Multilabel Klassifizierung Einstellung
sklearn.metrics.accuracy_score
berechnet nur die Teilmenge Genauigkeit (3) : dh die für eine Stichprobe vorhergesagte Menge von Etiketten muss genau mit der entsprechenden Menge von Etiketten in y_true übereinstimmen.Diese Art der Genauigkeitsberechnung wird manchmal, vielleicht weniger eindeutig, als genaues Übereinstimmungsverhältnis (1) bezeichnet:
Eine andere typische Methode zur Berechnung der Genauigkeit ist in (1) und (2) definiert und wird weniger eindeutig als Hamming-Punktzahl (4) (da sie in engem Zusammenhang mit dem Hamming-Verlust steht) oder kennzeichnungsbasierte Genauigkeit bezeichnet . Es wird wie folgt berechnet:
Hier ist eine Python-Methode, um die Hamming-Punktzahl zu berechnen:
Ausgänge:
(1) Sorower, Mohammad S. " Eine Literaturübersicht über Algorithmen für Multi-Label-Lernen. " Oregon State University, Corvallis (2010).
(2) Tsoumakas, Grigorios und Ioannis Katakis. " Multi-Label-Klassifizierung: Ein Überblick. " Fakultät für Informatik, Aristoteles-Universität von Thessaloniki, Griechenland (2006).
(3) Ghamrawi, Nadia und Andrew McCallum. " Collective Multi-Label-Klassifizierung ". Vorträge der 14. internationalen ACM-Konferenz zu Informations- und Wissensmanagement. ACM, 2005.
(4) Godbole, Shantanu und Sunita Sarawagi. " Diskriminierende Methoden für die mehrfach gekennzeichnete Klassifizierung. " Fortschritte bei Knowledge Discovery und Data Mining. Springer Berlin Heidelberg, 2004. 22-30.
quelle
hamming_score
Funktion Fehler auf Keras: <ipython-input-34-16066d66dfdd> in Hamming_score (y_true, y_pred, normalize, sample_weight) 60 '' '61 acc_list = [] ---> 62 für i in range (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 zurückgegeben non-int (Typ NoneType )Reicht der Wert von 0.29 nicht aus? Wie sieht Ihre Verwirrungsmatrix aus? Gibt es Themen, die sich nicht trennen lassen, wenn man sich nur den Wortinhalt ansieht?
Versuchen Sie andernfalls, Ihr Problem umzukehren: Hypothese, dass die niedrigen Werte tatsächlich das Beste sind, was Ihr Klassifikator für Ihre Daten tun kann. Das würde bedeuten, dass Ihre Dokumente mit diesem Ansatz nicht klassifizierbar sind.
Um diese Hypothese zu testen, benötigen Sie eine Reihe von Testdokumenten mit bekannten Bag-of-Word-Merkmalen (die Sie selbst erstellen). Sie sollten 100% Punkte bekommen.
Wenn Sie dies nicht tun, haben Sie einen Fehler. Andernfalls benötigen Sie einen anderen Ansatz zur Klassifizierung Ihrer Dokumente. Fragen Sie sich: Wie unterscheiden sich die Dokumente aus den verschiedenen Klassen voneinander? Muss ich mir andere Funktionen meiner Dokumente usw. ansehen?
quelle