Imagine que você está tentando encontrar a saída em um labirinto complexo. Em cada bifurcação, você não tem certeza absoluta sobre qual caminho levará à saída, mas pode fazer estimativas baseadas em pistas visuais e sua experiência anterior. A Classificação por Processos Gaussianos (GPC) funciona de maneira similar – em vez de simplesmente dizer “vire à esquerda” ou “vire à direita”, ela fornece probabilidades: “há 70% de chance que a esquerda leve à saída, mas ainda há 30% de chance de que a direita seja melhor”. Esta nuance probabilística torna o GPC especialmente valioso para decisões onde a incerteza importa.
Como isso funciona na prática?
O GPC estende a ideia dos processos gaussianos para problemas de classificação através de uma abordagem bayesiana elegante. Enquanto classificadores tradicionais como SVM ou Random Forest fornecem apenas labels definitivos, o GPC modela uma função latente que é mapeada para probabilidades via uma função de ligação (como a sigmoide). Diferentemente da regressão gaussiana que modela valores contínuos diretamente, o GPC primeiro modela uma função contínua subjacente e depois a transforma em probabilidades de classe. Esta abordagem permite não apenas classificar, mas quantificar o quão confiante é cada classificação, revelando áreas de fronteira onde o modelo tem dúvidas.
Mãos na massa: classificando caminhos em um labirinto virtual
|
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 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
""" Classificação por Processos Gaussianos para navegação em labirinto Demonstra classificação probabilística com quantificação de incerteza """ import numpy as np import matplotlib.pyplot as plt from sklearn.gaussian_process import GaussianProcessClassifier from sklearn.gaussian_process.kernels import RBF from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, confusion_matrix # Criando dados simulados de um labirinto # Características: [distância_parede_esquerda, distância_parede_direita, ângulo_corredor] def criar_dados_labirinto(): """Simula dados de navegação em labirinto com fronteiras complexas""" np.random.seed(42) n_amostras = 500 # Gerando características de posição no labirinto X = np.random.uniform(0, 10, (n_amostras, 3)) # Criando fronteira de decisão não-linear complexa # Caminhos que levam à saída seguem um padrão sinusoidal def eh_caminho_correto(x1, x2, x3): return (np.sin(x1 * 0.8) + np.cos(x2 * 0.6) + x3 * 0.1) > 0.5 y = np.array([eh_caminho_correto(x[0], x[1], x[2]) for x in X]) return X, y X, y = criar_dados_labirinto() print(f"Dados do labirinto criados: {X.shape[0]} posições") print(f"Distribuição de classes: {np.sum(y==1)} caminhos corretos, {np.sum(y==0)} caminhos errados") # Dividindo em treino e teste X_treino, X_teste, y_treino, y_teste = train_test_split( X, y, test_size=0.3, random_state=42, stratify=y ) # Criando o classificador por processo gaussiano kernel = 1.0 * RBF(length_scale=1.0) gpc = GaussianProcessClassifier( kernel=kernel, random_state=42, n_restarts_optimizer=5 ) print("\nTreinando GPC...") gpc.fit(X_treino, y_treino) print(f"Kernel otimizado: {gpc.kernel_}") # Fazendo previsões probabilísticas y_pred = gpc.predict(X_teste) y_prob = gpc.predict_proba(X_teste) # Avaliando o modelo acuracia = accuracy_score(y_teste, y_pred) print(f"\nAcurácia no conjunto de teste: {acuracia:.3f}") # Analisando as probabilidades print("\nExemplo de previsões probabilísticas:") for i in range(5): prob_classe_1 = y_prob[i, 1] decisao = "CORRETO" if y_pred[i] == 1 else "ERRADO" confianca = max(y_prob[i]) print(f"Posição {i+1}: {decisao} (confiança: {confianca:.3f})") # Visualizando fronteiras de decisão (em 2D para visualização) def visualizar_fronteiras(): """Visualiza as fronteiras de decisão em 2 dimensões""" # Criando grid para visualização x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1 x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max, 50), np.linspace(x2_min, x2_max, 50)) # Usando valor médio para terceira dimensão x3_medio = np.mean(X[:, 2]) X_grid = np.c_[xx1.ravel(), xx2.ravel(), np.full(xx1.ravel().shape, x3_medio)] # Previsões do GPC Z = gpc.predict_proba(X_grid)[:, 1] Z = Z.reshape(xx1.shape) plt.figure(figsize=(12, 5)) # Plot das probabilidades plt.subplot(1, 2, 1) contour = plt.contourf(xx1, xx2, Z, levels=20, alpha=0.8, cmap='RdYlBu') plt.colorbar(contour, label='Probabilidade caminho correto') plt.scatter(X_treino[:, 0], X_treino[:, 1], c=y_treino, cmap='RdYlBu', edgecolors='black', s=30) plt.xlabel('Distância parede esquerda') plt.ylabel('Distância parede direita') plt.title('Fronteiras de Decisão do GPC\n(Probabilidades)') # Plot das regiões de incerteza plt.subplot(1, 2, 2) # Incerteza é máxima quando probabilidade está perto de 0.5 incerteza = 1 - 2 * np.abs(Z - 0.5) contour = plt.contourf(xx1, xx2, incerteza, levels=20, alpha=0.8, cmap='viridis') plt.colorbar(contour, label='Nível de incerteza') plt.scatter(X_treino[:, 0], X_treino[:, 1], c=y_treino, cmap='RdYlBu', edgecolors='black', s=30) plt.xlabel('Distância parede esquerda') plt.ylabel('Distância parede direita') plt.title('Mapa de Incerteza do GPC') plt.tight_layout() plt.show() visualizar_fronteiras() # Análise de casos difíceis (alta incerteza) probabilidades_teste = gpc.predict_proba(X_teste) incertezas = 1 - np.max(probabilidades_teste, axis=1) print(f"\nCasos com alta incerteza (probabilidade próxima de 0.5):") casos_dificeis = incertezas > 0.4 print(f"{np.sum(casos_dificeis)} casos onde o modelo tem baixa confiança") |
Os detalhes que fazem diferença
A grande vantagem do GPC sobre classificadores tradicionais é sua capacidade natural de quantificar incerteza. Enquanto métodos como SVM fornecem apenas uma decisão binária, o GPC fornece probabilidades calibradas que refletem verdadeiramente a confiança do modelo. Contudo, esta sofisticação vem com custos computacionais significativos (\(O(n^3)\) para treinamento), tornando-o impraticável para conjuntos muito grandes. Analogamente importante é a escolha do kernel – o RBF padrão funciona bem para muitos problemas, mas kernels específicos podem capturar melhor a estrutura dos dados. A aproximação por Laplace usada no Scikit-Learn torna o método computacionalmente viável, mas introduz algumas limitações em problemas muito complexos.
- Vantagem principal: Probabilidades calibradas e quantificação de incerteza
- Limitação prática: Complexidade computacional limita uso a datasets médios
- Kernel recomendado: RBF para problemas gerais, kernels customizados para domínios específicos
- Melhor uso: Problemas com dados limitados mas onde incerteza é importante
Perguntas que os iniciantes fazem
Você deve estar se perguntando: “Quando devo usar GPC em vez de outros classificadores?” Excelente questão! Use GPC quando a quantificação da incerteza for crucial para sua aplicação, quando você tiver dados limitados mas de alta qualidade, ou quando precisar de probabilidades bem calibradas. Uma confusão comum é entre a probabilidade fornecida pelo GPC e a “confiança” de outros modelos – as probabilidades do GPC são fundamentadas em teoria probabilística sólida. Outra dúvida frequente: “O GPC funciona para multiclasse?” Sim! O Scikit-Learn implementa uma abordagem “um-contra-um” para problemas com mais de duas classes.
Para onde ir agora?
Experimente o GPC em problemas onde a incerteza importa, como diagnóstico médico, detecção de fraudes ou qualquer aplicação onde decisões erradas tenham custos altos. Compare as probabilidades do GPC com outros métodos como Random Forest ou Regressão Logística. Preste atenção especial às áreas onde o modelo tem alta incerteza – elas podem indicar onde coletar mais dados. O momento “aha!” acontece quando você percebe que tomar decisões considerando a incerteza pode ser mais inteligente que seguir cegamente previsões pontuais.
Assuntos relacionados
Para dominar o GPC, estude estes conceitos:
- Inferência bayesiana: atualização de crenças com dados
- Funções de ligação: mapeamento de funções latentes para probabilidades
- Teoria de decisão: tomada de decisão sob incerteza
- Calibração de probabilidades: como avaliar se probabilidades são realistas
- Processos gaussianos: fundamentos da abordagem