Saltar al contenido principal
InicioTutorialesProgramación R

Regresión logística en R Tutorial

Descubra todo sobre la regresión logística: en qué se diferencia de la regresión lineal, cómo ajustar y evaluar estos modelos en R con la función glm() y mucho más.
Actualizado may 2024  · 14 min leer

Run and edit the code from this tutorial online

Run Code

La regresión logística es un modelo sencillo pero potente para predecir resultados binarios. Es decir, si algo sucederá o no. Es un tipo de modelo de clasificación para el aprendizaje automático supervisado.

La regresión logística se utiliza en casi todos los sectores (marketing, sanidad, ciencias sociales, etc.) y es una parte esencial de las herramientas de cualquier científico de datos.

Para sacar el máximo partido de este tutorial es necesario tener conocimientos básicos de R. También ayuda conocer un tipo de modelo relacionado, la regresión lineal. Lea el tutorial Regresión lineal en R para obtener más información al respecto.

Visión general de la regresión logística

Supongamos que quieres predecir si hoy va a ser un día soleado o no. Hay dos resultados posibles: "soleado" o "no soleado". La variable de resultado también se conoce como "variable objetivo" o "variable dependiente".

Hay muchas variables que pueden influir en el resultado, como "la temperatura del día anterior", "la presión atmosférica", etc. Las variables que influyen se conocen como características, variables independientes o predictores; todos estos términos significan lo mismo. 

Otros ejemplos son si un cliente comprará su producto o no, si un correo electrónico es spam o no, si una transacción es fraudulenta o no, y si un medicamento curará a un paciente o no.  

¿Cómo funciona la regresión logística?

La regresión logística encuentra el mejor ajuste posible entre las variables predictoras y objetivo para predecir la probabilidad de que la variable objetivo pertenezca a una clase/categoría etiquetada. 

La regresión lineal intenta encontrar la mejor línea recta que prediga el resultado a partir de las características. Forma una ecuación como

y_predictions = intercept + slope * features

y utiliza la optimización para intentar encontrar los mejores valores posibles de intercepto y pendiente.

La regresión logística funciona de forma similar, salvo que realiza la regresión sobre las probabilidades de que el resultado sea una categoría. Utiliza una función sigmoidea (la función de distribución acumulativa de la distribución logística) para transformar el lado derecho de esa ecuación.

y_predictions = logistic_cdf(intercept + slope * features)

Una vez más, el modelo utiliza la optimización para intentar encontrar los mejores valores posibles de intercepción y pendiente.

Dado que el algoritmo de la regresión logística es muy similar a la ecuación de la regresión lineal, forma parte de una familia de modelos denominada "modelos lineales generalizados". Por eso la regresión logística lleva "regresión" en su nombre, aunque sea un modelo de clasificación.

La función sigmoidea se asemeja a una curva en forma de S en la imagen inferior. Toma los valores de entrada numerados reales y los convierte entre 0 y 1 (reduciendo de ambos lados, es decir, los valores negativos a 0 y los positivos muy altos a 1). Además, el umbral de corte es el factor decisivo superpuesto que divide el resultado en categorías o clases cuando se aplica sobre estas probabilidades.

image4.png

Los conceptos complejos se entienden mejor cuando se explican con ejemplos, así que tomemos una analogía para registrar el funcionamiento del algoritmo LR. Supongamos que el modelo LR se encarga de identificar una transacción fraudulenta examinando varios indicadores de fraude, como la ubicación del usuario, el importe de la compra, la dirección IP, etc. El objetivo es determinar la probabilidad de que una transacción determinada sea legítima o fraudulenta, lo que constituye la variable objetivo.

El modelo asigna pesos a los predictores en función de su impacto en la variable objetivo y los combina para calcular la puntuación normalizada o probabilidad de fraude. 

El conjunto de datos

Utilizaremos un conjunto de datos de una campaña de marketing directo realizada por una entidad bancaria portuguesa mediante llamadas telefónicas. La campaña pretende vender suscripciones de un depósito bancario a plazo representado por la variable y (suscripción o no suscripción). El objetivo del modelo de regresión logística es predecir si un cliente comprará o no una suscripción en función de las variables predictoras, es decir, los atributos del cliente, como la información demográfica.

image1.png

El diccionario de datos de este conjunto de datos y de muchos otros útiles puede consultarse en el sitio web de Datacamp.

Variable

Descripción

Detalles

edad

edad del cliente

 

job

tipo de trabajo

categorical: "admin.", "obrero", "empresario", "empleada del hogar", "directivo", "jubilado", "autónomo", "servicios", "estudiante", "técnico", "desempleado", "desconocido".

marital

estado civil

categórico: "divorciado", "casado", "soltero", "desconocido"; nota: "divorciado" significa divorciado o viudo

educación

mayor grado de atención al cliente

categorical: "básico.4años", "básico.6años", "básico.9años", "bachillerato", "analfabeto", "curso.profesional", "título.universitario", "desconocido"

por defecto

¿tiene crédito en mora?

categorical: "no", "sí", "desconocido"

vivienda

¿tiene préstamo para vivienda?

categorical: "no", "sí", "desconocido"

préstamo

¿tiene préstamo personal?

categorical: "no", "sí", "desconocido"

póngase en contacto con

contacto tipo de comunicación

categorical: "móvil", "teléfono"

mes

último contacto mes del año

categorical: "jan", "feb", "mar", ..., "nov", "dec"

day_of_week

último día de contacto de la semana

categorical: "mon","tue","wed","thu","fri"

campaña

número de veces que el cliente ha contactado durante esta campaña

numérico, incluye el último contacto

pdays

número de días transcurridos desde la última vez que se contactó con el cliente en una campaña anterior

numérico; 999 significa que no se ha contactado previamente con el cliente

anterior

número de contactos realizados antes de esta campaña y para este cliente

numérico

poutcome

resultado de la campaña de marketing anterior

categorical: "fracaso", "inexistente", "éxito"

emp.var.rate

tasa de variación del empleo - indicador trimestral

numérico

cons.price.idx

índice de precios al consumo - indicador mensual

numérico

cons.conf.idx

índice de confianza del consumidor - indicador mensual

numérico

euribor3m

tipo euribor 3 meses - indicador diario

numérico

nr.employed

número de empleados - indicador trimestral

numérico

y

¿ha suscrito el cliente un depósito a plazo?

binario: "sí", "no"

Flujo de trabajo de regresión logística

El flujo de trabajo completo del aprendizaje automático se describe en la infografía Guía para principiantes sobre el flujo de trabajo del aprendizaje automático. Aquí nos centraremos en los pasos de preparación de datos y modelado. En concreto, trataremos:

  • Dividir los datos en conjuntos de entrenamiento y de prueba
  • Ajuste (entrenamiento) del modelo
  • Predicciones
  • Evaluación del rendimiento del modelo
  • Ajuste de hiperparámetros

Paquetes de regresión logística

En R, hay dos flujos de trabajo populares para modelar la regresión logística: base-R y tidymodels.

El flujo de trabajo de modelos base-R es más sencillo e incluye funciones como glm() y summary() para ajustar el modelo y generar un resumen del mismo.

El flujo de trabajo tidymodels permite una gestión más sencilla de varios modelos y una interfaz coherente para trabajar con distintos tipos de modelos.

Este tutorial utilizará el flujo de trabajo tidymodels.

Visualizar los datos

Importa el paquete tidymodels llamando a la función library(). 

El conjunto de datos está en un archivo CSV con formato europeo (comas para los decimales y punto y coma para los separadores). Lo leeremos con read_csv2() del paquete readr. 

Convierta la variable objetivo, y, en una variable factorial para la modelización. 

Utilizando la función ggplot(), trace el recuento de cada ocupación laboral con respecto a y.

library(readr)
library(tidymodels)

# Read the dataset and convert the target variable to a factor
bank_df <- read_csv2("bank-full.csv")
bank_df$y = as.factor(bank_df$y)

# Plot job occupation against the target variable
ggplot(bank_df, aes(job, fill = y)) +
    geom_bar() +
    coord_flip()

image5.png

Dividir los datos

Dividamos el conjunto de datos en un conjunto de entrenamiento para ajustar el modelo y un conjunto de pruebas para evaluar el modelo y asegurarnos de que el modelo así entrenado funciona en un conjunto de datos no visto.

La división de los datos en conjuntos de entrenamiento y prueba puede realizarse utilizando la función initial_split() y el atributo prop que define la proporción de datos de entrenamiento.

# Split data into train and test
set.seed(421)
split <- initial_split(bank_df, prop = 0.8, strata = y)
train <- split %>% 
         training()
test <- split %>% 
        testing()

Ajuste y evaluación del modelo

Para crear el modelo, declare un modelo logistic_reg(). Esto necesita argumentos de mezcla y penalización que controlen la cantidad de regularización. Un valor de mezcla de 1 denota un modelo lasso y 0 denota una regresión ridge. También se permiten valores intermedios. El argumento de la penalización denota la fuerza de la regularización.

Tenga en cuenta que debe pasar números de coma flotante "doble" a la mezcla y la penalización

Establezca el "motor" (el software backend utilizado para ejecutar los cálculos) con set_engine(). Hay varias opciones: El motor por defecto es "glm", que realiza una regresión logística clásica. Los estadísticos suelen preferir este método porque se obtienen valores p para cada coeficiente, lo que facilita la comprensión de la importancia de cada coeficiente.

Aquí utilizaremos el motor "glmnet". Los científicos especializados en aprendizaje automático lo prefieren porque permite la regularización, que puede mejorar las predicciones, sobre todo si se dispone de muchas características. (En Python, el paquete scikit-learn incluye por defecto cierta regularización en la regresión logística).

Llama al método fit() para entrenar el modelo en los datos de entrenamiento creados en el paso anterior. Toma una fórmula como primer argumento. En el lado izquierdo de la fórmula, se utiliza la variable objetivo (en este caso y). En la parte derecha, puede incluir las características que desee. Un punto significa "utilizar todas las variables que no estaban escritas en el lado izquierdo de la fórmula". Para más información sobre la escritura de fórmulas, lea el Tutorial de fórmulas de R.

# Train a logistic regression model
model <- logistic_reg(mixture = double(1), penalty = double(1)) %>%
  set_engine("glmnet") %>%
  set_mode("classification") %>%
  fit(y ~ ., data = train)

# Model summary
tidy(model)

El resultado se muestra a continuación con la columna de estimación que representa los coeficientes del predictor.

# A tibble: 43 × 3
   term              estimate penalty
   <chr>                <dbl>   <dbl>
 1 (Intercept)      -2.59           0
 2 age              -0.000477       0
 3 jobblue-collar   -0.183          0
 4 jobentrepreneur  -0.206          0
 5 jobhousemaid     -0.270          0
 6 jobmanagement    -0.0190         0
 7 jobretired        0.360          0
 8 jobself-employed -0.101          0
 9 jobservices      -0.105          0
10 jobstudent        0.415          0
# ... with 33 more rows
# ℹ Use `print(n = ...)` to see more rows

Predicciones

Realice predicciones sobre los datos de prueba utilizando la función predict(). Puede elegir el tipo de predicciones.

  • type = "class" devuelve el valor objetivo más probable para cada observación. En este caso, devolverá un "sí" o un "no" en función de si el modelo piensa que es probable que el cliente suscriba un depósito a plazo o no.
  • type = "prob" devuelve la probabilidad de cada valor objetivo para cada observación. En este caso, devolverá la probabilidad de un "sí" y la probabilidad de un "no" (que suman uno para cada observación).
# Class Predictions
pred_class <- predict(model,
                      new_data = test,
                      type = "class")

# Class Probabilities
pred_proba <- predict(model,
                      new_data = test,
                      type = "prob")

Evalúe el modelo utilizando la función accuracy() con el argumento de verdad como y y estime que el valor del argumento son las predicciones del paso anterior.

results <- test %>%
           select(y) %>%
           bind_cols(pred_class, pred_proba)

accuracy(results, truth = y, estimate = .pred_class)

Ajuste de hiperparámetros

En lugar de pasar valores específicos a los argumentos de mezcla y penalización (los "hiperparámetros"), puede optimizar el poder predictivo del modelo ajustándolo. 

La idea es ejecutar el modelo muchas veces con distintos valores de los hiperparámetros y ver cuál ofrece las mejores predicciones.

  • En la función logistic_reg(), establezca los argumentos de mezcla y penalización para una llamada a tune().
  • Utilice la función grid_regular() para definir una cuadrícula de valores posibles para la mezcla y la penalización.
  • La función workflow() crea un objeto para almacenar los detalles del modelo, que es necesario cuando se ejecuta muchas veces. 
  • Elija el mejor modelo utilizando la función select_best(). Puede elegir entre una serie de métricas que definen la "mejor". En este caso, utilizaremos la métrica "área bajo la curva de las características operativas del receptor" (ROC AUC).
# Define the logistic regression model with penalty and mixture hyperparameters
log_reg <- logistic_reg(mixture = tune(), penalty = tune(), engine = "glmnet")

# Define the grid search for the hyperparameters
grid <- grid_regular(mixture(), penalty(), levels = c(mixture = 4, penalty = 3))

# Define the workflow for the model
log_reg_wf <- workflow() %>%
  add_model(log_reg) %>%
  add_formula(y ~ .)

# Define the resampling method for the grid search
folds <- vfold_cv(train, v = 5)

# Tune the hyperparameters using the grid search
log_reg_tuned <- tune_grid(
  log_reg_wf,
  resamples = folds,
  grid = grid,
  control = control_grid(save_pred = TRUE)
)

select_best(log_reg_tuned, metric = "roc_auc")
# A tibble: 1 × 3
       penalty mixture .config              
         <dbl>   <dbl> <chr>                
1 0.0000000001       0 Preprocessor1_Model01

Más métricas de evaluación

Utilizar los mejores hiperparámetros:

  1. Entrenemos un modelo de regresión logística
  2. Utilícelo para generar predicciones sobre el conjunto de pruebas
  3. Crear una matriz de confusión utilizando los valores verdaderos, y las estimaciones
# Fit the model using the optimal hyperparameters
log_reg_final <- logistic_reg(penalty = 0.0000000001, mixture = 0) %>%
                 set_engine("glmnet") %>%
                 set_mode("classification") %>%
                 fit(y~., data = train)

# Evaluate the model performance on the testing set
pred_class <- predict(log_reg_final,
                      new_data = test,
                      type = "class")
results <- test %>%
  select(y) %>%
  bind_cols(pred_class, pred_proba)

# Create confusion matrix
conf_mat(results, truth = y,
         estimate = .pred_class)
Truth
Prediction   no  yes
       no  7838  738
       yes  147  320

Puede calcular la precisión (valor predictivo positivo, el número de positivos verdaderos dividido por el número de positivos predichos) con la función precision().

precision(results, truth = y,
          estimate = .pred_class)
# A tibble: 1 × 3
  .metric   .estimator .estimate
  <chr>     <chr>          <dbl>
1 precision binary         0.914

Del mismo modo, puede calcular el recall (sensibilidad, el número de verdaderos positivos dividido por el número de verdaderos positivos) con la función recall().

recall(results, truth = y,
          estimate = .pred_class)
# A tibble: 1 × 3
  .metric .estimator .estimate
  <chr>   <chr>          <dbl>
1 recall  binary         0.982

Entendamos las variables que influyen en la decisión de compra de suscripciones. En un escenario de regresión logística, los coeficientes deciden lo sensible que es la variable objetivo a los predictores individuales. Cuanto mayor sea el valor de los coeficientes, mayor será su importancia. Ordena las variables en orden descendente del valor absoluto de sus valores de coeficiente y muestra sólo los coeficientes con un valor absoluto superior a 0,5.

coeff <- tidy(log_reg_final) %>% 
  arrange(desc(abs(estimate))) %>% 
  filter(abs(estimate) > 0.5)
# A tibble: 10 × 3
   term            estimate      penalty
   <chr>              <dbl>        <dbl>
 1 (Intercept)       -2.59  0.0000000001
 2 poutcomesuccess    2.08  0.0000000001
 3 monthmar           1.62  0.0000000001
 4 monthoct           1.08  0.0000000001
 5 monthsep           1.03  0.0000000001
 6 contactunknown    -1.01  0.0000000001
 7 monthdec           0.861 0.0000000001
 8 monthjan          -0.820 0.0000000001
 9 housingyes        -0.550 0.0000000001
10 monthnov          -0.517 0.0000000001

Represente gráficamente la importancia de las características mediante la función ggplot().

ggplot(coeff, aes(x = term, y = estimate, fill = term)) + geom_col() + coord_flip()

image2.png

Pase al siguiente nivel

Con esto, hemos llegado al final de este tutorial que demostraba cómo entrenar y evaluar un modelo de regresión logística utilizando el paquete tidymodels. También se explicaba cómo interpretar los resultados del modelo y representarlos gráficamente, como la importancia de los rasgos. 

Si quieres saber más sobre el modelado de modelos de IA con tidymodels, consulta el curso Modelado con tidymodels en R. Para modelar utilizando el enfoque base-R, consulte los cursos Introducción a la regresión en R, Regresión intermedia en R y Modelos lineales generalizados en R.

Temas

Cursos R

Course

Introduction to R

4 hr
2.7M
Master the basics of data analysis in R, including vectors, lists, and data frames, and practice R with real data sets.
See DetailsRight Arrow
Start Course
Ver másRight Arrow
Relacionado

blog

¿Qué es R? - Introducción al motor de cálculo estadístico

Aprenda todo lo que necesita saber sobre el lenguaje de programación R y descubra por qué es el lenguaje más utilizado en la ciencia de datos.
Summer Worsley's photo

Summer Worsley

18 min

R Project

blog

Las 8 mejores ideas de proyectos R para 2023

Descubra qué es R y todas las ventajas de utilizarlo, a la vez que ofrece ejemplos y nuevas ideas para un proyecto.
Elena Kosourova 's photo

Elena Kosourova

16 min

tutorial

Programación funcional frente a programación orientada a objetos en el análisis de datos

Explore dos de los paradigmas de programación más utilizados en la ciencia de datos: la programación orientada a objetos y la programación funcional.
Amberle McKee's photo

Amberle McKee

15 min

tutorial

K-Nearest Neighbors (KNN) Clasificación con R Tutorial

Aprenda a utilizar los paquetes 'class' y 'caret' de R, a ajustar los hiperparámetros y a evaluar el rendimiento del modelo.
Abid Ali Awan's photo

Abid Ali Awan

11 min

tutorial

Guía de expresiones regulares en R

Explore las expresiones regulares en R, por qué son importantes, las herramientas y funciones para trabajar con ellas, patrones regex comunes y cómo utilizarlos.
Elena Kosourova 's photo

Elena Kosourova

16 min

tutorial

Tutorial de RStudio

Descubra qué es RStudio y cómo instalarlo y empezar a utilizarlo
Elena Kosourova 's photo

Elena Kosourova

17 min

See MoreSee More