Regressão Logística em Python

Já falei de vários modelos aqui, principalmente a parte teórica dos econométricos. Em contrapartida, acabei deslizando no conteúdo de machine learning (ou modelagem estatística para os mais céticos) em Python. Bom, isso vai acabar. Hoje, vamos aprender a rodar uma regressão logística em Python.

INTRODUÇÃO

Primeiramente, revise o conteúdo de regressão logística se não tiver domínio do assunto. Você pode encontrar mais informação nos posts Regressão Logística: Primeiros Passos e Regressão Logística: Conceitos Essenciais e Modelo.

Em seguida, vamos dar sequência indo direto ao código. Afinal, você já sabe como funciona o modelo. O post será assim bem breve e direto ao ponto.  Mas prometo que no futuro posso escrever mais e dar mais exemplos práticos. Se tiver dúvidas, não hesite em me escrever.

RODANDO A REGRESSÃO LOGÍSTICA

Inicialmente, vou assumir que você já tem um dataset e que ele está dividido entre as variáveis explicativas, X, e a variável resposta, y. Vamos começar então por importar algumas bibliotecas e fazer a divisão entre treino e teste:

# Importa bibliotecas
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.metrics import roc_curve

# Divide em treino e teste 70-30
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state=42)

Agora, você precisa criar o classificador com a função LogisticRegression():

# instancia o classificador com nome logit
logit = LogisticRegression()

Em seguida, você precisa treinar o seu modelo. Em outras palavras, precisamos rodar a regressão para X_train e y_train:

# treina o modelo
logreg.fit(X_train, y_train)

Por fim, você precisa aplicar o modelo no teste. É neste momento que você vai verificar se seu modelo está bom. Lembre-se de que se seu modelo teve ótimo desempenho com o treino, mas péssimo no teste, você tem um problema de overfitting. Se não se lembra direito o que é overfitting, veja os posts Overfitting e Cross ValidationExplicando overfitting com uma anedota e Overfitting. Enfim, vamos à aplicação:

# faz predicao e salva em y_pred
y_pred = logreg.predict(X_test)
MÉTRICAS DE DESEMPENHO

Agora que você já tem um modelo e já sabe o que ele está prevendo para a base teste, você precisa comparar o que ele previu com o que realmente aconteceu. Ou seja, comparar y_pred com y_test. Algumas formas de se fazer isso: calculando acurácia, montando uma matriz de confusão e calculando métricas como precision e recall:

# acuracia
logit.score(x_test, y_test)

# matriz de confusao
print(confusion_matrix(y_test, y_pred))

# outras metricas
print(classification_report(y_test, y_pred))

Por fim, que tal calcular a curva ROC? Aproveite e veja que a primeira linha apresentada abaixo traz o cálculo das probabilidades para y_test:

# computa probabilidades
y_pred_prob = logreg.predict_proba(X_test)[:,1]

# Gera fpr, tpr e thresholds
fpr, tpr, thresholds = roc_curve(y_test, y_pred_prob)

# curva ROC
plt.plot([0, 1], [0, 1], 'k--')
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()

Note: Você só precisou de X e y para iniciar este script. Um exemplo:

X = df['col1','col2','col3']
y = df[['coln']]

E mais, você pode colocar todos os processamentos num pipeline igualzinho foi explicado nos posts Introdução aos Pipelines no Scikit-Learn e Pipeline usando Scikit-Learn: Exemplos Práticos.

TUNANDO OS HIPERPARÂMETROS

Como você viu, rodamos a regressão no seu modo padrão. Entretanto, você poderia alterar seus hiperparâmetros. Mais do que isso, você pode testar diversos hiperparâmetros e ver qual traz melhor resultado. Basta utilizar o GridSearchCV. No exemplo abaixo, alteramos C e penalty:

# Cria um conjunto de hiperparametros a serem testados
param_grid = {'C': np.logspace(-5, 8, 15), 'penalty': ['l1', 'l2']}

# Instancia a regressao logistica
logit = LogisticRegression()

# divide em treino e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Instancia GridSearchCV e ja faz um 5-fold cross validation 
logit_cv = GridSearchCV(logit, param_grid, cv=5)

# treina o modelo
logit_cv(X_train, y_train)

# Verifica os melhores parametros e melhor acuracia
print("Parametros: {}".format(logreg_cv.best_params_))
print("Acuracia: {}".format(logreg_cv.best_score_))

Agora você está pronto para mandar bala! Se tiver dúvidas, não hesite em me chamar, ein? Nada de abandonar o modelo!

E aí? Gostou do conteúdo? Se inscreva para receber as novidades! Deixe seu e-mail em INSCREVA-SE na barra à direita, logo abaixo de pesquisar. E, por favor, não deixe de comentar, dar seu feedback e, principalmente, compartilhar com seus amigos. De verdade, isso faz toda a diferença. Além disso, você também pode acompanhar mais do meu trabalho seguindo a conta de Twitter @EstatSite ou por alguma das redes que você encontra em Sobre o Estatsite / Contato, como meu canal de Youtube Canal do Yukio. E se você gosta de tecnologia, escute o Pitacotech!

Bons estudos!

2 comentários em “Regressão Logística em Python”

  1. Olá Yukio,
    Excelente conteúdo aqui!!!

    Surgiu-me a questão se seria possível, em primeiro lugar selecionar as variáveis mais importantes para o modelo (feature selection), só depois fazer o tuning do modelo já com as variáveis escolhidas em primeiro lugar?

    1. Oi, Célia. Obrigado pelo feedback!
      Quanto à sua pergunta, é possível sim.
      Veja que um influencia o outro. Uma seleção de features diferente influencia os hiperparâmetros otimizados.
      O que é comum de se fazer é você repetir o processo algumas vezes. Geralmente, otimiza-se os hiperparâmetros considerando todas as features ou já um grupo que você considera relevante, depois utilizando esses hiperparâmetros você trabalhar a feature selection, para depois fazer uma nova otimização.
      Algumas pessoas também partem direto dos hiperparâmetros default, aí faz a seleção das features e depois otimiza os hiperparâmetros.
      Há várias possibilidades. Para fechar, só para você ver que é uma discussão válida e com várias saídas, veja essa thread, que tem a mesma pergunta que você fez e várias discussões rolando: https://stats.stackexchange.com/questions/264533/how-should-feature-selection-and-hyperparameter-optimization-be-ordered-in-the-m
      Espero que tenha ajudado.
      Abraços!

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *