← Voltar pra playlist

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 é

f(x)=g(x0+x1−3)f(\mathbf{x}) = g(x_0+x_1-3)

Já vi que sigmoid(z) >= 0.5 exatamente quando z >= 0. Então:

  • prevê y=1 quando x0+x1−3≥0x_0+x_1-3 \geq 0
  • prevê y=0 quando x0+x1−3<0x_0+x_1-3 < 0

A fronteira entre as duas decisões é a linha onde a desigualdade vira igualdade: x0+x1−3=0x_0+x_1-3=0, ou seja, x1=3−x0x_1 = 3-x_0. 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 z=w0x0+w1x1+bz = w_0x_0+w_1x_1+b, uma combinação linear das entradas, por isso a fronteira sai reta. Mas nada impede de alimentar a sigmoide com termos polinomiais, por exemplo z=x02+x1−1z = x_0^2+x_1-1. 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á sabiaO que essa aula assentou
sigmoid(z) >= 0.5 quando z >= 0Isso define uma fronteira geométrica exata: o lugar onde z=0
z = w·x+b é linear nas entradasPor 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 curvarO 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.