Algoritmo de Classificação Naive Bayes


Algoritmo de Classificação Naive Bayes

Utilidade

O algoritmo “Naive Bayes” é um classificador probabilístico baseado no “Teorema de Bayes”, o qual foi criado por Thomas Bayes (1701 - 1761) para tentar provar a existência de Deus.

Thomas Bayes (1701 - 1761)

Atualmente, o algoritmo se tornou popular na área de Aprendizado de Máquina (Machine Learning) para categorizar textos baseado na frequência das palavras usadas, e assim pode ser usado para identificar se determinado e-mail é um SPAM ou sobre qual assunto se refere determinado texto, por exemplo.

Por ser muito simples e rápido, possui um desempenho relativamente maior do que outros classificadores. Além disso, o Naive Bayes só precisa de um pequeno número de dados de teste para concluir classificações com uma boa precisão.

A principal característica do algoritmo, e também o motivo de receber “naive” (ingênuo) no nome, é que ele desconsidera completamente a correlação entre as variáveis (features). Ou seja, se determinada fruta é considerada uma “Maçã” se ela for “Vermelha”, “Redonda” e possui “aproximadamente 10cm de diâmetro”, o algoritmo não vai levar em consideração a correlação entre esses fatores, tratando cada um de forma independente.

Determinando probabilidades

Para entender um pouco melhor como funciona o classificador, vamos a um exemplo rápido:

Digamos que estamos trabalhando no diagnóstico de uma nova doença, e que fizemos testes em 100 pessoas distintas.

Após coletarmos a análise, descobrimos que 20 pessoas possuíam a doença (20%) e 80 pessoas estavam saudáveis (80%), sendo que das pessoas que possuíam a doença, 90% receberam Positivo no teste da doença, e 30% das pessoas que não possuíam a doença também receberam o teste positivo.

Listando esses dados de uma forma mais clara, temos:

  • 100 pessoas realizaram o teste.
  • 20% das pessoas que realizaram o teste possuíam a doença.
  • 90% das pessoas que possuíam a doença, receberam positivo no teste.
  • 30% das pessoas que não possuíam a doença, receberam positivo no teste.

A pergunta neste caso seria: Se uma nova pessoa realizar o teste e receber um resultado positivo, qual a probabilidade de ela possuir a doença?

O algoritmo de Naive Bayes consiste em encontrar uma probabilidade a posteriori (possuir a doença, dado que recebeu um resultado positivo), multiplicando a probabilidade a priori (possuir a doença) pela probabilidade de “receber um resultado positivo, dado que tem a doença”.

Devemos também computar a probabilidade a posteriori da negação (Não possuir a doença, dado que recebeu um resultado Positivo).

Ou seja:

  • P(doença|positivo) = 20% * 90%
  • P(doença|positivo) = 0,2 * 0,9
  • P(doença|positivo) = 0,18
  • P(não doença|positivo) = 80% * 30%
  • P(não doença|positivo) = 0,8 * 0,3
  • P(não doença|positivo) = 0,24

Após isso precisamos normalizar os dados, para que a soma das duas probabilidades resulte 1 (100%).

Para isso, dividimos o resultado pela soma das duas probabilidades.

Exemplo:

  • P(doença|positivo) = 0,18/(0,18+0,24) = 0,4285
  • P(não doença|positivo) = 0,24/(0,18+0,24) = 0,5714
  • 0,4285 + 0,5714 = 0,9999.. ou aproximadamente 1.


A fórmula se apresenta desta maneira:

Teorema de Bayes

Podemos concluir que se o resultado do teste da nova pessoa for positivo, ela possui aproximadamente 43% (0,4285) de chance de estar doente.

Implementação em Python

Ao estudar sobre Inteligência Artificial, é inevitável receber algum tipo de contato com a linguagem de programação Python.

O principal motivo são as grandes bibliotecas que tratam e implementam os algoritmos mais usados em Aprendizado de Máquina.

Uma das mais famosas, é a biblioteca Scikit Learn (ou sklearn).

O Sklearn implementa o Naive Bayes de 3 formas:

  1. Gaussian;
  2. Multinomial;
  3. Bernoulli;

Cada implementação é utilizada para objetivos diferentes.

Implementação em Ruby

No Github podemos encontrar a implementação do Naive Bayes em diversas linguagens, incluindo Ruby.

A gem “nbayes” implementa de uma forma muito simples de usar para classificar texto.
Exemplo:

# Criar um classificador
nbayes = NBayes::Base.new
# Treinar o classificador com exemplos - as palavras da String são divididas em um array
nbayes.train( "You need to buy some Viagra".split(/\s+/), 'SPAM' )
nbayes.train( "This is not spam, just a letter to Bob.".split(/\s+/), 'HAM' )
nbayes.train( "Hey Oasic, Do you offer consulting?".split(/\s+/), 'HAM' )
nbayes.train( "You should buy this stock".split(/\s+/), 'SPAM' )

# Dividir mensagem que precisa ser classificada
tokens = "Now is the time to buy Viagra cheaply and discreetly".split(/\s+/)
result = @nbayes.classify(tokens)
# Imprime a classe em que o texto foi classificado. (SPAM ou HAM)
p result.max_class
# Imprime a probabilidade da mensagem ser SPAM
p result['SPAM']
# Imprime a probabilidade da mensagem ser HAM
p result['HAM']

Conclusão

Se o problema for classificar texto ou algo do gênero, o Naive Bayes é uma das melhores alternativas. Se a correlação entre os fatores forem extremamente importantes, o Naive Bayes pode falhar na predição da nova informação.

Algumas utilidades práticas:

  • Previsões em tempo real: Por possuir uma velocidade relativamente alta e precisar apenas de poucos dados para realizar a classificação, o Naive Bayes pode ser utilizado para previsões em tempo real.
  • Classificação de textos/Filtragem de spam/Análise de sentimento: Muito utilizado para filtragem de SPAM, Análise de Sentimento nas redes sociais (identificar se o usuário está feliz ou triste ao publicar determinado texto).

O entendimento do algoritmo pode ser confuso no início. Abaixo deixo alguns links (em inglês) que explicam de outras maneiras esta técnica:

Gostou? Então não perca nenhum post, assine nosso blog! 




Por
13/04/2017

Coordenador de Tecnologia na Orgânica Digital. Baixista e Beatlemaníaco.


Assine nosso blog

Não perca nenhuma novidade!

Assine nosso blog

Não perca nenhuma novidade!