Erro Quadrático Não Serve Aqui: a Perda Logística
Toda a base de regressão linear até aqui usou o erro quadrático como função de custo, uma tigela lisa e bem-comportada onde gradiente descendente sempre acha o fundo. A tentação óbvia é reaproveitar a mesma ideia pra regressão logística: pega a saída da sigmoide e mede o erro quadrático dela contra o rótulo. Esse lab mostra, com número real, por que essa tentação é uma armadilha.
Reaproveitando o erro quadrático (e uma pista de que vai dar ruim)
Mesma fórmula de sempre, só que agora f já passou pela sigmoide antes de entrar na conta. Fixei b=-3 (perto de onde um ajuste bom pra esse dado acaba caindo) e variei w:
| w | custo (erro quadrático + sigmoide) |
|---|---|
| 1.0 | 0.0354 |
| 1.1 | 0.0284 |
| 1.2 | 0.0247 |
| 1.3 | 0.0235 |
| 1.4 | 0.0243 |
| 1.6 | 0.0304 |
| 2.0 | 0.0509 |
| 5.0 | 0.1480 |
| 10.0 | 0.1667 |
| 15.0 | 0.1669 |
| 20.0 | 0.1669 |
Repara nas últimas linhas: de w=10 até w=20, o custo praticamente não muda (0.1667 → 0.1669). Não é coincidência, é a sigmoide saturando: pra w grande, sigmoid(wx+b) já está tão perto de 0 ou 1 que aumentar w ainda mais quase não move a saída, e por tabela quase não move o custo. O gradiente nessa região é minúsculo. Gradiente descendente, se cair aí, mal se mexe.
Gira o gráfico abaixo e compara com a tigela lisa da regressão linear: não é mais uma superfície simétrica com um fundo único e bem definido, tem dobras e um platô extenso onde a inclinação quase some.
Erro quadrático não é uma má ideia em si, ele só assume implicitamente que o ruído nos dados é bem-comportado (gaussiano), o que faz sentido pra prever um número contínuo. Colado numa sigmoide, essa suposição quebra, e a superfície de custo perde a garantia de ser uma tigela única. Precisa de uma função de perda pensada especificamente pra classificação.
A perda logística: pune forte quando erra com convicção
A ideia por trás da perda logística é simples de explicar sem fórmula nenhuma primeiro: se o rótulo certo é 1, eu quero punir pesado quando o modelo disse "quase certeza que é 0", e quase não punir quando ele disse "quase certeza que é 1". E vice-versa pro rótulo 0. A fórmula, em duas partes:
Olha a curva azul (y=1): quando f está perto de 1 (modelo acertou com confiança), a perda cai pra quase 0. Quando f está perto de 0 (modelo errou feio, disse "quase certeza que não" pro caso que era sim), a perda explode, tende a infinito. A curva vermelha (y=0) é o espelho exato, virada ao contrário. Diferente da parábola do erro quadrático, essas curvas nunca ficam achatadas: sempre têm inclinação, então gradiente descendente sempre tem uma direção clara pra seguir, por pior que a previsão esteja.
Uma linha só, pra programar
Duas fórmulas separadas por if são chatas de programar. Como y só vale 0 ou 1, dá pra combinar as duas num único código, usando y e (1-y) como interruptores que ligam e desligam cada termo:
Quando y=1, o segundo termo zera (1-1=0) e sobra só -log(f). Quando y=0, o primeiro termo zera e sobra só -log(1-f). A mesma linha de código cobre os dois casos, sem if nenhum.
Fechando
| O que eu já sabia | O que essa aula assentou |
|---|---|
| Erro quadrático dá uma tigela lisa pra regressão linear | Erro quadrático + sigmoide não dá mais uma tigela, tem platôs onde o gradiente quase some |
| Uma função de perda mede o erro de um exemplo só | A perda logística pune forte erro confiante e quase nada acerto confiante, sem nunca ficar achatada |
if/else separa casos | y e (1-y) como interruptores combinam os dois casos numa fórmula só, sem if |
Aplicação Prática
Usando o modelo logístico já ajustado no lab da sigmoide (w=3.9565, b=-1.1326, variável worst concave points), calculo a perda de três pacientes reais do conjunto de teste, escolhidos pra mostrar os dois extremos e o meio:
for nome, x, y_real in pacientes:
f = sigmoid(w*x + b)
loss = -y_real*np.log(f) - (1-y_real)*np.log(1-f)
print(f"{nome}: f={f:.4f} loss={loss:.4f}")
Saída:
Paciente worst concave points y real f(x) perda Maligno claro 0.2867 1 0.9999 0.0001 Benigno claro 0.0000 0 0.0003 0.0003 Ambíguo 0.1335 0 0.5097 0.7127
Os dois primeiros pacientes o modelo acerta com convicção total, a perda deles é praticamente zero. O terceiro é o caso ambíguo, bem em cima da fronteira de decisão (o modelo achou 51% de chance de ser maligno, mas o paciente era benigno), e a perda dele sozinho (0.7127) já é maior que a soma dos outros dois juntos. É exatamente esse tipo de ponto, perto da fronteira e classificado errado, que mais empurra o ajuste durante o treino, porque é ele que carrega a perda alta.