O que é o classificador bayesiano ótimo?
O classificador bayesiano ótimo é o modelo que minimiza a probabilidade de erro de classificação. Ele atribui uma amostra à classe com maior probabilidade a posteriori, dada a evidência. Essa regra é chamada de regra de decisão de Bayes ou MAP (maximum a posteriori). Diferentemente de classificadores heurísticos, ele é matematicamente provado como ótimo. A optimalidade vale para qualquer problema, desde que as distribuições sejam conhecidas. O erro mínimo alcançável é chamado de erro de Bayes ou erro irredutível. Esse erro é devido à sobreposição natural entre as distribuições das classes. Portanto, nenhum outro classificador pode superar o bayesiano ótimo em termos de erro médio. Ele serve como um limite inferior teórico para avaliar outros algoritmos.
Características fundamentais
O classificador bayesiano ótimo possui três características principais que o definem. Primeiro, ele requer o conhecimento completo das distribuições condicionais P(x|classe). Segundo, ele usa a probabilidade a priori P(classe) para cada categoria. Terceiro, a decisão é determinística: escolhe a classe com maior P(classe|x). Ele pode ser generalizado para custos assimétricos (risco de Bayes). Nesse caso, minimiza o risco esperado, não apenas o erro bruto. O classificador ótimo é a base teórica para todos os outros métodos de classificação.
Vantagens e limitações
A principal vantagem é a garantia de desempenho máximo sob o modelo assumido. Ele é usado como referência para validar classificadores aproximados (ex.: SVM, redes neurais). Também é essencial em problemas de decisão com custos desiguais (ex.: diagnósticos). Contudo, na prática, as distribuições verdadeiras são desconhecidas. Portanto, ele é mais um conceito teórico do que um algoritmo implementável diretamente.
O erro de Bayes é calculado integrando a região de sobreposição das distribuições. Para duas classes com distribuições normais de mesma variância, a fronteira é linear. Se as variâncias são diferentes, a fronteira torna-se quadrática (análise discriminante quadrática). O classificador ótimo pode ser visto como um modelo generativo perfeito. Ele não sofre de overfitting porque usa as distribuições verdadeiras, não estimadas. Na prática, usamos aproximações como Naive Bayes ou QDA (Quadratic Discriminant Analysis). Essas aproximações estimam as distribuições a partir dos dados de treino. Quanto melhores as estimativas, mais próximo do ótimo estará o classificador. A teoria do erro de Bayes é fundamental para entender o viés e a variância. Ela mostra que o erro total = erro de Bayes + erro de estimativa + erro de aproximação. Isso guia a escolha entre modelos mais flexíveis (mais viés) ou mais complexos (mais variância). O classificador ótimo também é usado em problemas de detecção de sinais (ROC). A curva ROC traça a taxa de verdadeiros positivos vs. falsos positivos para diferentes limiares. Assim, o classificador bayesiano ótimo é um pilar da teoria da decisão estatística.
Um exemplo clássico é a classificação de duas espécies de flores com base no comprimento da pétala. Suponha que os comprimentos sigam distribuições normais com médias 3 e 5, e desvio 0.5. O ponto de corte ótimo (onde as densidades se cruzam) é a média ponderada pelas priores. Se as priores forem iguais, o corte é (3+5)/2 = 4.0. Esse é o classificador ótimo.
Enunciado do exemplo clássico
Implemente o classificador bayesiano ótimo para um problema de duas classes com distribuições normais conhecidas. Classe 0: X ~ N(μ₀=2, σ₀²=1.5). Classe 1: X ~ N(μ₁=6, σ₁²=2.0). Priores: P(0)=0.6, P(1)=0.4. Calcule a função de decisão analiticamente e plote as densidades, os prioris e a região de decisão. Calcule o erro de Bayes (integral da menor densidade ponderada). Classifique um novo ponto x=4.5 e mostre as probabilidades posteriores.
|
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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
import numpy as np import matplotlib.pyplot as plt from scipy.stats import norm from scipy.optimize import fsolve # Parâmetros das classes mu0, sigma0 = 2.0, np.sqrt(1.5) mu1, sigma1 = 6.0, np.sqrt(2.0) prior0 = 0.6 prior1 = 0.4 # Função densidade para cada classe def f0(x): return norm.pdf(x, mu0, sigma0) def f1(x): return norm.pdf(x, mu1, sigma1) # Função de decisão: P(0|x) = P(1|x) -> f0(x)*prior0 = f1(x)*prior1 def decisao(x): return f0(x)*prior0 - f1(x)*prior1 # Encontrar o ponto de corte (raiz da equação) # Usar dois chutes iniciais x_corte = fsolve(decisao, [3.5, 5.5]) # Pegar a raiz dentro do intervalo x_corte = x_corte[(x_corte > 0) & (x_corte < 10)][0] print(f"Ponto de corte ótimo: {x_corte:.4f}") # Classificador ótimo def classificar_otimo(x): # Se x < corte -> classe 0, senão classe 1 return 0 if x < x_corte else 1 # Testar um novo ponto x_novo = 4.5 classe_pred = classificar_otimo(x_novo) # Calcular posteriores post0 = f0(x_novo)*prior0 / (f0(x_novo)*prior0 + f1(x_novo)*prior1) post1 = 1 - post0 print(f"\nPara x = {x_novo}:") print(f" P(Classe 0 | x) = {post0:.4f}") print(f" P(Classe 1 | x) = {post1:.4f}") print(f" Classe predita: {classe_pred}") # Calcular erro de Bayes (integral da área de sobreposição ponderada) # Definir a região de integração x_vals = np.linspace(-2, 10, 1000) # Decisão: classifica como 0 se x < x_corte, senão 1 # Erro = P(1)*P(x∈R0|1) + P(0)*P(x∈R1|0) # R0 = região onde decidimos classe 0 (x < x_corte) erro_bayes = (prior1 * norm.cdf(x_corte, mu1, sigma1) + prior0 * (1 - norm.cdf(x_corte, mu0, sigma0))) print(f"\nErro de Bayes (mínimo possível): {erro_bayes:.4f}") # Plotar plt.figure(figsize=(12, 5)) plt.subplot(1, 2, 1) x_grid = np.linspace(-2, 10, 500) plt.plot(x_grid, f0(x_grid), 'b-', linewidth=2, label=f'Classe 0: N({mu0},{sigma0**2:.1f})') plt.plot(x_grid, f1(x_grid), 'r-', linewidth=2, label=f'Classe 1: N({mu1},{sigma1**2:.1f})') plt.plot(x_grid, f0(x_grid)*prior0, 'b--', linewidth=1.5, label='Prior 0 * densidade') plt.plot(x_grid, f1(x_grid)*prior1, 'r--', linewidth=1.5, label='Prior 1 * densidade') plt.axvline(x_corte, color='green', linestyle=':', linewidth=3, label=f'Corte = {x_corte:.3f}') # Preencher região de erro (sobreposição) plt.fill_between(x_grid, np.minimum(f0(x_grid)*prior0, f1(x_grid)*prior1), alpha=0.3, color='gray', label='Área de erro') plt.xlabel('x') plt.ylabel('Densidade de probabilidade') plt.title('Classificador Bayesiano Ótimo - Densidades e Região de Erro') plt.legend() plt.grid(True) plt.subplot(1, 2, 2) # Mostrar posteriores para o novo ponto x_plot = np.linspace(-2, 10, 200) post0_plot = f0(x_plot)*prior0 / (f0(x_plot)*prior0 + f1(x_plot)*prior1) post1_plot = 1 - post0_plot plt.plot(x_plot, post0_plot, 'b-', label='P(Classe 0 | x)') plt.plot(x_plot, post1_plot, 'r-', label='P(Classe 1 | x)') plt.axhline(0.5, color='gray', linestyle='--', label='Limiar 0.5') plt.axvline(x_corte, color='green', linestyle=':', label=f'Corte = {x_corte:.3f}') plt.scatter([x_novo], [post0], color='blue', s=100, zorder=5, label=f'Novo x={x_novo}') plt.xlabel('x') plt.ylabel('Probabilidade a posteriori') plt.title('Probabilidades Posteriores') plt.legend() plt.grid(True) plt.tight_layout() plt.show() |
Este código implementa o classificador ótimo com distribuições normais conhecidas. O ponto de corte é encontrado igualando as densidades ponderadas pelos prioris. A área sombreada em cinza representa o erro de Bayes (sobreposição). As posteriores para o novo ponto mostram a incerteza da classificação. O erro de Bayes calculado é o menor erro possível para esse problema. Para iniciantes, este exemplo conecta teoria estatística à decisão prática. O classificador bayesiano ótimo é, portanto, um referencial teórico fundamental.