Fronteira de Decisão: Onde a Sigmoide Muda de Ideia
Já vi a sigmoide espremer qualquer número pra dentro de (0, 1), e o corte em 0.5 decidindo a classe final. Esse lab pega um exemplo com duas variáveis de entrada e mostra onde, geometricamente, esse corte acontece.
O dado: dois pacientes, duas variáveis
X = np.array([[0.5, 1.5], [1,1], [1.5, 0.5], [3, 0.5], [2, 2], [1, 2.5]])
y = np.array([0, 0, 0, 1, 1, 1])
Seis pacientes, cada um com duas variáveis (x0, x1). Os três primeiros são y=0, os três últimos são y=1.
Onde fica o corte em 0.5
Suponha que o modelo já foi treinado (o "como treinar" é assunto dos próximos dois labs) e chegou nesses parâmetros: b=-3, w0=1, w1=1. O modelo é
Já vi que sigmoid(z) >= 0.5 exatamente quando z >= 0. Então:
- prevê
y=1quando - prevê
y=0quando
A fronteira entre as duas decisões é a linha onde a desigualdade vira igualdade: , ou seja, . Essa linha é a fronteira de decisão: tudo o que a sigmoide faz depois é achatar a distância até essa linha numa probabilidade, mas a decisão binária final (y=0 ou y=1) só depende de que lado da linha o ponto cai.
Os três pacientes y=0 caem todos abaixo da linha, os três y=1 caem todos acima ou sobre ela. O modelo separa os seis perfeitamente, só olhando de que lado da reta cada um está.
Fronteiras não precisam ser retas
Tudo isso partiu de , uma combinação linear das entradas, por isso a fronteira sai reta. Mas nada impede de alimentar a sigmoide com termos polinomiais, por exemplo . A fronteira vira uma curva (nesse caso, uma parábola), mas a lógica é idêntica: a fronteira é sempre o lugar onde z=0, só que agora z não é mais linear em x. Esse é o mesmo truque de engenharia de features que já vi na regressão, aplicado à classificação.
Fechando
| O que eu já sabia | O que essa aula assentou |
|---|---|
sigmoid(z) >= 0.5 quando z >= 0 | Isso define uma fronteira geométrica exata: o lugar onde z=0 |
z = w·x+b é linear nas entradas | Por isso a fronteira sai reta (ou plana, com mais variáveis); com termos polinomiais em z, a fronteira vira curva |
| Engenharia de features ajuda regressão a curvar | O mesmo truque também curva a fronteira de decisão em classificação |
Aplicação Prática
Ajusto uma regressão logística de verdade (gradiente descendente) no dataset real de câncer de mama, agora com duas variáveis: worst concave points e worst perimeter, as duas mais correlacionadas com o diagnóstico, ambas normalizadas por z-score:
w, b = fit_logistic(X_train_z, y_train) # duas colunas
print(f"w={w}, b={b:.4f}")
Saída:
w=[2.5494, 4.0739],b=-1.0038, acurácia de treino 0.9319, acurácia de teste 0.9737.
Fronteira de decisão sobre 60 pacientes reais do treino (coordenadas já normalizadas):
A maioria dos pacientes malignos (azuis) cai acima e à direita da fronteira, a maioria dos benignos (laranjas) cai abaixo e à esquerda, exatamente o padrão de separação que a acurácia de 97% no teste já sugeria. Os poucos pontos do lado "errado" da linha são justamente os erros do modelo, casos onde as duas variáveis sozinhas não bastam pra decidir com segurança, o mesmo tipo de ambiguidade que já vi quando usei só uma variável.