O que são classificadores bayesianos?
Classificadores bayesianos são modelos probabilísticos que atribuem uma classe a uma amostra usando o teorema de Bayes. Eles calculam a probabilidade a posteriori de cada classe dado os atributos observados. A classe escolhida é aquela com maior probabilidade posterior (regra de decisão de Bayes). Esses classificadores são generativos: modelam a distribuição conjunta de atributos e classes. Diferentemente de modelos discriminativos, eles podem lidar com dados faltantes naturalmente. O classificador Naive Bayes é o mais famoso, assumindo independência condicional entre atributos. Apesar dessa suposição forte, ele funciona surpreendentemente bem na prática. Classificadores bayesianos também fornecem uma medida de incerteza em cada predição. Isso é crucial em aplicações críticas como diagnóstico médico e detecção de fraudes.
Características fundamentais
Esses classificadores possuem três características principais que os distinguem. Primeiro, eles exigem conhecimento prévio (prior) das probabilidades das classes. Segundo, a verossimilhança é calculada a partir da distribuição dos atributos em cada classe. Terceiro, a decisão é baseada na regra de Bayes com minimização do erro esperado. Eles podem ser paramétricos (assumindo distribuições como normal) ou não-paramétricos (kernel). Além disso, eles são facilmente atualizáveis com novos dados (aprendizado incremental). A complexidade de treinamento é baixa, especialmente no caso Naive Bayes.
Vantagens e aplicações típicas
A principal vantagem é a interpretabilidade e a robustez a ruídos. Eles são usados em filtros de spam, análise de sentimentos e classificação de textos. Também são aplicados em sistemas de recomendação e diagnósticos médicos. Contudo, a suposição de independência pode ser violada em dados reais.
O classificador Naive Bayes é derivado da suposição de que os atributos são independentes dado a classe. Isso simplifica o cálculo: P(classe | atributos) ∝ P(classe) * ∏ P(atributoᵢ | classe). Para atributos contínuos, assume-se frequentemente uma distribuição normal (Gaussian Naive Bayes). Para atributos discretos, usa-se frequências ou suavização de Laplace. A suavização evita probabilidades zero para combinações não vistas no treino. O classificador bayesiano ótimo (sem independência) requer a estimativa da conjunta completa. Isso é inviável para muitas variáveis, daí a popularidade do Naive Bayes. Outra variante é o TAN (Tree-Augmented Naive Bayes), que relaxa a independência. Ele adiciona arestas entre atributos para capturar correlações significativas. Apesar de mais complexo, o TAN melhora a acurácia em muitos conjuntos. Classificadores bayesianos também podem ser usados com prioris não-informativos. Isso é útil quando não se tem conhecimento prévio sobre as classes. A saída probabilística permite definir limiares de confiança para rejeição de decisões. Assim, classificadores bayesianos são ferramentas versáteis e didáticas.
Um exemplo clássico é a classificação de flores Iris (Setosa, Versicolor, Virginica) usando comprimento e largura das pétalas. O Naive Bayes gaussiano separa bem as classes com alta acurácia. A fronteira de decisão é suave e quadrática devido às diferentes variâncias.
Enunciado do exemplo clássico
Implemente um classificador Naive Bayes gaussiano para o dataset Iris (usando apenas duas características: comprimento e largura da pétala). Divida os dados em treino (70%) e teste (30%). Treine o modelo calculando médias e variâncias por classe. Classifique os dados de teste e calcule a acurácia. Plote a fronteira de decisão no espaço 2D e a matriz de confusão.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay # Carregar dados Iris (apenas duas características) iris = load_iris() X = iris.data[:, 2:4] # comprimento e largura da pétala y = iris.target nomes_classes = iris.target_names # Dividir treino/teste X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # Treinar Naive Bayes Gaussiano modelo = GaussianNB() modelo.fit(X_train, y_train) y_pred = modelo.predict(X_test) acuracia = np.mean(y_pred == y_test) print(f"Acurácia no teste: {acuracia:.3f}") # Matriz de confusão cm = confusion_matrix(y_test, y_pred) # Plotar fronteira de decisão x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5 y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5 xx, yy = np.meshgrid(np.linspace(x_min, x_max, 200), np.linspace(y_min, y_max, 200)) Z = modelo.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) plt.figure(figsize=(12, 5)) # Gráfico 1: Fronteira de decisão plt.subplot(1, 2, 1) plt.contourf(xx, yy, Z, alpha=0.3, cmap='viridis') # Plotar pontos de treino e teste for i, classe in enumerate(nomes_classes): idx_train = (y_train == i) idx_test = (y_test == i) plt.scatter(X_train[idx_train, 0], X_train[idx_train, 1], marker='o', edgecolor='black', s=60, label=f'{classe} (treino)') plt.scatter(X_test[idx_test, 0], X_test[idx_test, 1], marker='x', edgecolor='red', s=80, label=f'{classe} (teste)') plt.xlabel('Comprimento da pétala (cm)') plt.ylabel('Largura da pétala (cm)') plt.title('Fronteira de Decisão - Naive Bayes Gaussiano') plt.legend() plt.grid(True) # Gráfico 2: Matriz de confusão plt.subplot(1, 2, 2) ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=nomes_classes).plot(ax=plt.gca(), cmap='Blues') plt.title(f'Matriz de Confusão (Acurácia = {acuracia:.3f})') plt.tight_layout() plt.show() # Mostrar probabilidades para uma nova flor nova_flor = np.array([[4.5, 1.2]]) # comprimento e largura da pétala probs = modelo.predict_proba(nova_flor) print(f"\nPrevisão para pétala (4.5, 1.2):") for i, classe in enumerate(nomes_classes): print(f" P({classe}) = {probs[0][i]:.3f}") print(f"Classe predita: {nomes_classes[modelo.predict(nova_flor)[0]]}") |
Este código treina um Naive Bayes gaussiano no dataset Iris com duas características. A fronteira de decisão mostra regiões quadráticas separando as três classes. A matriz de confusão revela o desempenho detalhado do classificador. O modelo também fornece probabilidades para novas amostras. Para iniciantes, este exemplo conecta teoria bayesiana à prática de classificação. Classificadores bayesianos são, portanto, uma porta de entrada para aprendizado supervisionado.