Creando Modelos Predictivos Regresión Logística en Python

Creando Modelos de Regresión Logística con Python para Predicciones

 

Cuando estás comenzando con el aprendizaje automático, la regresión logística es uno de los primeros algoritmos que agregarás a tu caja de herramientas. Es un algoritmo simple y robusto, comúnmente utilizado para tareas de clasificación binaria.

Considera un problema de clasificación binaria con clases 0 y 1. La regresión logística ajusta una función logística o sigmoide a los datos de entrada y predice la probabilidad de que un punto de datos de consulta pertenezca a la clase 1. ¿Interesante, verdad?

En este tutorial, aprenderemos acerca de la regresión logística desde cero, cubriendo:

  • La función logística (o sigmoide)
  • Cómo pasar de la regresión lineal a la regresión logística
  • Cómo funciona la regresión logística

Finalmente, construiremos un modelo de regresión logística simple para clasificar los retornos de RADAR de la ionosfera.

 

Función Logística

Antes de aprender más sobre la regresión logística, revisemos cómo funciona la función logística. La función logística (o sigmoide) está dada por:

   

Cuando graficas la función sigmoide, se verá así:

   

Del gráfico, podemos ver que:

  • Cuando x = 0, σ(x) toma el valor de 0.5.
  • Cuando x tiende a +∞, σ(x) tiende a 1.
  • Cuando x tiende a -∞, σ(x) tiende a 0.

Entonces, para todas las entradas reales, la función sigmoide las comprime para que tomen valores en el rango [0, 1].

 

De la Regresión Lineal a la Regresión Logística

 Primero, discutamos por qué no podemos usar regresión lineal para un problema de clasificación binaria.

En un problema de clasificación binaria, la salida es una etiqueta categórica (0 o 1). Debido a que la regresión lineal predice salidas de valor continuo que pueden ser menores que 0 o mayores que 1, no tiene sentido para el problema en cuestión.

Además, una línea recta puede no ser el mejor ajuste cuando las etiquetas de salida pertenecen a una de las dos categorías.

  

Entonces, ¿cómo pasamos de la regresión lineal a la regresión logística? En la regresión lineal, la salida predicha se obtiene mediante:

Donde los βs son los coeficientes y los X_is son los predictores (o características).

Sin pérdida de generalidad, asumamos X_0 = 1:

Entonces podemos tener una expresión más concisa:

   

En la regresión logística, necesitamos la probabilidad predicha p_i en el intervalo [0,1]. Sabemos que la función logística comprime las entradas para que tomen valores en el intervalo [0,1].

Entonces, al insertar esta expresión en la función logística, obtenemos la probabilidad predicha como:

   

 

Bajo el Capó de la Regresión Logística

 Entonces, ¿cómo encontramos la mejor curva logística ajustada para el conjunto de datos dado? Para responder a esto, vamos a entender la estimación de máxima verosimilitud.

La Estimación de Máxima Verosimilitud (MLE, por sus siglas en inglés) se utiliza para estimar los parámetros del modelo de regresión logística maximizando la función de verosimilitud. Vamos a desglosar el proceso de MLE en regresión logística y cómo se formula la función de costo para la optimización utilizando el descenso de gradiente.

 

Desglosando la Estimación de Máxima Verosimilitud

 Como se discutió, modelamos la probabilidad de que ocurra un resultado binario como función de una o más variables predictoras (o características):

   

Aquí, los βs son los parámetros o coeficientes del modelo. X_1, X_2,…, X_n son las variables predictoras.

MLE tiene como objetivo encontrar los valores de β que maximicen la verosimilitud de los datos observados. La función de verosimilitud, denotada como L(β), representa la probabilidad de observar los resultados dados los valores de las variables predictoras en el modelo de regresión logística.

 

Formulando la Función de Log-Verosimilitud

 Para simplificar el proceso de optimización, es común trabajar con la función de log-verosimilitud. Esto se debe a que transforma productos de probabilidades en sumas de logaritmos de probabilidades.

La función de log-verosimilitud para la regresión logística es:

   

 

Función de Costo y Descenso de Gradiente

 Ahora que entendemos la esencia de la log-verosimilitud, procedamos a formular la función de costo para la regresión logística y posteriormente el descenso de gradiente para encontrar los mejores parámetros del modelo.

 

Función de Costo para la Regresión Logística

Para optimizar el modelo de regresión logística, necesitamos maximizar la log-verosimilitud. Por lo tanto, podemos utilizar la log-verosimilitud negativa como función de costo a minimizar durante el entrenamiento. La log-verosimilitud negativa, también conocida como pérdida logística, se define como:

   

El objetivo del algoritmo de aprendizaje es encontrar los valores de β que minimicen esta función de costo. El descenso de gradiente es un algoritmo de optimización comúnmente utilizado para encontrar el mínimo de esta función de costo.

 

Descenso de Gradiente en la Regresión Logística

 

El descenso de gradiente es un algoritmo de optimización iterativo que actualiza los parámetros del modelo β en la dirección opuesta al gradiente de la función de costo con respecto a β. La regla de actualización en el paso t+1 para la regresión logística utilizando el descenso de gradiente es la siguiente:

   

Donde α es la tasa de aprendizaje.

Las derivadas parciales se pueden calcular utilizando la regla de la cadena. El descenso de gradiente actualiza iterativamente los parámetros, hasta la convergencia, con el objetivo de minimizar la pérdida logística. A medida que converge, encuentra los valores óptimos de β que maximizan la verosimilitud de los datos observados.

 

Regresión Logística en Python con Scikit-Learn

 

Ahora que sabemos cómo funciona la regresión logística, vamos a construir un modelo predictivo utilizando la biblioteca scikit-learn.

Utilizaremos el conjunto de datos de ionosfera del repositorio de aprendizaje automático de UCI para este tutorial. El conjunto de datos consta de 34 características numéricas. La salida es binaria, una de ‘buena’ o ‘mala’ (denotada por ‘g’ o ‘b’). La etiqueta de salida ‘buena’ se refiere a los retornos de RADAR que han detectado alguna estructura en la ionosfera.

 

Paso 1: Cargar el conjunto de datos

 Primero, descarga el conjunto de datos y léelo en un dataframe de pandas:

import pandas as pdimport urlliburl = "https://archive.ics.uci.edu/ml/machine-learning-databases/ionosphere/ionosphere.data"data = urllib.request.urlopen(url)df = pd.read_csv(data, header=None)

 

Paso 2: Explorar el conjunto de datos

 

Veamos las primeras filas del dataframe:

# Mostrar las primeras filas del dataframe df.head()

 

Resultado truncado de df.head()

Obtengamos información sobre el conjunto de datos: el número de valores no nulos y los tipos de datos de cada una de las columnas:

# Obtener información sobre el conjunto de datosprint(df.info())

 

Resultado truncado de df.info()

Dado que todas las características son numéricas, también podemos obtener algunas estadísticas descriptivas utilizando el método describe() en el dataframe:

# Obtener estadísticas descriptivas del conjunto de datosprint(df.describe())

 

Resultado truncado de df.describe()

Los nombres de las columnas son actualmente del 0 al 34, incluyendo la etiqueta. Como el conjunto de datos no proporciona nombres descriptivos para las columnas, solo las denomina attribute_1 a attribute_34, si lo desea, puede cambiar los nombres de las columnas del dataframe como se muestra a continuación:

column_names = ["attribute_1", "attribute_2", "attribute_3", "attribute_4", "attribute_5","attribute_6", "attribute_7", "attribute_8", "attribute_9", "attribute_10","attribute_11", "attribute_12", "attribute_13", "attribute_14", "attribute_15","attribute_16", "attribute_17", "attribute_18", "attribute_19", "attribute_20","attribute_21", "attribute_22", "attribute_23", "attribute_24", "attribute_25","attribute_26", "attribute_27", "attribute_28", "attribute_29", "attribute_30","attribute_31", "attribute_32", "attribute_33", "attribute_34", "class_label"]df.columns = column_names

 

Nota: Este paso es completamente opcional. Puedes continuar con los nombres de columna predeterminados si lo prefieres.

 

# Mostrar las primeras filas del dataframe df.head()

 Resultado truncado de df.head() [Después de cambiar los nombres de las columnas]

 

Paso 3: Cambiar los nombres de las clases y visualizar la distribución de las clases

 Dado que las etiquetas de clase de salida son ‘g’ y ‘b’, necesitamos asignarles 1 y 0 respectivamente. Puedes hacerlo usando map() o replace():

# Convertir las etiquetas de clase de 'g' y 'b' a 1 y 0 respectivamentedf["class_label"] = df["class_label"].replace({'g': 1, 'b': 0})

 

También podemos visualizar la distribución de las etiquetas de clase:

import matplotlib.pyplot as plt# Contar el número de puntos de datos en cada claseclass_counts = df['class_label'].value_counts()# Crear un gráfico de barras para visualizar la distribución de clasesplt.bar(class_counts.index, class_counts.values)plt.xlabel('Etiqueta de Clase')plt.ylabel('Cantidad')plt.xticks(class_counts.index)plt.title('Distribución de Clases')plt.show()

 

Distribución de Etiquetas de Clase 

Observamos que hay un desequilibrio en la distribución. Hay más registros pertenecientes a la clase 1 que a la clase 0. Abordaremos este desequilibrio de clases al construir el modelo de regresión logística.

 

Paso 5 – Preprocesamiento del Conjunto de Datos

 Vamos a recolectar las características y las etiquetas de salida de la siguiente manera:

X = df.drop('class_label', axis=1)  # Características de entraday = df['class_label']               # Variable objetivo

 

Después de dividir el conjunto de datos en conjuntos de entrenamiento y prueba, necesitamos preprocesar el conjunto de datos.

Cuando hay muchas características numéricas, cada una en una escala potencialmente diferente, necesitamos preprocesar las características numéricas. Un método común es transformarlas de manera que sigan una distribución con media cero y varianza unitaria.

El StandardScaler del módulo de preprocesamiento de scikit-learn nos ayuda a lograr esto.

from sklearn.preprocessing import StandardScalerfrom sklearn.model_selection import train_test_split# Dividir el conjunto de datos en conjuntos de entrenamiento y pruebax_entrenamiento, x_prueba, y_entrenamiento, y_prueba = train_test_split(X, y, test_size=0.2, random_state=42)# Obtener los índices de las características numéricasindices_caracteristicas_numericas = list(range(34))  # Suponiendo que las características numéricas están en las columnas 0 a 33# Inicializar los escaladores estándarescaler = StandardScaler()# Normalizar las características numéricas en el conjunto de entrenamientox_entrenamiento.iloc[:, indices_caracteristicas_numericas] = scaler.fit_transform(x_entrenamiento.iloc[:, indices_caracteristicas_numericas])# Normalizar las características numéricas en el conjunto de prueba usando el escalador entrenado del conjunto de entrenamientox_prueba.iloc[:, indices_caracteristicas_numericas] = scaler.transform(x_prueba.iloc[:, indices_caracteristicas_numericas])

 

Paso 6 – Construyendo un Modelo de Regresión Logística

 Ahora podemos instanciar un clasificador de regresión logística. La clase LogisticRegression es parte del módulo linear_model de scikit-learn.

Observa que hemos establecido el parámetro class_weight en ‘balanced’. Esto nos ayudará a tener en cuenta el desequilibrio de clases. Asignando pesos a cada clase, inversamente proporcionales al número de registros en las clases.

Después de instanciar la clase, podemos ajustar el modelo al conjunto de datos de entrenamiento:

from sklearn.linear_model import LogisticRegressionmodelo = LogisticRegression(class_weight='balanced')modelo.fit(x_entrenamiento, y_entrenamiento)

 

Paso 7 – Evaluando el Modelo de Regresión Logística

 Puedes llamar al método predict() para obtener las predicciones del modelo.

Además del puntaje de exactitud, también podemos obtener un informe de clasificación con métricas como precisión, recuperación y puntuación F1.

 

from sklearn.metrics import accuracy_score, classification_reporty_pred = modelo.predict(x_prueba)exactitud = accuracy_score(y_prueba, y_pred)print(f"Precisión: {exactitud:.2f}")reporte_clasificacion = classification_report(y_prueba, y_pred)print("Informe de Clasificación:\n", reporte_clasificacion)

   

¡Felicidades, has codificado tu primer modelo de regresión logística!

 

Conclusión

 En este tutorial, aprendimos sobre la regresión logística en detalle: desde la teoría y las matemáticas hasta la codificación de un clasificador de regresión logística.

Como próximo paso, intenta construir un modelo de regresión logística para un conjunto de datos adecuado de tu elección.

 

Créditos del Conjunto de Datos

El conjunto de datos de la Ionosfera está bajo licencia de Atribución 4.0 Internacional de Creative Commons (CC BY 4.0):

Sigillito, V., Wing, S., Hutton, L., y Baker, K.. (1989). Ionosphere. UCI Machine Learning Repository. https://doi.org/10.24432/C5W01B.

[Bala Priya C](https://twitter.com/balawc27) es una desarrolladora y escritora técnica de India. Le gusta trabajar en la intersección de las matemáticas, la programación, la ciencia de datos y la creación de contenido. Sus áreas de interés y experiencia incluyen DevOps, ciencia de datos y procesamiento del lenguaje natural. Disfruta de la lectura, la escritura, la codificación y el café. Actualmente, está trabajando en aprender y compartir su conocimiento con la comunidad de desarrolladores a través de la creación de tutoriales, guías prácticas, artículos de opinión y más.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

¿Es verdaderamente seguro el IA multilingüe? Exponiendo las vulnerabilidades de los grandes modelos de lenguaje en idiomas con recursos limitados

GPT-4 tiene como predeterminación decir: “Lo siento, pero no puedo ayudar con eso”, en respuesta a solici...

Aprendizaje Automático

SiMa.ai traerá el chip de inteligencia artificial más poderoso del mundo a la India.

En un emocionante avance, SiMa.ai, una startup estadounidense de chips de inteligencia artificial, ha anunciado la pr...

Inteligencia Artificial

Evaluación de los Modelos de Lenguaje Grandes Conozca a AgentSims, un Marco de Inteligencia Artificial Basado en Tareas para Pruebas Completas y Objetivas

Los LLM han cambiado la forma en que se piensa en el procesamiento del lenguaje (NLP), pero persiste el problema de s...

Inteligencia Artificial

¿Qué tan fácil es engañar a las herramientas de detección de inteligencia artificial?

Los detectores ignoran todas las pistas de contexto, por lo que no procesan la existencia de un autómata realista en ...