← Voltar pra playlist

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

g(z)=11+e−zg(z) = \frac{1}{1+e^{-z}}

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 eze^z 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 (z de -10 a 10, alguns valores):

zsigmoid(z)
-100.0000
-20.1192
-10.2689
00.5000
10.7311
20.8808
101.0000

Regressão logística: regressão linear com um teto embutido

Regressão logística é só isso: pega o modelo linear de sempre, z=w⋅x+bz = \mathbf{w}\cdot\mathbf{x}+b, e passa o resultado pela sigmoide.

fw,b(x)=g(w⋅x+b)=11+e−(w⋅x+b)f_{\mathbf{w},b}(\mathbf{x}) = g(\mathbf{w}\cdot\mathbf{x}+b) = \frac{1}{1+e^{-(\mathbf{w}\cdot\mathbf{x}+b)}}

A saída fw,b(x)f_{\mathbf{w},b}(\mathbf{x}) 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á sabiaO que essa aula assentou
Regressão linear não tem teto na saídaA sigmoide espreme qualquer número real pro intervalo (0, 1)
Um > 0.5 transforma número em decisãoIsso 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 extremoRegressã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.