Implementando complementar ingênuo Bayes em python?

9

Problema

Tentei usar bayes Naive em um conjunto de dados rotulados de dados sobre crimes, mas obtive resultados realmente ruins (precisão de 7%). Naive Bayes corre muito mais rápido do que outros alogoritmos que eu estou usando, então eu queria tentar descobrir por que a pontuação era tão baixa.

Pesquisa

Depois de ler, descobri que os bayes ingênuos deveriam ser usados ​​com conjuntos de dados balanceados, pois possuem um viés para classes com maior frequência. Como meus dados estão desequilibrados, eu queria tentar usar o Complementary Naive Bayes, pois ele é feito especificamente para lidar com distorções de dados. No artigo que descreve o processo, o aplicativo é para classificação de texto, mas não vejo por que a técnica não funcionaria em outras situações. Você pode encontrar o artigo ao qual estou me referindo aqui . Em resumo, a idéia é usar pesos com base nas ocorrências em que uma classe não aparece.

Depois de fazer algumas pesquisas, consegui encontrar uma implementação em Java, mas infelizmente não conheço nenhum Java e simplesmente não entendo o algoritmo suficientemente bem para me implementar.

Questão

onde posso encontrar uma implementação em python? Se isso não existir, como devo implementá-lo eu mesmo?

gafanhoto
fonte

Respostas:

5

Naive Bayes deve ser capaz de lidar com conjuntos de dados desequilibrados. Lembre-se de que a fórmula de Bayes é

P(yx)=P(xy)P(y)P(x)P(xy)P(y)

Então leva em consideração o .P(xy)P(y)P(y)

No seu caso, talvez você se ajuste demais e precise de alguma suavização? Você pode começar com a suavização de +1 e ver se há alguma melhoria. Em python, ao usar numpy, eu implementaria a suavização desta maneira:

table = # counts for each feature 
PT = (table + 1) / (table + 1).sum(axis=1, keepdims=1)

Observe que isso fornece a você Multinomial Naive Bayes - que se aplica apenas a dados categóricos.

Também posso sugerir o seguinte link: http://www.itshared.org/2015/03/naive-bayes-on-apache-flink.html . Trata-se de implementar o Naive Bayes no Apache Flink. Embora seja Java, talvez seja uma teoria que você precisa entender melhor o algoritmo.

Alexey Grigorev
fonte
Você pode estar correto: parece que Bayes ingênuo só tem o problema de desequilíbrio na classificação do texto. Você pode explicar o que é suavização?
gafanhoto
Você já deu uma olhada no link? Está explicado lá. Em resumo, ao estimar às vezes nunca é visto durante o treinamento e a suavização garante que não estrague o desempenho do classificador adicionando uma contagem extra (no caso de laplace ou +1 suavização) a todos os recursos . xP(xy)x
Alexey Grigorev
0

Minha implementação do Complement Naive Bayes no scikit-learn pode ser encontrada aqui .

airalcorn2
fonte