O que é a teoria da decisão bayesiana?
A teoria da decisão bayesiana é um arcabouço matemático para tomar decisões sob incerteza. Ela combina probabilidades (crenças) com custos ou utilidades associados a cada ação. A decisão ótima minimiza o risco esperado, ou maximiza a utilidade esperada. O risco é calculado integrando a perda sobre a distribuição a posteriori dos parâmetros. Diferentemente da abordagem frequentista, ela incorpora conhecimento prévio (prior). A decisão é adaptativa: novos dados atualizam a posteriori e a escolha ótima. Ela é usada em diagnósticos, controle, economia e aprendizado de máquina. A teoria formaliza o princípio de que “a melhor ação depende do que sabemos”. Portanto, ela une estatística, otimização e teoria dos jogos.
Componentes fundamentais da decisão bayesiana
A teoria possui três elementos principais que a estruturam. Primeiro, o espaço de estados (parâmetros ou classes) com distribuição a priori. Segundo, o espaço de ações disponíveis para o decisor. Terceiro, uma função de perda L(θ, a) que mede o custo de tomar ação a quando o estado é θ. A decisão bayesiana escolhe a ação que minimiza o risco posterior: R(a|x) = E[L(θ,a) | x]. Para perda quadrática, a decisão é a média da posteriori. Para perda 0-1 (classificação), a decisão é a moda (MAP).
Vantagens e aplicações típicas
A principal vantagem é a flexibilidade para incorporar custos assimétricos. Ela é usada em diagnósticos médicos (falso negativo tem custo alto). Também em finanças (perda vs. ganho) e em sistemas de recomendação. Contudo, a especificação da função de perda é subjetiva e desafiadora.
A teoria da decisão bayesiana é a base do aprendizado supervisionado probabilístico. No contexto de classificação, a perda 0-1 leva ao classificador MAP. Se a perda for assimétrica, define-se uma matriz de custos. Por exemplo, em detecção de fraudes, o custo de não detectar é muito maior. A decisão ótima pode escolher a classe com menor custo esperado, não a mais provável. A regra de decisão de Bayes minimiza o erro esperado em média. Ela também pode ser usada para seleção de modelos (fator de Bayes). Em problemas de estimação, a perda quadrática produz a média a posteriori. A perda absoluta produz a mediana da posteriori. A teoria também trata de decisões sequenciais com múltiplos estágios. Nesse caso, usa-se programação dinâmica ou processos de decisão de Markov (POMDP). A função de utilidade pode ser não-linear, representando aversão ao risco. A teoria é frequentemente contrastada com a abordagem minimax (pior caso). Assim, a decisão bayesiana é uma ferramenta poderosa e flexível para escolhas racionais.
Um exemplo clássico é o problema do diagnóstico de uma doença rara. A priori: P(doente) = 0.01. Teste com sensibilidade 95% e especificidade 90%. Custos: falso negativo (não tratar doente) = 100, falso positivo (tratar saudável) = 1. A decisão bayesiana calcula o custo esperado de tratar ou não tratar, dado o teste positivo.
Enunciado do exemplo clássico
Implemente a decisão bayesiana para um problema de diagnóstico com custos assimétricos. Prior: P(doente) = 0.02. Teste binário com sensibilidade P(pos|doente)=0.90 e especificidade P(neg|saudável)=0.85. Matriz de custos: C(tratar | saudável) = 10, C(não tratar | doente) = 100, C(tratar | doente) = 0, C(não tratar | saudável) = 0. Calcule o risco esperado de cada ação (tratar vs não tratar) para um resultado positivo e negativo. Plote os riscos como função da probabilidade a priori de doença.
|
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 92 93 94 95 96 97 98 99 |
import numpy as np import matplotlib.pyplot as plt # Dados do problema prior_doente = 0.02 sensibilidade = 0.90 especificidade = 0.85 # Matriz de custos: [ação][estado] # Ação 0: não tratar, Ação 1: tratar # Estado 0: saudável, Estado 1: doente C = np.array([[0, 100], # [não tratar][saudável, doente] [10, 0]]) # [tratar][saudável, doente] # Probabilidades do teste P_pos_dado_doente = sensibilidade P_neg_dado_doente = 1 - sensibilidade P_pos_dado_saudavel = 1 - especificidade P_neg_dado_saudavel = especificidade # Função para calcular probabilidades posteriores e riscos def decisao(prior_doente, resultado): # resultado: 'pos' ou 'neg' if resultado == 'pos': P_pos = prior_doente * P_pos_dado_doente + (1-prior_doente) * P_pos_dado_saudavel P_doente_dado_pos = prior_doente * P_pos_dado_doente / P_pos P_saudavel_dado_pos = 1 - P_doente_dado_pos # Risco de não tratar R_nao_tratar = C[0,0] * P_saudavel_dado_pos + C[0,1] * P_doente_dado_pos # Risco de tratar R_tratar = C[1,0] * P_saudavel_dado_pos + C[1,1] * P_doente_dado_pos return R_nao_tratar, R_tratar, P_doente_dado_pos, P_saudavel_dado_pos else: # negativo P_neg = prior_doente * P_neg_dado_doente + (1-prior_doente) * P_neg_dado_saudavel P_doente_dado_neg = prior_doente * P_neg_dado_doente / P_neg P_saudavel_dado_neg = 1 - P_doente_dado_neg R_nao_tratar = C[0,0] * P_saudavel_dado_neg + C[0,1] * P_doente_dado_neg R_tratar = C[1,0] * P_saudavel_dado_neg + C[1,1] * P_doente_dado_neg return R_nao_tratar, R_tratar, P_doente_dado_neg, P_saudavel_dado_neg # Calcular para teste positivo R_nao_pos, R_trata_pos, P_doente_pos, P_saud_pos = decisao(prior_doente, 'pos') print("Resultado POSITIVO:") print(f" P(doente | pos) = {P_doente_pos:.4f}") print(f" Risco não tratar = {R_nao_pos:.2f}") print(f" Risco tratar = {R_trata_pos:.2f}") print(f" Decisão: {'TRATAR' if R_trata_pos < R_nao_pos else 'NÃO TRATAR'}") # Calcular para teste negativo R_nao_neg, R_trata_neg, P_doente_neg, P_saud_neg = decisao(prior_doente, 'neg') print("\nResultado NEGATIVO:") print(f" P(doente | neg) = {P_doente_neg:.4f}") print(f" Risco não tratar = {R_nao_neg:.2f}") print(f" Risco tratar = {R_trata_neg:.2f}") print(f" Decisão: {'TRATAR' if R_trata_neg < R_nao_neg else 'NÃO TRATAR'}") # Gráfico: risco como função do prior para resultado positivo priors = np.linspace(0.001, 0.1, 100) risco_nao = [] risco_trat = [] for p in priors: R_nao, R_trat, _, _ = decisao(p, 'pos') risco_nao.append(R_nao) risco_trat.append(R_trat) plt.figure(figsize=(12, 5)) plt.subplot(1, 2, 1) plt.plot(priors, risco_nao, 'b-', linewidth=2, label='Risco: Não tratar') plt.plot(priors, risco_trat, 'r-', linewidth=2, label='Risco: Tratar') # Marcar ponto do prior atual idx = np.argmin(np.abs(priors - prior_doente)) plt.axvline(prior_doente, color='gray', linestyle='--', label=f'Prior = {prior_doente}') plt.scatter(prior_doente, risco_nao[idx], color='blue', s=80) plt.scatter(prior_doente, risco_trat[idx], color='red', s=80) plt.xlabel('Probabilidade a priori de doença') plt.ylabel('Risco esperado') plt.title('Risco da Decisão (teste positivo)') plt.legend() plt.grid(True) plt.subplot(1, 2, 2) # Mostrar a matriz de custos e resumo texto = (f"Matriz de Custos:\n" f" Saudável Doente\n" f"Não tratar 0 100\n" f"Tratar 10 0\n\n" f"Sensibilidade = {sensibilidade:.2f}\n" f"Especificidade = {especificidade:.2f}\n\n" f"Prior = {prior_doente:.3f}\n" f"P(doente | pos) = {P_doente_pos:.3f}\n" f"Decisão (pos): {'TRATAR' if R_trata_pos < R_nao_pos else 'NÃO TRATAR'}\n" f"Decisão (neg): {'TRATAR' if R_trata_neg < R_nao_neg else 'NÃO TRATAR'}") plt.text(0.1, 0.5, texto, fontsize=12, family='monospace', bbox=dict(facecolor='lightyellow', alpha=0.9)) plt.axis('off') plt.title('Resumo da Decisão Bayesiana') plt.tight_layout() plt.show() |
Este código implementa a decisão bayesiana com custos assimétricos. O risco de tratar ou não tratar é calculado para cada resultado do teste. O gráfico mostra como os riscos variam com a probabilidade a priori. A decisão ótima muda conforme a prior e os custos relativos. Para iniciantes, este exemplo conecta probabilidade à tomada de decisão. A teoria da decisão bayesiana é, portanto, essencial para escolhas racionais sob incerteza.