Comment utiliser Naive Bayes pour la classification de texte multi-étiquettes dans R.
J'ai essayé d'utiliser naiveBayes () de la bibliothèque e1071 mais il semble que pendant la formation, il n'accepte pas la variable de classe multi-étiquettes.
J'ai créé TermDocumentMatrix en utilisant le corpus de document texte et j'ai essayé de créer le modèle en utilisant cette matrice et cette variable de classe (liste des sujets auxquels appartient un document particulier). Voici le code que j'ai utilisé.
trainvector <- as.vector(traindata$bodyText)
trainsource <- VectorSource(trainvector)
traincorpus <- Corpus(trainsource)
trainmatrix <- t(TermDocumentMatrix(traincorpus))
model <- naiveBayes(as.matrix(trainmatrix), as.factor(traindata$topics))
La dernière ligne donne l'erreur ci-dessous:
Error in sort.list(y) : 'x' must be atomic for 'sort.list'
Avez-vous appelé «trier» sur une liste?
J'ai essayé d'utiliser
model <- naiveBayes(as.matrix(trainmatrix), as.factor(unlist(traindata$topics)))
mais a obtenu une erreur:
Error in tapply(var, y, mean, na.rm = TRUE) :
arguments must have same length
multilabel-classification
naive-bayes-classifier
Gaurav Joshi
la source
la source
Réponses:
Depuis généralement, les alogorithmes naïfs bayésiens implémentés par la plupart des bibliothèques ne prennent pas en charge la classification multilabel. Bien que vous puissiez concevoir votre propre algorithme en s'inspirant de l'approche naïve des bayes.
Pour une classe particulière c et document d (avec 3 mots w1, w2, w3)
«/» signifie «donné» p (a / b) = probabilité (a donné b)
Selon le théorème de bayes.
p (c / d) = p (c, d) / p (d)
p (c / d) = (p (c) * p (d / c)) / p (d)
où:
p (d / c) = p (w1 / c) * p (w2 / c) * p (w3 / c)
Puisque les mots sont supposés indépendants les uns des autres.
Et p (w1 / c) peut être obtenu en utilisant votre code, en calculant le nombre de w1 à l'intérieur des documents de classe c divisé par le nombre total de w1 dans tous les documents ou vous pouvez utiliser votre propre logique
Mais si vous voulez éviter d'écrire du code détaillé
vous pouvez restructurer vos données d'entrée pour obtenir une classification multi-étiquettes. de sorte qu'un document donné d avec n étiquettes / classes (par exemple d étiqueté avec c1, c2, c3) soit étendu en données de n échantillons (3 ici) du même document d avec une étiquette différente à chaque fois ((d, c1), ( d, c2), (d, c3)). Vous pouvez maintenant transmettre ces données dans n'importe quelle bibliothèque R / python prenant en charge les bayes naïfs multinomiaux. La même chose doit également être effectuée dans votre ensemble de données. Actuellement, vous passez des sujets traindata $ qui sont des variables y (étiquettes de formation) telles quelles, sans modification.
Même après avoir formé vos données à l'aide de cette approche. Vous devez utiliser un seuil de probabilité, par exemple 0,2, afin que les étiquettes de classe avec une probabilité supérieure à 0,2 soient attribuées à ce document de test.
Une meilleure approche qui nécessite de restructurer votre apport
Si vous avez des étiquettes «n» de classe, vous pouvez former «n» différents classificateurs bayésiens naïfs binaires pour chacune des classes. Par exemple, pour former un classificateur pour la classe «c1», vous entraînez un classificateur bayésien naïf avec la variable dépendante Y indiquant la présence de la classe c1 sur ce document comme «1» et l'absence comme «0».
Après avoir formé le classificateur bayésien naïf binaire naïf en utilisant cette approche. Vous allez maintenant utiliser la sortie de ces n classificateurs. par exemple, si parmi ceux-ci, n classificateurs, si un classificateur particulier, qui correspond à la classe «c1» a une probabilité de sortie supérieure à 0,5, alors l'étiquette de classe «c1» sera affectée à ce document de test.
la source