La regresión logística es un algoritmo de modelización predictiva que se utiliza cuando la variable Y es binaria categórica. Es decir, sólo puede tomar dos valores como 1 o 0. El objetivo es determinar una ecuación matemática que pueda utilizarse para predecir la probabilidad del evento 1. Una vez establecida la ecuación, se puede utilizar para predecir la Y cuando sólo se conocen las X�s.
Regresión Logística – Un Tutorial Completo Con Ejemplos en R Contenido1. Introducción a la regresión logística
2. Algunos ejemplos del mundo real de problemas de clasificación binaria
3. ¿Por qué no la regresión lineal?
4. La ecuación logística
5. ¿Cómo construir el modelo de regresión logística en R?
6. ¿Cómo manejar el desequilibrio de clases?
7. ¿Cómo manejar el desequilibrio de clases con upsample y downsample?
8. Construcción del modelo de regresión logística
9. Cómo predecir en el conjunto de datos de prueba
10. ¿Por qué es importante manejar el desequilibrio de clases? Conclusión
- 1. Introducción a la regresión logística
- Algunos ejemplos del mundo real de problemas de clasificación binaria
- ¿Por qué no la regresión lineal?
- La Ecuación Logística
- ¿Cómo construir un modelo de regresión logística en R?
- How to deal with Class Imbalance?
- 7. Cómo manejar el desequilibrio de clases con el muestreo ascendente y el muestreo descendente
- Construyendo el modelo de regresión logística
- Cómo predecir en el conjunto de datos de prueba
- ¿Por qué el manejo del desequilibrio de clases es importante?
- Código completo
- Conclusión
1. Introducción a la regresión logística
Antes vio qué es la regresión lineal y cómo utilizarla para predecir variables Y continuas.
En la regresión lineal la variable Y es siempre una variable continua. Si se supone que la variable Y es categórica, no se puede utilizar el modelo de regresión lineal.
Entonces, ¿qué haría cuando la Y es una variable categórica con 2 clases?
La regresión logística se puede utilizar para modelar y resolver tales problemas, también llamados problemas de clasificación binaria.
Un punto clave a tener en cuenta aquí es que Y sólo puede tener 2 clases y no más que eso. Si Y tiene más de 2 clases, se convertiría en una clasificación multiclase y ya no se podría utilizar la regresión logística de vainilla para ello.
Sin embargo, la regresión logística es una técnica clásica de modelado predictivo y sigue siendo una opción popular para modelar variables categóricas binarias.
Otra ventaja de la regresión logística es que calcula una puntuación de probabilidad de predicción de un evento. Más sobre esto cuando realmente empiece a construir los modelos.
Algunos ejemplos del mundo real de problemas de clasificación binaria
Podría preguntarse para qué tipo de problemas puede utilizar la regresión logística.
Aquí hay algunos ejemplos de problemas de clasificación binaria:
- Detección de Spam : Predicción de si un correo electrónico es Spam o no
- Fraude con tarjeta de crédito : Predicción de si una determinada transacción con tarjeta de crédito es un fraude o no
- Salud : Predicción de si una determinada masa de tejido es benigna o maligna
- Marketing : Predicción de si un determinado usuario comprará o no un producto de seguro
- Banca : Predicción de si un cliente incumplirá un préstamo.
¿Por qué no la regresión lineal?
Cuando la variable de respuesta tiene sólo 2 valores posibles, es deseable tener un modelo que prediga el valor como 0 o 1 o como una puntuación de probabilidad que oscile entre 0 y 1.
La regresión lineal no tiene esta capacidad. Porque, si utiliza la regresión lineal para modelar una variable de respuesta binaria, el modelo resultante puede no restringir los valores Y predichos entre 0 y 1.
Aquí es donde entra en juego la regresión logística. En la regresión logística, se obtiene una puntuación de probabilidad que refleja la probabilidad de ocurrencia del evento.
Un evento en este caso es cada fila del conjunto de datos de entrenamiento. Podría ser algo como clasificar si un determinado correo electrónico es spam, o la masa de la célula es maligna o un usuario va a comprar un producto y así sucesivamente.
La Ecuación Logística
La regresión logística logra esto tomando las probabilidades logarítmicas del evento ln(P/1?P), donde, P es la probabilidad del evento. Así que P siempre se encuentra entre 0 y 1.
Tomando el exponente en ambos lados de la ecuación da:
Puedes implementar esta ecuación utilizando la función glm()
estableciendo el argumento family
a "binomial"
.
También, una advertencia importante es asegurarse de establecer el type="response"
cuando se utiliza la función predict
en un modelo de regresión logística. De lo contrario, predecirá las probabilidades logarítmicas de P, es decir, el valor Z, en lugar de la propia probabilidad.
¿Cómo construir un modelo de regresión logística en R?
Ahora vamos a ver cómo implementar la regresión logística utilizando el conjunto de datos BreastCancer
en el paquete mlbench
. Tendrá que instalar el paquete mlbench
para esto.
El objetivo aquí es modelar y predecir si un espécimen dado (fila en el conjunto de datos) es benign
o malignant
, basándose en otras 9 características de las células. Así pues, carguemos los datos y mantengamos sólo los casos completos.
El conjunto de datos tiene 699 observaciones y 11 columnas. La columna Class
es la variable de respuesta (dependiente) y dice si un determinado tejido es maligno o benigno.
Veamos la estructura de este conjunto de datos.
Excepto Id
, todas las demás columnas son factores. Esto es un problema cuando se modela este tipo de datos.
Porque, cuando se construye un modelo logístico con variables factoriales como características, convierte cada nivel del factor en una variable binaria ficticia de 1 y 0.
Por ejemplo, Cell shape es un factor con 10 niveles. Cuando se utiliza glm para modelar Class como una función de la forma de la célula, la forma de la célula se dividirá en 9 variables categóricas binarias diferentes antes de construir el modelo.
Si va a construir un modelo logístico sin hacer ningún paso preparatorio entonces lo siguiente es lo que podría hacer. Pero no vamos a seguir esto ya que hay ciertas cosas a tener en cuenta antes de construir el modelo logit.
La sintaxis para construir un modelo logit es muy similar a la función lm
que vio en la regresión lineal. Sólo es necesario establecer el family='binomial'
para glm
para construir un modelo de regresión logística.
glm
significa modelos lineales generalizados y es capaz de construir muchos tipos de modelos de regresión además de la regresión lineal y logística.
Veamos cómo podría ser el código para construir un modelo logístico. Voy a venir a este paso de nuevo más tarde, ya que hay algunos pasos de preprocesamiento que se debe hacer antes de construir el modelo.
En el modelo anterior, Class
se modela como una función de Cell.shape
solo.
Pero nota de la salida, el Cell.Shape
se dividió en 9 variables diferentes. Esto se debe a que, como Cell.Shape
se almacena como una variable factorial, glm
crea 1 variable binaria (también conocida como variable ficticia) para cada uno de los 10 niveles categóricos de Cell.Shape
.
Claramente, a partir del significado de Cell.Shape
parece haber algún tipo de ordenación dentro de los niveles categóricos de Cell.Shape
. Es decir, un valor de forma de celda 2 es mayor que la forma de celda 1 y así sucesivamente.
Este es el caso de otras variables en el conjunto de datos también. Por lo tanto, es preferible convertirlas en variables numéricas y eliminar la columna id.
Si se tratara de una variable categórica pura sin ordenación interna, como, por ejemplo, el sexo del paciente, puede dejar esa variable como un factor en sí mismo.
# 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
Las clases “benigno” y “maligno” se dividen aproximadamente en una proporción de 1:2.
Está claro que hay un desequilibrio de clases. Por lo tanto, antes de construir el modelo logit, es necesario construir las muestras de tal manera que tanto los 1’s como los 0’s estén en proporciones aproximadamente iguales.
Esta preocupación se maneja normalmente con un par de técnicas llamadas:
- Muestreo hacia abajo
- Muestreo hacia arriba
- Muestreo híbrido usando SMOTE y ROSE.
¿Qué es el muestreo descendente y el muestreo ascendente?
7. Cómo manejar el desequilibrio de clases con el muestreo ascendente y el muestreo descendente
En el muestreo descendente, la clase mayoritaria se muestrea aleatoriamente hacia abajo para que tenga el mismo tamaño que la clase más pequeña. Esto significa que, al crear el conjunto de datos de entrenamiento, las filas con la clase benigna se elegirán menos veces durante el muestreo aleatorio.
De forma similar, en el muestreo ascendente, las filas de la clase minoritaria, es decir, malignant
se muestrean repetidamente una y otra vez hasta que alcanzan el mismo tamaño que la clase mayoritaria (benign
).
Pero en el caso del muestreo híbrido, se generan puntos de datos artificiales que se añaden sistemáticamente alrededor de la clase minoritaria. Esto se puede implementar utilizando los paquetes SMOTE
y ROSE
.
Sin embargo, para este ejemplo, mostraré cómo hacer un muestreo ascendente y descendente.
Así que permítame crear los datos de entrenamiento y prueba utilizando el paquete caret.
En el fragmento anterior, he cargado el paquete caret y he utilizado la función createDataPartition
para generar los números de fila para el conjunto de datos de entrenamiento. Mediante la configuración de p=.70
He elegido que el 70% de las filas vayan dentro de trainData
y el 30% restante vaya a testData
.
table(trainData$Class)
Hay aproximadamente 2 veces más muestras benignas. Así que vamos a hacer un downsample usando la función downSample
del paquete caret
.
Para hacer esto sólo hay que proporcionar las variables X e Y como argumentos.
Los benignos y los malignos están ahora en la misma proporción.
La función %ni%
es la negación de la función %in%
y la he utilizado aquí para seleccionar todas las columnas excepto la columna Class
.
La función downSample
requiere la ‘y’ como variable factorial, por eso había convertido la clase en un factor en los datos originales.
¡Genial! Ahora déjame hacer el upsampling usando la función upSample
. Sigue una sintaxis similar a la de downSample
.
Como era de esperar, benigno y maligno están ahora en la misma proporción.
Utilizaré la versión downSampled del conjunto de datos para construir el modelo logit en el siguiente paso.
Construyendo el modelo de regresión logística
Cómo predecir en el conjunto de datos de prueba
El logitmod
está ahora construido. Ahora puede utilizarlo para predecir la respuesta en testData
.
pred <- predict(logitmod, newdata = testData, type = "response")
Ahora, pred
contiene la probabilidad de que la observación sea maligna para cada observación.
Nótese que, cuando se utiliza la regresión logística, es necesario establecer type='response'
para calcular las probabilidades de predicción. Este argumento no es necesario en el caso de la regresión lineal.
La práctica común es tomar el corte de probabilidad como 0,5. Si la probabilidad de Y es > 0,5, entonces se puede clasificar un evento (maligno).
Así que si pred es mayor que 0,5, es maligno sino es benigno.
y_pred_num <- ifelse(pred > 0.5, 1, 0)y_pred <- factor(y_pred_num, levels=c(0, 1))y_act <- testData$Class
Calculemos la precisión, que no es más que la proporción de y_pred
que coincide con y_act
.
mean(y_pred == y_act)
Aquí tienes una tasa de precisión del 94%.
¿Por qué el manejo del desequilibrio de clases es importante?
De acuerdo, prometí que te diría por qué necesitas cuidar el desequilibrio de clases antes. Para entenderlo, supongamos que tenemos un conjunto de datos en el que el 95% de los valores Y pertenecen a la clase benigna y el 5% a la clase maligna.
Si hubiera predicho a ciegas todos los puntos de datos como benignos, conseguiría un porcentaje de precisión del 95%. Lo que parece bastante alto. Pero, obviamente, eso es defectuoso. Lo que importa es lo bien que predice las clases malignas.
Así que eso requiere que las clases benignas y malignas estén equilibradas Y además necesito medidas de precisión más refinadas y métricas de evaluación del modelo para mejorar mi modelo de predicción.
Código completo
Conclusión
En este post has visto cuándo y cómo utilizar la regresión logística para clasificar variables de respuesta binaria en R.
Has visto esto con un ejemplo basado en el conjunto de datos BreastCancer
donde el objetivo era determinar si una masa de tejido dada es maligna o benigna.
Construir el modelo y clasificar la Y es sólo la mitad del trabajo hecho. En realidad, ni siquiera la mitad. Porque, el alcance de las métricas de evaluación para juzgar la eficacia del modelo es vasto y requiere un juicio cuidadoso para elegir el modelo correcto. En la siguiente parte, hablaré de varias métricas de evaluación que ayudarán a entender el rendimiento del modelo de clasificación desde diferentes perspectivas.