La regresión logística es una poderosa herramienta dentro del aprendizaje automático y la inteligencia artificial utilizada principalmente para problemas de clasificación. Este proceso, que empieza desde la preparación de los datos hasta la implementación del modelo, es fundamental para obtener resultados precisos y confiables. Descubramos cómo aplicar la regresión logística en un proyecto desde cero.
¿Qué es la regresión logística y cómo se clasifica?
La regresión logística es un tipo de modelo estadístico que se utiliza para predecir resultados binarios en una muestra de datos. A este tipo de problemas se les llama comúnmente "dataset binomiales". Un ejemplo clásico es predecir si un cliente de una compañía hará "churn" (es decir, cancelará su suscripción) o no. En general, la regresión logística se especializa en:
Datasets binomiales: con solo dos resultados posibles (0 o 1, verdadero o falso, sí o no).
Datasets multinomiales: con más de dos posibles clasificaciones, aunque la especialidad de la regresión logística es con datasets binomiales.
¿Cómo preparar los datos efectivamente?
Una parte crítica del proyecto es la preparación de los datos. Un buen procesamiento te ayudará a obtener resultados más precisos y eficientes. Aquí te presento los pasos esenciales del proceso:
Eliminar duplicados y procesar valores nulos para evitar sesgos en el modelo.
Remover columnas innecesarias que no aporten valor a la clasificación.
Convertir datos categóricos en numéricos, ya que los algoritmos de machine learning funcionan mejor con números.
Escalar los datos para facilitar el manejo del algoritmo.
¿Qué dataset se utiliza para este proyecto?
Para este proyecto, se utiliza un dataset de "churn" de Kaggle, que se relaciona con el evento en el que un cliente da de baja los servicios de una compañía. Las características del dataset incluyen:
Servicios contratados: como teléfono, línea de internet, seguridad online, etc.
Información del cliente: tipo de contrato, método de pago, facturación, etc.
Datos demográficos: género, edad, rango salarial, entre otros.
¿Cómo implementar la limpieza y transformación de datos en Python?
A continuación, se presenta un extracto del código en Python necesario para la preparación de datos usando librerías comunes como Pandas y NumPy:
# Importar librerías necesariasimport pandas as pd
import numpy as np
# Cargar los datosdf_data = pd.read_csv('ruta/al/dataset.csv')# Verificar y transformar columnas numéricasdf_data['TotalCharges']= pd.to_numeric(df_data['TotalCharges'], errors='coerce')# Manejar valores nulosdf_data.dropna(inplace=True)# Eliminar columnas innecesariasdf_data.drop('customerID', axis=1, inplace=True)# Convertir la variable objetivo a numéricadf_data['Churn']= df_data['Churn'].replace({'Yes':1,'No':0})# Aplicar One-Hot Encoding a variables categóricasdf_data = pd.get_dummies(df_data)
¿Qué sigue después de la limpieza de datos?
Después de la limpieza y transformación inicial de los datos, el siguiente paso es lidiar con la multicolinealidad y escalar los datos. Estos pasos son cruciales para asegurar que el modelo de regresión logística funcione de manera coherente y con mayor precisión.
Este enfoque metódico asegura resultados sólidos en cualquier proyecto de aprendizaje automático. ¡Sigue aprendiendo y profundizando en cada paso de este proceso! Explorando y convirtiendo datos a su forma más conducente para los algoritmos, establecerás una base robusta para posteriores análisis y modelos predictivos.
Preferi utilizar las funciones missing que creamos en el curso de imputacion de valores faltantes.
Otra forma de importar la data sin descargarla es usando el API de kaggle
!pip install opendatasets
import opendatasets as od
od.download('https://www.kaggle.com/datasets/blastchar/telco-customer-churn')df_data = pd.read_csv('/content/telco-customer-churn/WA_Fn-UseC_-Telco-Customer-Churn.csv')
get_dummies duplica los features en "feature_yes" y "feature_No", esto pudiera ser redundante. si no queremos tener esta "duplicidad" podemos utilizar:
df_data_processing = pd.get_dummies(df_data_processing, drop_first=True).
Justa buscaba eso, buen aporte!!!
Esto no funcionaria, puesto que mira por ejemplo la variable "StreamingTV", Esta variable tiene 3 categorias:
-No
-Yes
-No internet service
Si utilizas get_dummies, vas a perder la información de una categoría, en este caso la del No
Te dejo el codigo para que lo compruebes por ti mismo
#Primera parte sin drop first
test = pd.get_dummies(df_processing)[['StreamingTV_No','StreamingTV_No internet service','StreamingTV_Yes']]test[test['StreamingTV_No']==1].loc[0:0]#Segunda parte con Drop first
pd.get_dummies(df_processing,drop_first=True)[['StreamingTV_No internet service','StreamingTV_Yes']].loc[0:0]
errors='coerce'
indica que si no se puede convertir un elemento de la columna TotalCharges a un número, se debe reemplazar con un valor especial NaN (Not a Number)
Esto se conoce como "coerción" porque se está forzando la conversión a un tipo de datos numérico, y si no es posible, se está forzando el uso de NaN en su lugar
Como propuesta, deberían de incluir en la sección de recursos el archivo tipo plantilla. Para que podamos irlo rellenando nosotros
Por el momento los archivos que incluyen ya están respondidos.
Hola, yo resolví todo el problema por mi cuenta antes de ver la explicación, cuando vi que la columna 'TotalCharges' estaba dada como categórica intenté convertirla a numérica con astype(float),sin embargo, me aparecía el problema d que ciertos valores " " no podían ser convertidos a numéricos, por lo que lo primero que hice fue determinar que valores estaban como vacíos en esa columna
Posteriormente procedí a eliminar estos valores y a convertir esta columna a numérica.
Al final resulta los mismo que hace el profesor usando pd.to_numeric ,solo que haciendo esto los valores vacíos pasan a ser NaN y luego se tienen que eliminar, lo comprobé creando otro dataset y comparando la columnas donde anteriormente habían valores vacíos
Exacto, esto en el curso de manejos faltantes se tratan como valores faltantes con diferente codificación.
Los valores faltantes pueden venir en np.nan, pd.nan, 0, -1, -99, "nan", "NaN", " " y de muchas maneras más.
Es muy buen curso el de manejo de datos faltantes.
Sólo el 26% de los datos son churn, por lo que un modelo dummy que prediga todos como 'No' tendrá una precisión del 74% Pienso que es util hacer un balanceo de los datos con SMOTE ¿Estoy en lo correcto?
en este modelo no influye tanto, pero si, siempre es mejor tener un balanceo
Esto es lo que hace la variable get.dummies más detalladamente:
pd.get_dummies() es una función de la biblioteca pandas en Python que se utiliza para realizar una codificación one-hot de variables categóricas en un DataFrame. La codificación one-hot es un proceso que convierte variables categóricas en un conjunto de variables binarias (0 o 1) que representan la presencia o ausencia de una categoría en los datos originales. Este enfoque es comúnmente utilizado en el preprocesamiento de datos para que los algoritmos de aprendizaje automático puedan trabajar con variables categóricas.
Aquí hay una descripción de cómo funciona pd.get_dummies():
Entrada: La función toma como entrada un DataFrame de pandas que contiene una o más columnas con variables categóricas que deseas codificar.
Salida: pd.get_dummies() produce un nuevo DataFrame donde las columnas categóricas originales se han convertido en columnas binarias (0 o 1), una columna por categoría. Cada columna binaria representa una categoría específica y se llama "indicador" o "dummy variable". Cuando una fila tiene una categoría, su columna correspondiente tendrá un valor de 1; de lo contrario, será 0.
Por ejemplo, si tienes una columna llamada "Color" con valores categóricos como "Rojo", "Verde" y "Azul", pd.get_dummies() generará tres nuevas columnas llamadas "Color_Rojo", "Color_Verde" y "Color_Azul", y asignará 1 o 0 según el color presente en cada fila.
Este proceso es útil en el análisis de datos y en la construcción de modelos de aprendizaje automático, ya que permite trabajar con variables categóricas en algoritmos que requieren datos numéricos, como regresión lineal, regresión logística y otros modelos. La codificación one-hot evita la asignación incorrecta de importancia numérica a las categorías y garantiza que cada categoría se trate de manera independiente en el modelo.
Recordemos que:
df_data.head(5)
es igual a escribir:
df_data.head()
Les tiro una línea de cogido con la que yo he venido trabajando algunas Targets Variables binarias
La Regresión Logística aplicada a un dataset binomial de Churn (abandono de clientes) es una técnica muy común en análisis de datos para predecir si un cliente se quedará (0) o se irá (1), usando variables como edad, ingresos, uso del servicio, etc.
Aquí tienes una guía clara y concisa con explicación + código en Python con Scikit-Learn:
✅ 1. ¿Qué es la regresión logística?
Es un modelo de clasificación supervisada usado cuando el output es binario (por ejemplo: 0 = se queda, 1 = se va).
Supón que tienes un dataset churn.csv con columnas como:
edad
ingresos
uso_mensual
tiempo_en_meses
churn (0 = se queda, 1 = se va)
🧪 3. Aplicación en Python
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix
# 1. Cargar el dataset
df = pd.read_csv("churn.csv")
# 2. Separar características y etiqueta
X = df[["edad", "ingresos", "uso_mensual", "tiempo_en_meses"]]
y = df["churn"]
# 3. Dividir en entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Get the CSV file path within the downloaded dataset folder
csv_file_path = path / "WA_Fn-UseC_-Telco-Customer-Churn.csv" # Assuming the CSV file has this name
# Load the dataset using pandas
df = pd.read_csv(csv_file_path)
# Print the first 5 records
print("First 5 records:", df.head())
una forma de agregar el dataset desde kagle sin descargar nada
import kagglehubimport pandas as pdfrom pathlib import Path # Import Path
# Download latest version (if not already downloaded)path = kagglehub.dataset_download("blastchar/telco-customer-churn")
# Convert 'path' to a pathlib.Path objectpath = Path(path)
# Get the CSV file path within the downloaded dataset foldercsv_file_path = path / "WA_Fn-UseC_-Telco-Customer-Churn.csv" # Assuming the CSV file has this name
# Load the dataset using pandasdf = pd.read_csv(csv_file_path)
# Print the first 5 recordsprint("First 5 records:", df.head())
Esta clase es una de las más interesantes, no sabía que los dataframes de pandas tenían esos atributos como el de remplazar