Pergunta

Estou usando um classificador Naive Bayes para categorizar vários milhares de documentos em 30 categorias diferentes.Implementei um classificador Naive Bayes e, com alguma seleção de recursos (principalmente filtrando palavras inúteis), obtive uma precisão de teste de cerca de 30%, com precisão de treinamento de 45%.Isso é significativamente melhor do que aleatório, mas quero que seja melhor.

Tentei implementar o AdaBoost com NB, mas não parece dar resultados sensivelmente melhores (a literatura parece dividida sobre isso, alguns artigos dizem que o AdaBoost com NB não dá melhores resultados, outros dão).Você conhece alguma outra extensão do NB que possa fornecer melhor precisão?

Foi útil?

Solução

Na minha experiência, classificadores Naive Bayes devidamente treinados são geralmente surpreendentemente precisos (e muito rápidos de treinar - visivelmente mais rápidos do que qualquer construtor de classificador que já usei).

então, quando quiser melhorar a previsão do classificador, você pode procurar em vários lugares:

  • ajuste seu classificador (ajustando os parâmetros ajustáveis ​​do classificador);

  • aplicar algum tipo de técnica de combinação de classificador (por exemplo, conjunto, reforço, ensacamento);ou você pode

  • Olhe para os dados alimentado ao classificador - ou adicionar mais dados, melhorar a sua análise básica, ou refinar as funcionalidades que seleccionou os dados.

com classificadores bayesianos ingênuos, o ajuste de parâmetros é limitado;recomendo focar em seus dados - ou seja, na qualidade do pré-processamento e na seleção de recursos.

EU.Análise de dados (pré-processamento)

presumo que seus dados brutos sejam algo como uma sequência de texto bruto para cada ponto de dados, que por meio de uma série de etapas de processamento você transforma cada sequência em um vetor estruturado (matriz 1D) para cada ponto de dados, de modo que cada deslocamento corresponda a um recurso ( geralmente uma palavra) e o valor nesse deslocamento corresponde à frequência.

  • derivação:manualmente ou usando uma biblioteca de lematização?os populares de código aberto são Porter, Lancaster e Snowball.Assim para instância, se tiver os termos programador, programa, progamma, programado num dado ponto de dados, um stemmer irá reduzi-los a um haste única (provavelmente programa) para que o seu termo vector para esses dados ponto terá um valor de 4 para o programa de recurso, que é Provavelmente o que tu queres.

  • descoberta de sinônimo:a mesma ideia da lematização - juntar palavras relacionadas em uma única palavra;para que um localizador de sinónimos possa identificar programador, programador, programador, e engenheiro de software e enrolá-los num único termo

  • palavras neutras:palavras com frequências semelhantes entre classes apresentam recursos ruins


II.Seleção de recursos

considere um caso de uso prototípico para NBCs:filtragem de spam;você pode ver rapidamente como ele falha e com a mesma rapidez como melhorá-lo.Por exemplo, filtros de spam acima da média possuem recursos diferenciados como:frequência das palavras em caixa alta, frequência das palavras no título e ocorrência de ponto de exclamação no título.Além disso, as melhores características geralmente não são palavras isoladas, mas, por exemplo, pares de palavras ou grupos maiores de palavras.

III.Otimizações específicas do classificador

Em vez de 30 aulas use um Esquema 'um contra muitos'--em outras palavras, você começa com um classificador de duas classes (Classe A e 'todo o resto') e então os resultados na classe 'todo o resto' são retornados ao algoritmo para classificação em Classe B e 'todo o resto', etc. .

O Método Fisher (provavelmente a maneira mais comum de optimizar um classificador Naive Bayes.) Para mim, Penso no Fisher como normalizando (mais corretamente, padronização) as probabilidades de entrada Um NBC usa as probabilidades de recurso para construir uma probabilidade de 'documento inteiro'.O Método Fisher calcula a probabilidade de uma categoria para cada A característica do documento então combina essas probabilidades de características e compara essa probabilidade combinada com a probabilidade de um conjunto aleatório de características.

Outras dicas

Eu sugeriria usar um Sgdclassifier como em isto e sintonizá -lo em termos de força de regularização.

Tente também ajustar a fórmula no TFIDF que você está usando ajustando os parâmetros de Tfifvectorizer.

  • Eu geralmente vejo isso para problemas de classificação de texto SVM ou regressio logístico Quando treinado, um verso supera o NB. Como você pode ver em Este bom artigo de Stanford People Para documentos mais longos, o SVM supera o NB. O código para o artigo que usa uma combinação de SVM e NB (Nbsvm) é aqui.

  • Segundo, ajuste sua fórmula TFIDF (por exemplo, sublinear tf, smooth_idf).

  • Normalizar Suas amostras com normalização L2 ou L1 (padrão no TFIDFVectorização) porque compensa diferentes comprimentos de documentos.

  • Perceptron multicamada, geralmente obtém melhores resultados que o NB ou o SVM por causa da não linearidade introduzida, o que é inerente a muitos problemas de classificação de texto. Eu implementei um altamente paralelo usando o Theano/Lasagne, que é fácil de usar e download aqui.

  • Tente Sintonize sua regularização L1/L2/Elasticnet. Faz uma enorme diferença na regressão SGDClassifier/SVM/Logistic.

  • Tente usar n-gramas que é configurável no TFIDFVectorizer.

  • Se seus documentos têm estrutura (por exemplo títulos) Considere usar recursos diferentes para diferentes partes. Por exemplo, adicione title_word1 ao seu documento se o Word1 acontecer no título do documento.

  • Considere usar o comprimento do documento como um recurso (por exemplo, número de palavras ou caracteres).

  • Considere usar Meta informação sobre o documento (por exemplo, tempo da criação, nome do autor, URL do documento, etc.).

  • Recentemente Facebook publicou o deles Código de classificação FastText que tem um desempenho muito bom em muitas tarefas, certifique -se de experimentar.

Usando a correção de Laplacian junto com o AdaBoost.

No AdaBoost, primeiro um peso é atribuído a cada tupla de dados no conjunto de dados de treinamento. Os pesos íntimos são definidos usando o init_weights método, que inicializa cada peso a ser 1/d, Onde d é o tamanho do conjunto de dados de treinamento.

Então uma generate_classifiers o método é chamado, que é executado k vezes, criando k Instâncias do classificador ingênuo de Bayes. Esses classificadores são então ponderados e os dados de teste são executados em cada classificador. A soma dos "votos" ponderados dos classificadores constitui a classificação final.

Manter o tamanho N pequeno também faz com que o NB forneça alta precisão. e no centro, à medida que o tamanho n aumenta sua precisão se degradam,

Selecione os recursos que têm menos correlação entre eles. E tente usar diferentes combinações de recursos por vez.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top