Desvendando o Poder do Naive Bayes: Uma Jornada pela Simplicidade na Ciência de Dados

André Almeida
7 min readDec 9, 2023

--

No aprendizado de máquina, uma técnica que brilha pela sua simplicidade e eficácia é o Naive Bayes. Derivado do teorema de Bayes, que já falamos sobre neste post aqui, o Naive Bayes é um método particularmente útil em problemas de classificação e análise de texto.

Neste artigo, exploraremos a essência do Naive Bayes, com foco no Gaussian Naive Bayes, desvendando sua equação fundamental e discutindo os cenários ideais para sua aplicação.

Origens e Aplicações

O Naive Bayes tem suas raízes no teorema de Bayes, nomeado em homenagem ao matemático Thomas Bayes. Este teorema é uma ferramenta poderosa para a atualização de probabilidades com base em novas evidências. Ao incorporar a ingenuidade (naive) de assumir independência entre os recursos, o Naive Bayes simplifica o cálculo, tornando-o adequado para grandes conjuntos de dados.

Na ciência de dados, o Naive Bayes é frequentemente utilizado em tarefas de classificação, como a categorização de e-mails como spam ou não spam, análise de sentimentos em textos ou diagnóstico médico. Sua aplicação abrange desde áreas tradicionais até inovações em inteligência artificial.

Naive Bayes: Desmistificando a Equação

Photo by Mika Baumeister on Unsplash

Os métodos de Naive Bayes são um conjunto de algoritmos de aprendizado supervisionado baseados na aplicação do teorema de Bayes com a “ingênua” suposição de independência condicional entre cada par de características, dada a variável de classe. A equação central é derivada do teorema de Bayes:

Equação (1)

onde:

  • P(y x1​,x2​,…,xn​) é a probabilidade condicional da classe y dado os recursos x1​,x2​,…,xn​.
  • P(y) é a probabilidade priori da classe y.
  • P(xi​ ∣ y) é a probabilidade condicional de um valor específico do recurso xi​ dado y.
  • P(xi​) é a probabilidade priori do recurso xi​.

Na equação acima, P(x1​,x2​,…,xn​) pode ser considerado constante dado que os valores de entrada não mudam. Logo a equação pode ser escrita da seguinte forma:

Equação (2)

Podemos então usar a Estimação Máxima a Posteriori (MAP) para estimar P(y) e P(xi ∣ y​); o primeiro é então a frequência relativa da classe y​ no conjunto de treinamento. Falaremos mais sobre eles a seguir.

Aplicando o Naive Bayes:

Para tornar isso mais tangível, vamos considerar um exemplo simples. Suponha que queremos classificar e-mails como spam ou não spam com base em duas características: a presença da palavra “oferta” e o número de vezes que um ponto de exclamação é usado. Aqui, y representa a classe (spam ou não spam), x1​ é a presença da palavra “oferta”, e x2​ é o número de exclamações.

Suponhamos que temos um conjunto de treinamento com os seguintes dados fictícios:

Spam (y=1):

  • x1​: Presente
  • x2​: Média de 5 exclamações

Não Spam (y=0):

  • x1​: Ausente
  • x2​: Média de 1 exclamação

Agora, recebemos um novo e-mail de teste com as características:

  • x1​: Presente
  • x2​: 4 exclamações

Vamos calcular a probabilidade condicional para as classes y=0 (não spam) e y=1 (spam) usando a equação do Gaussian Naive Bayes.

P(y=0 ∣ x1​,x2​) ∝ P(y=0) ⋅ P(x1​=Presente ∣ y=0) ⋅ P(x2​=4 ∣ y=0)

P(y=1 ∣ x1​,x2​) ∝ P(y=1) ⋅ P(x1​=Presente ∣ y=1) ⋅ P(x2​=4 ∣ y=1)

Para realizar a classificação, comparamos as probabilidades calculadas e atribuímos o e-mail à classe com a probabilidade mais alta. Neste caso, se P(y=1 ∣ x1​,x2​) > P(y=0 ∣ x1​,x2​), classificamos o e-mail como spam; caso contrário, como não spam.

Este exemplo ilustra como o Naive Bayes pode ser aplicado a dados numéricos para realizar tarefas de classificação de forma eficaz, mesmo com suposições ingênuas sobre a independência dos recursos.

Gaussian Naive Bayes

Dentre as variantes do Naive Bayes, o Gaussian Naive Bayes se destaca quando lidamos com dados contínuos e assumimos que cada recurso segue uma distribuição normal (Gaussiana).

Aqui, analisamos a verossimilhança (Likelihood) de um valor específico de uma característica, assumindo que conhecemos a classe à qual a observação pertence.

Equação (3)

Observe a imagem a seguir. Imagine um recurso (atributo) em que os dados iniciais possuem as distribuições apresentadas para as duas classes. Considerando um valor xi = 4, temos um Likelihood de 0 para a classe 2, e um Likelihood de aproximadamente 0.05 para a classe 1.

O Gaussian Naive Bayes é mais eficaz quando lidamos com dados contínuos e assumimos distribuição normal. Portanto, é particularmente útil em problemas nos quais os recursos podem ser modelados dessa maneira, como medições físicas, pontuações ou contagens.

Aplicando Gaussian Naive Bayes ao Conjunto de Dados Iris com Scikit-Learn

Vamos agora exemplificar a aplicação do Gaussian Naive Bayes usando Python e a biblioteca Scikit-Learn. Utilizaremos o conjunto de dados Iris, que contém medidas de pétalas e sépalas de três espécies de flores.

O conjunto de dados Iris é um conjunto clássico na área de aprendizado de máquina e estatística, amplamente utilizado para fins de treinamento e demonstração. Ele foi introduzido por Sir Ronald A. Fisher em 1936 e consiste em medidas de pétalas e sépalas de três espécies diferentes de flores do gênero Iris.

As três espécies (classes) presentes no conjunto de dados Iris são: Setosa, Versicolor e Virginica

Cada flor é caracterizada por quatro recursos (atributos): Comprimento da sépala, Largura da sépala, Comprimento da pétala e Largura da pétala.

Devido à sua simplicidade e estrutura bem definida, o conjunto de dados Iris é uma excelente escolha para demonstrar conceitos e técnicas em aprendizado de máquina. Vamos treinar um modelo Gaussian Naive Bayes para predizer a espécie da flor Iris.

O objetivo aqui é simplesmente treinar um modelo mais simples possível com o algoritmo do Naive Bayes.

# Importando bibliotecas necessárias
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, classification_report
from sklearn.datasets import load_iris

# Carregando o conjunto de dados Iris
iris = load_iris()
X = iris.data
y = iris.target

# Dividindo o conjunto de dados em treino e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Inicializando o modelo Gaussian Naive Bayes
gnb = GaussianNB()

# Treinando o modelo
gnb.fit(X_train, y_train)

# Realizando predições no conjunto de teste
y_pred = gnb.predict(X_test)

# Avaliando o desempenho do modelo
accuracy = accuracy_score(y_test, y_pred)

# Imprimindo resultados
print(f'Acurácia do modelo:\n{accuracy:.2f}\n')
print(f"Quantidade de amostras por classe:\n{gnb.class_count_}\n")
print(f"Probabilidade de cada classe:\n{gnb.class_prior_}\n")
print(f"Variância de cada recurso (feature) por classe:\n{gnb.var_}\n")
print(f"Média de cada recurso (feature) por classe:\n{gnb.theta_}")

Para este exemplo temos a seguinte saída:

Acurácia do modelo:
0.98

Quantidade de amostras por classe:
[31. 37. 37.]

Probabilidade de cada classe:
[0.2952381 0.35238095 0.35238095]

Variância de cada recurso (feature) por classe:
[[0.1119667 0.13658689 0.03325703 0.01152966]
[0.27532506 0.08724617 0.23934259 0.04134405]
[0.42241052 0.09630387 0.28842951 0.08591673]]

Média de cada recurso (feature) por classe:
[[4.96451613 3.37741935 1.46451613 0.2483871 ]
[5.86216216 2.72432432 4.21081081 1.3027027 ]
[6.55945946 2.98648649 5.54594595 2.00540541]]

Um modelo com 98% de acurácia.

Mas nosso objetivo aqui é olhar outra coisa. A probabilidade de cada classe P(y) e a variância e média de cada recurso por classe.

A probabilidade P(y) é calculada dividindo a quantidade de amostras de cada classe pelo total de amostras.

O algoritmo do Naive Bayes no Scikit-Learn usa os dados de variância e média dos dados de treino para calcular a probabilidade condicional de cada atributo para cada classe usando a equação 3 apresentada nesse artigo.

Na implementação do Scikit-Learn, a equação geral do teorema de Bayes é usada com a premissa de distribuição normal para calcular P(xi ​∣ y) para cada recurso xi​ e classe y.

Aprendemos como é calculado P(y) e P(xi | y). Logo, é possível calcular P(y | x1,x2,…xn) e definir qual tem a maior probabilidade!

Conclusão

O Naive Bayes destaca-se pela sua simplicidade e eficácia. O Gaussian Naive Bayes, ao incorporar a distribuição normal, oferece uma abordagem elegante para problemas de classificação com dados contínuos. Seu desempenho sólido e requisitos computacionais modestos faz com que ele seja uma escolha valiosa em várias situações.

Ao empregar o Naive Bayes, os cientistas de dados podem realizar análises preditivas com relativa facilidade, obtendo resultados rápidos e interpretações claras. Em um campo tão dinâmico quanto a ciência de dados, o Naive Bayes destaca-se como uma ferramenta confiável e poderosa, lembrando-nos de que, muitas vezes, a simplicidade é a chave para a compreensão e o sucesso.

--

--

André Almeida

Sou Engenheiro Eletricista que atualmente trabalha na área da Indústria 4.0 com Ciência de Dados e Inteligência Artificial.