Desvendando o Poder do Naive Bayes: Uma Jornada pela Simplicidade na Ciência de Dados
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
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:
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:
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.
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.