Verwendung von Naive Bayes für die Klassifizierung von Text mit mehreren Etiketten in R.
Ich habe versucht, naiveBayes () aus der e1071-Bibliothek zu verwenden, aber es scheint, dass während des Trainings keine Klassenvariablen mit mehreren Labels akzeptiert werden.
Ich habe TermDocumentMatrix mithilfe des Textdokumentkorpus erstellt und versucht, das Modell mithilfe dieser Matrix und Klassenvariablen zu erstellen (Liste der Themen, zu denen ein bestimmtes Dokument gehört). Unten ist der Code, den ich verwendet habe.
trainvector <- as.vector(traindata$bodyText)
trainsource <- VectorSource(trainvector)
traincorpus <- Corpus(trainsource)
trainmatrix <- t(TermDocumentMatrix(traincorpus))
model <- naiveBayes(as.matrix(trainmatrix), as.factor(traindata$topics))
Die letzte Zeile gibt den folgenden Fehler an:
Error in sort.list(y) : 'x' must be atomic for 'sort.list'
Haben Sie auf einer Liste "sortieren" genannt?
Ich habe es versucht
model <- naiveBayes(as.matrix(trainmatrix), as.factor(unlist(traindata$topics)))
habe aber Fehler bekommen:
Error in tapply(var, y, mean, na.rm = TRUE) :
arguments must have same length
multilabel-classification
naive-bayes-classifier
Gaurav Joshi
quelle
quelle
Antworten:
Da Naive Bayes-Alogorithmen, die von den meisten Bibliotheken implementiert werden, im Allgemeinen keine Multilabel-Klassifizierung unterstützen. Obwohl Sie Ihren eigenen Algorithmus entwickeln können, der sich vom naiven Bayes-Ansatz inspirieren lässt.
Für eine bestimmte Klasse c und Dokument d (mit 3 Wörtern w1, w2, w3)
'/' steht für 'gegebenes' p (a / b) = Wahrscheinlichkeit (a gegebenes b)
Nach dem Bayes-Theorem.
p (c / d) = p (c, d) / p (d)
p (c / d) = (p (c) · p (d / c)) / p (d)
wo:
p (d / c) = p (w1 / c) · p (w2 / c) · p (w3 / c)
Da Wörter als unabhängig voneinander angenommen werden.
Und p (w1 / c) kann mit Ihrem Code erhalten werden, indem die Anzahl von w1 in Dokumenten der Klasse c geteilt durch die Gesamtanzahl von w1 in allen Dokumenten berechnet wird, oder Sie können Ihre eigene Logik verwenden
Aber wenn Sie vermeiden möchten, detaillierten Code zu schreiben
Sie können Ihre Eingabedaten umstrukturieren, um eine Klassifizierung mit mehreren Labels zu erreichen. so dass ein gegebenes Dokument d mit n Bezeichnungen / Klassen (z. B. d, das mit c1, c2, c3 gekennzeichnet ist) in Daten von n Proben (3 hier) desselben Dokuments d mit jeweils unterschiedlicher Bezeichnung ((d, c1), () erweitert wird d, c2), (d, c3)). Jetzt können Sie diese Daten an jede R / Python-Bibliothek übergeben, die multinomiale naive Bayes unterstützt. Gleiches muss auch in Ihrem Datensatz erfolgen. Derzeit übergeben Sie Traindata $ -Themen, die unverändert y-variabel (Trainingsbezeichnungen) sind, ohne Änderungen.
Auch nachdem Sie Ihre Daten mit diesem Ansatz trainiert haben. Sie müssen einen Wahrscheinlichkeitsschwellenwert verwenden, z. B. 0,2, damit diesem Testdokument Klassenbezeichnungen mit einer Wahrscheinlichkeit über 0,2 zugewiesen werden.
Besserer Ansatz, der eine Umstrukturierung Ihrer Eingabe erfordert
Wenn Sie 'n' Klassenbezeichnungen haben, können Sie 'n' verschiedene binäre naive Bayes-Klassifikatoren für jede Klasse trainieren. Zum Trainieren eines Klassifikators für die Klasse 'c1' trainieren Sie beispielsweise einen naiven Bayes-Klassifikator mit der abhängigen Variablen Y, die das Vorhandensein der Klasse c1 in diesem Dokument als '1' und das Fehlen der Klasse '0' bezeichnet.
Nachdem Sie 'n' binären naiven Bayes-Klassifikator mit diesem Ansatz trainiert haben. Sie werden nun die Ausgabe dieser n Klassifikatoren verwenden. Wenn beispielsweise von diesen n Klassifizierern ein bestimmter Klassifizierer, der der Klasse 'c1' entspricht, eine Ausgabewahrscheinlichkeit über 0,5 hat, wird diesem Testdokument die Klassenbezeichnung 'c1' zugewiesen.
quelle