A Função Sigmoide: Botando um Teto na Regressão
No lab passado, a saída crua da regressão linear chegou a 1.4043 num paciente real, um número que não significa nada como "probabilidade de câncer". Faltava um teto. É exatamente isso que a função sigmoide (também chamada de função logística) resolve: ela pega qualquer número, positivo, negativo, gigante, minúsculo, e devolve sempre algo entre 0 e 1.
A fórmula, sem drama
Não precisa decorar essa fórmula de cor pra entender o que ela faz: quando z é bem negativo, e^(-z) explode e a fração vira quase 0. Quando z é bem positivo, e^(-z) encolhe pra quase 0 e a fração vira quase 1. No meio, z=0, dá exatamente 0.5. Ela nunca chega em 0 ou 1 de verdade, só se aproxima cada vez mais.
def sigmoid(z):
g = 1/(1+np.exp(-z))
return g
Quatro linhas. np.exp calcula elemento a elemento, então essa mesma função funciona tanto pra um número só quanto pra um array inteiro de uma vez ().
Saída (
zde -10 a 10, alguns valores):
z sigmoid(z) -10 0.0000 -2 0.1192 -1 0.2689 0 0.5000 1 0.7311 2 0.8808 10 1.0000
Regressão logística: regressão linear com um teto embutido
Regressão logística é só isso: pega o modelo linear de sempre, , e passa o resultado pela sigmoide.
A saída agora é interpretada como uma probabilidade: a chance estimada de y=1 dado x. Pra virar decisão final, o mesmo corte em 0.5 de antes: f >= 0.5 prevê 1, senão prevê 0.
O mesmo teste do lab passado, agora com teto
Volto pro mesmo exemplo do tumor, só que agora com a caixinha pra trocar entre regressão linear e logística:
w = 0.257 · b = -0.143 · acurácia: 100%
Adiciona os tumores grandes de novo (igual no lab passado): com regressão linear, x=3 continua sendo classificado errado. Marca "usar regressão logística": a curva sigmoide, diferente da reta, acha um jeito de acomodar os novos pontos extremos sem se distorcer no meio, porque ela já satura perto de 0 e 1 em vez de continuar crescendo pra sempre. x=3 volta a ser classificado certo. Nenhum ponto mudou de lugar, só o formato do modelo que aprende os dados mudou.
Fechando
| O que eu já sabia | O que essa aula assentou |
|---|---|
| Regressão linear não tem teto na saída | A sigmoide espreme qualquer número real pro intervalo (0, 1) |
Um > 0.5 transforma número em decisão | Isso continua valendo, só que agora o número que passa pelo corte é uma probabilidade de verdade, nunca maior que 1 |
| Regressão linear se distorce com ponto extremo | Regressão logística (linear + sigmoide) resiste ao mesmo ponto extremo, porque a curva satura em vez de continuar subindo |
Aplicação Prática
No lab passado, a regressão linear crua no dataset real de câncer de mama (worst concave points, 569 pacientes) chegou a devolver 1.4043 pra um paciente, um número sem sentido como probabilidade. Aplico a sigmoide direto nesse mesmo número:
print(sigmoid(1.4043))
Saída:
0.8028.
0.8028 já é uma resposta que faz sentido: "80% de chance de ser maligno". Ajusto a regressão logística de verdade nesse dataset (gradiente descendente, a mesma variável worst concave points, normalizada):
w, b = fit_logistic_1d(X_train_z, y_train)
print(f"w={w:.4f} b={b:.4f}")
Saída:
w=3.9565 b=-1.1326, acurácia de treino 0.9055, acurácia de teste 0.9211.
Nesse dataset em particular, sem outlier chamativo, a acurácia da versão logística fica bem próxima da versão linear do lab passado (0.9099/0.9298 lá, 0.9055/0.9211 aqui), porque os pacientes reais não têm um "tumor de tamanho 10" absurdo puxando a reta. A diferença que importa não é a acurácia nesse dataset específico, é a saída: toda previsão da versão logística já nasce entre 0 e 1, pronta pra ser lida como probabilidade, sem precisar confiar que nenhum paciente futuro vai ter um valor extremo o bastante pra fazer a conta explodir.