Regressão logística é um algoritmo de modelação preditiva que é usado quando a variável Y é categórica em termos binários. Ou seja, pode levar apenas dois valores como 1 ou 0. O objetivo é determinar uma equação matemática que pode ser usada para prever a probabilidade do evento 1. Uma vez estabelecida a equação, ela pode ser usada para prever o Y quando apenas o X�s for conhecido.
Logistic Regression – A Complete Tutorial With Examples in R Contents1. Introdução à Regressão Logística
2. Alguns exemplos do mundo real de problemas de classificação binária
3. Porque não regressão linear?
4. A Equação Logística
5. Como construir o modelo de regressão logística em R?
6. Como lidar com o Desequilíbrio de Classe?
7. Como lidar com o Desequilíbrio de Classe com Upsample e Downsample?
8. Como construir o Modelo de Regressão Logística
9. Como Prever no Conjunto de Dados do Teste
10. Porque é importante lidar com o desequilíbrio de classes?
11. Conclusão
- 1. Introdução à Regressão Logística
- Alguns exemplos do mundo real de problemas de classificação binária
- Por que não regressão linear?
- A Equação Logística
- Como construir o modelo de regressão logística em R?
- How to deal with Class Imbalance?
- 7. Como lidar com o Desequilíbrio de Classe com Amostragem para cima e Amostragem para baixo
- Construindo o Modelo de Regressão Logística
- Como Prever no Conjunto de Dados de Teste
- Por que é importante lidar com o desequilíbrio de classe?
- Código completo
- Conclusão
1. Introdução à Regressão Logística
Anteriormente você viu o que é regressão linear e como usá-la para prever variáveis Y contínuas.
Na regressão linear a variável Y é sempre uma variável contínua. Se suponha que a variável Y era categórica, você não pode usar o modelo de regressão linear.
Então o que você faria quando a variável Y é uma variável categórica com 2 classes?
Regressão logística pode ser usada para modelar e resolver tais problemas, também chamados de problemas de classificação binária.
Um ponto-chave a ser observado aqui é que Y pode ter apenas 2 classes e não mais do que isso. Se Y tem mais de 2 classes, ele se tornaria uma classificação multiclasse e você não pode mais usar a regressão logística vanilla para isso.
Yet, Regressão logística é uma técnica clássica de modelagem preditiva e ainda permanece uma escolha popular para modelagem de variáveis categóricas binárias.
Uma outra vantagem da regressão logística é que ela calcula uma pontuação de probabilidade de predição de um evento. Mais sobre isso quando você realmente começa a construir os modelos.
Alguns exemplos do mundo real de problemas de classificação binária
Você pode se perguntar para que tipo de problemas você pode usar a regressão logística.
Aqui estão alguns exemplos de problemas de classificação binária:
- Detecção de Spam : Prever se um e-mail é ou não Spam
- Fraude de Cartão de Crédito : Prever se uma determinada transacção de cartão de crédito é fraude ou não
- Saúde : Prever se uma determinada massa de tecido é benigna ou maligna
- Marketing : Prever se um determinado usuário vai comprar um produto de seguro ou não
- Banca : Prever se um cliente vai inadimplir um empréstimo.
Por que não regressão linear?
Quando a variável resposta tem apenas 2 valores possíveis, é desejável ter um modelo que preveja o valor como 0 ou 1 ou como uma pontuação de probabilidade que varia entre 0 e 1,
Regessão linear não tem esta capacidade. Porque, se você usar a regressão linear para modelar uma variável de resposta binária, o modelo resultante pode não restringir os valores Y previstos dentro de 0 e 1,
É aqui que a regressão logística entra em jogo. Na regressão logística, você obtém uma pontuação de probabilidade que reflete a probabilidade da ocorrência do evento.
Um evento, neste caso, é cada linha do conjunto de dados do treinamento. Pode ser algo como classificar se um determinado email é spam, ou se a massa de células é maligna ou se um usuário vai comprar um produto e assim por diante.
A Equação Logística
Regessão logística consegue isso tomando as probabilidades logísticas do evento ln(P/1?P), onde, P é a probabilidade do evento. Então P está sempre entre 0 e 1.
Expoente de ambos os lados da equação dá:
Pode implementar esta equação usando a função glm()
definindo o argumento family
para "binomial"
.
Agora, uma importante ressalva é ter a certeza de que se define o type="response"
quando se usa a função predict
num modelo de regressão logística. Caso contrário, ele irá prever as probabilidades logísticas de P, que é o valor Z, ao invés da própria probabilidade.
Como construir o modelo de regressão logística em R?
Agora vamos ver como implementar a regressão logística usando o conjunto de dados BreastCancer
em mlbench
pacote. Você terá que instalar o pacote mlbench
para isto.
O objetivo aqui é modelar e prever se um dado exemplar (linha no conjunto de dados) é benign
ou malignant
, baseado em 9 outras características da célula. Então, vamos carregar os dados e manter apenas os casos completos.
O conjunto de dados tem 699 observações e 11 colunas. A coluna Class
é a variável resposta (dependente) e indica se um dado tecido é maligno ou benigno.
Vejamos a estrutura deste conjunto de dados.
Exceto Id
, todas as outras colunas são fatores. Isto é um problema quando você modela este tipo de dados.
Porque, quando você constrói um modelo logístico com variáveis de fatores como características, ele converte cada nível no fator em uma variável binária dummy de 1’s e 0’s.
Por exemplo, a forma da célula é um fator com 10 níveis. Quando você usa glm para modelar Classe como uma função da forma da célula, a forma da célula será dividida em 9 variáveis categóricas binárias diferentes antes de construir o modelo.
Se você for construir um modelo logístico sem fazer nenhuma etapa preparatória, então o seguinte é o que você pode fazer. Mas não vamos seguir isto, pois há certas coisas a cuidar antes de construir o modelo logit.
A sintaxe para construir um modelo logit é muito similar à função lm
que você viu na regressão linear. Você só precisa definir o family='binomial'
para glm
para construir um modelo de regressão logística.
glm
significa modelos lineares generalizados e é capaz de construir muitos tipos de modelos de regressão além da regressão linear e logística.
Vejamos como pode ser o código para construir um modelo logístico. Chegarei a este passo novamente mais tarde, pois há alguns passos de pré-processamento a serem feitos antes de construir o modelo.
No modelo acima, Class
é modelado em função de Cell.shape
sozinho.
Mas nota da saída, o Cell.Shape
foi dividido em 9 variáveis diferentes. Isto porque, como Cell.Shape
é armazenado como variável fator, glm
cria 1 variável binária (também conhecida como variável dummy) para cada um dos 10 níveis categóricos de Cell.Shape
.
Claramente, do significado de Cell.Shape
parece haver algum tipo de ordenação dentro dos níveis categóricos de Cell.Shape
. Ou seja, um valor em forma de célula de 2 é maior que a forma de célula 1 e assim por diante.
Este é o caso de outras variáveis no conjunto de dados de um poço. Então, é preferível convertê-las em variáveis numéricas e remover a coluna id.
Pois foi uma variável categórica pura sem ordem interna, como, digamos, o sexo do paciente, você pode deixar essa variável como um fator em si.
# remove id column
bc <- bc# convert factors to numeric
for(i in 1:9) { bc <- as.numeric(as.character(bc))}
Another important point to note. When converting a factor to a numeric variable, you should always convert it to character and then to numeric, else, the values can get screwed up.
Now all the columns are numeric.
Also I’d like to encode the response variable into a factor variable of 1’s and 0’s. Though, this is only an optional step.
So whenever the Class
is malignant
, it will be 1 else it will be 0. Then, I am converting it into a factor.
bc$Class <- ifelse(bc$Class == "malignant", 1, 0)bc$Class <- factor(bc$Class, levels = c(0, 1))
The response variable Class
is now a factor variable and all other columns are numeric.
Alright, the classes of all the columns are set. Let’s proceed to the next step.
How to deal with Class Imbalance?
Before building the logistic regressor, you need to randomly split the data into training and test samples.
Since the response variable is a binary categorical variable, you need to make sure the training data has approximately equal proportion of classes.
table(bc$Class)#> benign malignant #> 444 239
As classes ‘benigna’ e ‘maligna’ são divididas aproximadamente em razão 1:2.
Claramente existe um desequilíbrio de classe. Portanto, antes de construir o modelo logit, você precisa construir as amostras de forma que tanto o 1’s como o 0’s estejam em proporções aproximadamente iguais.
Esta preocupação é normalmente tratada com um par de técnicas chamadas:
- Amostras Baixas
- Amostras de Cima
- Amostras Híbridas usando SMOTE e ROSE.
Então, o que é Amostragem para baixo e Amostragem para cima?
7. Como lidar com o Desequilíbrio de Classe com Amostragem para cima e Amostragem para baixo
Na amostragem para baixo, a classe majoritária é amostrada aleatoriamente para baixo para ser do mesmo tamanho que a classe menor. Isso significa que, ao criar o conjunto de dados de treinamento, as linhas com a Classe benigna serão escolhidas menos vezes durante a amostragem aleatória.
Simplesmente, em UpSampling, as linhas da classe minoritária, ou seja, malignant
são amostradas repetidamente até atingir o mesmo tamanho da classe majoritária (benign
).
Mas no caso da amostragem híbrida, pontos de dados artificiais são gerados e são sistematicamente adicionados em torno da classe minoritária. Isto pode ser implementado usando os pacotes SMOTE
e ROSE
.
No entanto para este exemplo, vou mostrar como fazer a amostragem para cima e para baixo.
Então deixe-me criar os dados de treinamento e teste usando o pacote de caretas.
No trecho acima, eu carreguei o pacote de caretas e usei a função createDataPartition
para gerar os números de linha para o conjunto de dados de treinamento. Ao definir p=.70
Eu escolhi 70% das linhas para entrar trainData
e os restantes 30% para ir para testData
.
table(trainData$Class)
Existem aproximadamente 2 vezes mais amostras benignas. Então vamos diminuir a amostra usando a função downSample
de caret
pacote.
Para fazer isso você só precisa fornecer as variáveis X e Y como argumentos.
Benigno e maligno estão agora na mesma proporção.
A %ni%
é a negação da função %in%
e eu a usei aqui para selecionar todas as colunas exceto a Class
coluna.
A função downSample
requer o ‘y’ como variável fator, por isso eu converti a classe para um fator nos dados originais.
Great! Agora deixe-me fazer o upsampling usando a função upSample
. Segue uma sintaxe similar a downSample
.
Como esperado, benigno e maligno estão agora na mesma proporção.
Utilizarei a versão downSampled do conjunto de dados para construir o modelo logit no próximo passo.
Construindo o Modelo de Regressão Logística
Como Prever no Conjunto de Dados de Teste
O logitmod
está agora construído. Agora você pode usá-lo para prever a resposta em testData
.
pred <- predict(logitmod, newdata = testData, type = "response")
Agora, pred
contém a probabilidade de que a observação é maligna para cada observação.
Note que, quando você usa a regressão logística, você precisa definir type='response'
a fim de calcular as probabilidades de previsão. Este argumento não é necessário no caso da regressão linear.
A prática comum é tomar o corte de probabilidade como 0,5. Se a probabilidade de Y for > 0,5, então pode ser classificado um evento (maligno).
Então se a previsão for maior que 0,5, é maligno ou benigno.
y_pred_num <- ifelse(pred > 0.5, 1, 0)y_pred <- factor(y_pred_num, levels=c(0, 1))y_act <- testData$Class
Vamos computar a precisão, que não é nada mais que a proporção de y_pred
que coincide com y_act
.
mean(y_pred == y_act)
Existe uma taxa de precisão de 94%.
Por que é importante lidar com o desequilíbrio de classe?
Pois prometi que lhe dizia porque precisava de tratar do desequilíbrio de classe mais cedo. Para entender isso vamos assumir que você tem um conjunto de dados onde 95% dos valores Y pertencem à classe benigna e 5% pertencem à classe maligna.
Had eu apenas previ cegamente todos os pontos de dados como benignos, eu conseguiria uma porcentagem de precisão de 95%. O que parece bastante elevado. Mas obviamente isso é falho. O que importa é o quão bem você prevê as classes malignas.
Então isso requer que as classes benignas e malignas sejam equilibradas E além disso eu preciso de medidas de precisão mais refinadas e métricas de avaliação de modelos para melhorar o meu modelo de previsão.
Código completo
Conclusão
Neste post você viu quando e como usar a regressão logística para classificar variáveis de resposta binária em R.
Você viu isto com um exemplo baseado no conjunto de dados BreastCancer
onde o objetivo era determinar se uma determinada massa de tecido é maligna ou benigna.
Construir o modelo e classificar o Y é apenas meio trabalho feito. Na verdade, nem mesmo a metade. Porque, o alcance das métricas de avaliação para julgar a eficácia do modelo é vasto e requer um julgamento cuidadoso para escolher o modelo certo. Na próxima parte, discutirei várias métricas de avaliação que ajudarão a entender o desempenho do modelo de classificação a partir de diferentes perspectivas.