Como usar Naive Bayes para classificação de texto com vários rótulos em R.
Eu tentei usar naiveBayes () da biblioteca e1071, mas parece que durante o treinamento, ele não aceita variáveis de classe com vários rótulos.
Criei TermDocumentMatrix usando o corpus do documento de texto e tentei criar o modelo usando essa matriz e variável de classe (lista de tópicos aos quais um documento específico pertence). Abaixo está o código que eu usei.
trainvector <- as.vector(traindata$bodyText)
trainsource <- VectorSource(trainvector)
traincorpus <- Corpus(trainsource)
trainmatrix <- t(TermDocumentMatrix(traincorpus))
model <- naiveBayes(as.matrix(trainmatrix), as.factor(traindata$topics))
A última linha mostra abaixo o erro:
Error in sort.list(y) : 'x' must be atomic for 'sort.list'
Você chamou 'classificar' em uma lista?
Eu tentei usar
model <- naiveBayes(as.matrix(trainmatrix), as.factor(unlist(traindata$topics)))
mas obteve erro:
Error in tapply(var, y, mean, na.rm = TRUE) :
arguments must have same length
multilabel-classification
naive-bayes-classifier
Gaurav Joshi
fonte
fonte
Respostas:
Como geralmente, os alogoritmos do Naive bayes implementados pela maioria das bibliotecas não suportam a classificação de vários rótulos. Embora você possa criar seu próprio algoritmo, inspirando-se na abordagem ingênua de bayes.
Para uma classe específica c e documento d (com 3 palavras w1, w2, w3)
'/' significa 'dado' p (a / b) = probabilidade (um dado b)
Conforme o teorema de bayes.
p (c / d) = p (c, d) / p (d)
p (c / d) = (p (c) * p (d / c)) / p (d)
Onde:
p (d / c) = p (w1 / c) * p (w2 / c) * p (w3 / c)
Como as palavras são consideradas independentes umas das outras.
E p (w1 / c) pode ser obtido usando seu código, calculando a contagem de w1 dentro dos documentos da classe c divididos pela contagem geral de w1 em todos os documentos ou você pode usar sua própria lógica
Mas se quiser evitar escrever código detalhado
você pode reestruturar seus dados de entrada para obter a classificação de vários rótulos. de modo que um determinado documento d com n etiquetas / classes (por exemplo, d marcado com c1, c2, c3) seja expandido para dados de n amostras (3 aqui) do mesmo documento d com rótulo diferente a cada vez ((d, c1), ( d, c2), (d, c3)). Agora você pode passar esses dados para qualquer biblioteca R / python que suporte bayes multinomiais ingênuos. O mesmo precisa ser feito no seu conjunto de dados também. Atualmente, você está passando os tópicos $ de dados que são variáveis y (rótulos de treinamento), sem modificações.
Mesmo depois de treinar seus dados usando essa abordagem. Você precisa usar um limite de probabilidade, por exemplo, 0,2, para que os rótulos de classe com probabilidade acima de 0,2 sejam atribuídos a esse documento de teste.
Abordagem melhor que exige reestruturar sua contribuição
Se você tiver 'n' rótulos de classe, poderá treinar 'n' diferentes classificadores binários ingênuos para cada classe. Por exemplo, para treinar um classificador para a classe 'c1', você treina um classificador ingênuo de bayes com a variável dependente Y, indicando a presença da classe c1 nesse documento como '1' e a ausência como '0'.
Depois de treinar o classificador 'n' binário ingênuo de bayes usando essa abordagem. Agora você usará a saída desses n classificadores. por exemplo, se um desses n classificadores, se um classificador específico que corresponde à classe 'c1' tiver uma probabilidade de saída acima de 0,5, o rótulo da classe 'c1' será atribuído a este documento de teste.
fonte