Naive-Bayes : Teoria e implementação do zero

Guilherme Michel L. de Carvalho
Computando Arte
Published in
5 min readDec 7, 2020
Foto de Rob Necciai, fonte: Unsplash

Primeiro artigo da série de Teoria e implementação do zero. A ideia dessa série é abordar a teoria de algoritmos clássicos de aprendizado de máquina com implementação própria, sem emprego de pacotes prontos. Para este artigo em particular foi utilizado apenas a biblioteca numpy. Esse exercício é importante para fixar os conceitos dos métodos, acredito que a melhor maneira de aprender qualquer coisa é ensinando o computador o que ele deve fazer em detalhes. Esse artigo aqui presente foi fortemente baseado no livro Aprendizado de máquina: uma abordagem estatística, para mais detalhes e mais métodos de aprendizado de máquina sugiro a leitura. Então, vamos lá!

O Naive-Bayes ou Bayes Ingênuo é um classificador probabilístico baseado do Teorema de Bayes. Antes de falar sobre o Naive-Bayes vamos definir primeiro o que é um problema de classificação.

Problema de classificação

Digamos que temos um conjunto de observações independentes e a partir desse conjunto queremos uma função que possa classificar novas observações de mesma natureza. Ou seja,

Fonte: Aprendizado de máquina: uma abordagem estatística

Neste caso a variável resposta Y é qualitativa.

Por exemplo, o conjunto de dados Breast Cancer Wisconsin sobre câncer de mama é composto de 569 observações. Neste conjunto, para cada observação existem 30 características sobre o núcleo celular presente em imagens computadorizadas. Além disso, associado a cada observação existe um rótulo ou classe, sendo eles 0 ou 1. Em que 0 indica que a pessoa possui um câncer maligno e 1 se possui um benigno. Suponha que queremos um modelo que a partir das características dos núcleos celulares retorna as probabilidades das observações pertencerem a cada uma das classes (maligno ou benigno).

Para construir a função g(x) para tal fim, podemos calcular a probabilidade do individuo pertencer à classe c com base nas informações sobre ele. Matematicamente isso equivale a calcular P(y=c|x), e em seguida escolher a classe com maior probabilidade.

Fonte: Aprendizado de máquina: uma abordagem estatística

Thomas Bayes

Thomas Bayes, fonte: Wikipedia

Thomas Bayes foi um estatístico inglês que produziu diversas contribuições para estatística e probabilidade incluindo o famoso Teorema de Bayes.

Teorema de Bayes

Teorema de bayes, fonte: Wikipedia

Aplicando o Teorema de Bayes para estimar P(Y=c |x), assumindo que x seja um vetor de covariáveis contínuas de dimensão d:

Fonte: Aprendizado de máquina: uma abordagem estatística

Bom, agora o problema é estimar P(Y=c) e as densidades condicionais f(x|Y=s ) para cada uma das classes. Para estimar P(Y=c) basta calcular a proporção de elementos da classe ‘c’ no conjunto de dados. Já para estimar f(x|Y=s), o método de Naive-Bayes assume que as covariáveis são independentes condicionalmente à classe. Daí que vem o nome de Bayes Ingênuo, geralmente as covariáveis não são independentes, mas no entanto, mesmo com essa suposição, podemos ter boas predições usando o método.

Fonte: Aprendizado de máquina: uma abordagem estatística

Agora, nos resta estimar cada f(x_j |Y=s). Para isto, pode-se assumir que a distribuição de cada uma dessas covariáveis condicionalmente as classes são de uma distribuição normal, ou seja:

Fonte: Aprendizado de máquina: uma abordagem estatística

Para estimar a média e variância das distribuições pode-se usar o método da máxima verossimilhança:

Fonte: Aprendizado de máquina: uma abordagem estatística

Em que ‘C_s’ é o conjunto das observações da classe ‘s’. Por exemplo, no conjunto de dados de câncer, temos duas classes. Sendo assim, temos que estimar a média e variância de cada covariável j condicionalmente a cada uma das duas classes. Para termos o estimador das densidades condicionais basta substituir as estimativas de média e variância:

Fonte: Aprendizado de máquina: uma abordagem estatística

Bom, agora temos tudo que é necessário para estimar P(Y=c |x)! Para simplificar , vamos ver o que acontece em classificação binária:

Para obtermos a classificação de uma observação em particular basta pegar a classe com maior probabilidade. Note que o denominador é o mesmo nas duas estimativas, na prática para reduzir tempo computacional pode-se simplesmente ignorar o denominador e portanto a classificação será dada por:

Fonte: Aprendizado de máquina: uma abordagem estatística

Note também que nas equações acima, da segunda para terceira linha foi aplicado o logaritmo. Isto ocorreu pelo fato de que o produto das densidades condicionais são produtos de valores pequenos, sendo assim pode-se ter problemas numéricos se não for utilizado o logaritmo.

Implementação

Primeiramente vamos criar uma função que recebe os rótulos das observações de um conjunto de dados e extrai os índices das observações de cada classe do conjunto de dados. A saída dessa função vai ser uma lista de listas. Cada sublista é a lista de índices das observações de uma classe em particular.

Agora vamos criar outra função para estimar as probabilidades das classes ocorrerem no conjunto treino. Essa função receberá os rótulos e os índices do vetor de rótulos respectivo a cada classe e retornará as probabilidades estimadas

Agora vamos criar uma função para estimar a média e variância via máxima verossimilhança para as distribuições de cada covariável condicionalmente a cada classe:

Supondo que cada covariável condicionalmente a cada classe provém de uma distribuição normal, precisaremos também calcular os valores da distribuição, sendo assim:

Por fim, vamos criar uma função que recebe o conjunto de treino e estima todos as quantias necessárias para fazer as predições:

E agora, uma última função para predizer observações em um conjunto de dados que não foi usado para obter as estimativas:

Agora vamos verificar o potencial do Bayes Ingênuo no conjunto de dados sobre câncer:

A acurácia do Naive-Bayes no conjunto de teste foi de 0.951048951048951

Muito bom para um classificador ingênuo não acham? Uma acurácia de 95% no conjunto de teste!

Fonte: Giphy

Pergunta: Será que é possível adaptar o Bayes Ingênuo para o caso de covariáveis que não são contínuas e portanto não se pode supor que possuam distribuição normal, como por exemplo com covariáveis discretas?

Referências

[1] Aprendizado de máquina: Uma abordagem estatística (2020), Rafael Izbicki e Tiago Mendonça.

[2] Breast Cancer Wisconsin Data Set, Machine Learning Repository, UCI.

--

--

Guilherme Michel L. de Carvalho
Computando Arte

BSc in Applied and Computacional Mathematics, MSc in Statistics. Now Data Scientist working with financial data.