← Voltar pra playlist

O Que Levou Seis Labs, o Scikit-Learn Faz em Três Linhas

Seis labs pra chegar até aqui: sigmoide, fronteira de decisão, perda logística, custo, gradiente descendente, tudo escrito à mão, fórmula por fórmula. Esse lab é o mais curto da semana, e é assim de propósito: mostrar que tudo isso já existe pronto numa biblioteca, exatamente como já vimos pro lado da regressão linear.

O código inteiro

from sklearn.linear_model import LogisticRegression

lr_model = LogisticRegression()
lr_model.fit(X, y)

LogisticRegression() cria o modelo, .fit(X, y) treina ele. Sem escrever sigmoid, sem escrever compute_gradient_logistic, sem escrever gradient_descent. Por baixo do capô, o sklearn faz todo o trabalho que os últimos seis labs destrincharam linha a linha.

y_pred = lr_model.predict(X)
print("Previsão no conjunto de treino:", y_pred)

Saída: Previsão no conjunto de treino: [0 0 0 1 1 1]

print("Acurácia no conjunto de treino:", lr_model.score(X, y))

Saída: Acurácia no conjunto de treino: 1.0

No dataset de seis pacientes de sempre, acerta todo mundo. Nada surpreendente, a fronteira treinada à mão no lab passado já fazia isso.

O detalhe que o sklearn esconde (por enquanto)

Se eu espiar os pesos que o sklearn achou:

print("coeficientes:", lr_model.coef_, "intercepto:", lr_model.intercept_)

Saída: coeficientes: [[0.9041 0.7359]] intercepto: [-2.3337]

Repara que esses números não batem com o w=[5.2812, 5.0782], b=-14.2224 que o gradiente descendente puro achou no lab passado, mesmo os dois acertando os seis pacientes igual. Isso não é bug de ninguém: o LogisticRegression() do sklearn, por padrão, já vem com um freio embutido que penaliza pesos grandes demais (o assunto que fecha essa semana, regularização). Ele resolve um problema ligeiramente diferente do gradiente descendente cru que eu implementei, por isso o resultado é parecido na decisão final mas diferente nos números. Guarda esse estranhamento, ele vai fazer sentido completo daqui a dois labs.

Fechando

O que eu já sabiaO que essa aula assentou
Construí sigmoide, custo e gradiente descendente do zeroO sklearn empacota tudo isso em fit/predict/score, igual já vimos pra regressão linear
Os pesos que eu treinei à mão resolvem o problema sem penalidade nenhumaOs pesos do sklearn são diferentes por padrão, porque ele já regulariza sem eu pedir

Aplicação Prática

Mesmo dataset real do lab passado (worst concave points, amostra de 60 pacientes, normalizada por z-score):

lr_model = LogisticRegression()
lr_model.fit(X_train_z, y_train)
print("coeficiente:", lr_model.coef_, "intercepto:", lr_model.intercept_)
print("acurácia:", lr_model.score(X_train_z, y_train))

Saída: coeficiente: [[2.4562]] intercepto: [-0.8278] · acurácia: 0.9

Mesma acurácia (0.90) que o gradiente descendente puro achou nesse exato dataset, mas o coeficiente do sklearn (2.4562) é bem menor que o w≈4.175 que rodei à mão. Duas fronteiras diferentes, mesma decisão final nesses 60 pacientes: essa é a cara da regularização em ação, encolhendo o peso sem perder acurácia. Assunto de dois labs a partir daqui.