Entendendo a Regressão Logística

João Cláudio Nunes Carvalho
7 min readJun 11, 2021

--

Estudaremos aqui os conceitos básicos da regressão logística, que é um método de classificação muito usado em machine learning.

Essa técninca pode ser utilizada para resolver alguns problemas como:

1) Filtros de email

2) Modelos preditores de clientes inadimplentes

3) Diagnóstico de doenças

4) Utilizada para classificar se uma empresa encontra-se no grupo de empresas solvente ou insolvente

A regressão logística é um recurso que permite encontrarmos a probabilidade associada à ocorrência de determinado evento em face de um conjunto de variáveis explanatórias(qualquer fator que pode influenciar a variável de resposta. Embora possa haver muitas variáveis ​​explicativas, nos preocuparemos principalmente com uma única variável explicativa.).

Este algoritmo ou técnica de machine learning busca estimar a probabilidade da variável dependente assumir um determinado valor em função dos valores conhecidos de outras variáveis.

Os resultados da análise ficam contidos no intervalo de zero a um.

Apesar do nome ser confuso, regressão logística nos permite resolver problemas de classificação onde estamos tentando predizer categorias discretas.

Vantagens do Modelo Logístico

  • Facilidade para lidar com variáveis independentes categóricas.
  • Fornece resultados em termos de probabilidade.
  • Facilidade de classificação de indivíduos em categorias.
  • Requer um pequeno número de suposições.
  • Alto grau de confiabilidade

Regressão Logística x Regressão Linear

Linear: trabalhamos com dados contínuos.

Logística: Variável dependente é categórica.

Linear: Utiliza o método dos mínimos quadrados.

Logística: Utiliza o método da máxima verossimilhança.

Podemos entender regressão logística como o análogo da regressão linear para problemas de classificação.

Um exemplo seria saber se uma pessoa ganha mais de R$100.000,00 anuais, com base nas suas informações socioeconômicas, ou saber se uma pessoa pedindo empréstimo vai pagar corretamente o que deverá.

Exemplificando

Vamos pensar que estamos gerenciando uma agência de seguros de veículos e precisamos decidir se iremos ou não segurar um carro, com base unicamente nas informações sociais dos seus proprietários.

Nesse contexto, vamos assumir que a probabilidade da pessoa colidir o veículo dependa unicamente do tempo que ela utilizou nas aulas na autoescola. Nós temos acesso a esse tempo, porém não sabemos como ele se relaciona com a probabilidade da pessoa segurada sofrer um acidente.

Então olhamos no nosso arquivo, os casos de 15pessoas, onde encontra-se os dados de tempo na auto-escola e se elas sofreram ou não acidente.

Se colocarmos nossos dados em um gráfico (x, y) ele seria aproximadamente da seguinte forma:

No eixo x, temos o tempo que ela passou na autoescola e no eixo y a probabilidade se sofrer acidente (1) ou não (0).

No eixo y, temos marcado com 1(alto risco) se a pessoa sofreu um acidente e 0(baixo risco) caso contrário.

Vale salientar que a escolha de 0 ou 1 para baixo ou alto, respectivamente é de acordo com os dados recebidos pelo nosso modelo, em geral se classifica o primeiro tipo de dado como 0, o segundo tipo de dado como 1, o terceiro com 2 e assim sucessivamente.

Aqui estamos supondo que nossa tabela de dados, ao ter sido submetida a uma análise, verifica-se que a coluna y, tem como valores alto ou baixo, então ao analisar a coluna o modelo verificou que o primeiro valor existente nela era baixo, logo atribuiu-se a ele o valor 0, e consequentemente atribui-se 1 ao valor alto.

No eixo x, temos o tempo que ela passou na autoescola, podemos inclusive afirmar que: a maioria das pessoas que sofreram um acidente de carro passou pouco tempo na auto-escola.

Uma forma de tentar resolver esse problema seria utilizando regressão linear.

Porém a regressão linear produz como previsão um valor contínuo, nós podemos estabelecer algum limiar para as previsões. Vamos supor que fixemos esse limiar em 0,5: as pessoas cuja previsão de acidente for maior do que isso serão consideradas de alto risco e não seriam seguradas (ou o seriam a um preço maior).

O objetivo da regressão linear seria dela nos fornecer como previsão a probabilidade da pessoa sofrer acidente, dado o tempo dela na autoescola (e nós veremos que isso não será o caso).

A nossa linha de melhor ajuste então seria assim:

Nesse caso, utilizar regressão linear e estabelecer um limiar funcionaria muito bem.

Suponha agora que nos nossos dados seja inserida uma pessoa com muitas horas de autoescola. Digamos, umas 100 horas. Essa pessoa não sofreu nenhum acidente e ter ela nos dados não traz informação nova: ela foi tão treinada que dificilmente preveríamos que sofreria um acidente.

Em outras palavras, essa observação não gera incerteza. A presença dessa pessoa super treinada faz com que nossa linha de regressão seja puxada para a direita, observe a imagem abaixo:

Como consequência, iremos classificar muitas das pessoas de baixo risco(valor 0) como tendo alta probabilidade de sofrer acidentes.

Para resolver este tipo de problema, ao invés de utilizar regressão linear, vamos utilizar a regressão logística sempre que nos depararmos com problemas de classificação.

Regressão logística nos fornecerá uma previsão sempre entre 0 e 1, de forma que possamos interpretar seus resultados como uma probabilidade válida.

A ideia por trás de regressão logística é bastante simples: em vez de acharmos a reta que melhor se ajusta aos dados, vamos achar uma curva em formato de ‘S’ que melhor se ajusta aos dados.

Função Logística

Na regressão logística, a probabilidade de ocorrência de um evento pode ser estimada diretamente.

No caso da variável dependente y assumir apenas dois possíveis estados (1 ou 0) e haver um conjunto de p variáveis independentes X1 , X2 , … , Xp , , o modelo de regressão logística pode ser escrito da seguinte forma:

Os coeficientes existentes na função g(x), são estimados a partir do conjunto de dados que estamos analisando. O nosso modelo irá encontrar uma combinação de coeficientes para maximizar a probabilidade da amostra ter sido observada. Por meio da combinação dos coeficientes e variando-se o valor de x, observaremos que a curva logística tem um comportamento probabilístico no formato da letra S, de acordo com a primeira imagem deste texto.

Observação importante: Ao aplicarmos a função logística ao nosso conjunto de dados, iremos obter um “valor de probabilidade”, mas o nosso interesse não é saber exatamente este valor. Nosso intuito aqui é encontrar a qual categoria nosso conjunto de dados irá pertencer. Para isso precisamos definir um valor limite. Aqui podemos estabelecer o valor 0.5 que é o “praticado” por muitas bilbiotecas como padrão, em muitas delas não podemos sequer alterar este valor.

A regra de classificação é a seguinte:

— se P(Y=1) > 0,5 então classifica-se Y=1

— se P(Y=1) < 0,5 então classifica-se Y=0

Para obter-se uma boa estimativa da eficiência classificatória do modelo, recomenda-se separar a amostra em duas partes:

— uma parte para estimação do modelo, e

— outra parte para testar a eficiência da classificação

Implementação do modelo em Python

Agora que entendemos como o modelo funciona, vamos para sua implementação:

Inicialmente, vamos assumir que já temos 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-se as 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, precisamo criar um classificador por meio da 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 que se seu modelo teve ótimo desempenho com o treino, mas péssimo no teste, você tem um problema de 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 se o que ele previu com o que realmente aconteceu.

Aqui vamos 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))

Alterandos 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, podemos pensar em aplicar o que aprendemos aqui para alguns outros datasets.

--

--

João Cláudio Nunes Carvalho
João Cláudio Nunes Carvalho

Written by João Cláudio Nunes Carvalho

Professor of Physics at the Federal Institute of Ceará. Phd in physics(UFC). MBA in Data Science and Analytics — USP — University of São Paulo

No responses yet