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 Validation, Explicando 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!
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?
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!