No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Regresión Logística Aplicada a Dataset Binomial de Churn

5/17
Recursos

¿Cómo aplicar la regresión logística desde cero?

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:

  1. Eliminar duplicados y procesar valores nulos para evitar sesgos en el modelo.
  2. Remover columnas innecesarias que no aporten valor a la clasificación.
  3. Convertir datos categóricos en numéricos, ya que los algoritmos de machine learning funcionan mejor con números.
  4. 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 necesarias
import pandas as pd
import numpy as np

# Cargar los datos
df_data = pd.read_csv('ruta/al/dataset.csv')

# Verificar y transformar columnas numéricas
df_data['TotalCharges'] = pd.to_numeric(df_data['TotalCharges'], errors='coerce')

# Manejar valores nulos
df_data.dropna(inplace=True)

# Eliminar columnas innecesarias
df_data.drop('customerID', axis=1, inplace=True)

# Convertir la variable objetivo a numérica
df_data['Churn'] = df_data['Churn'].replace({'Yes': 1, 'No': 0})

# Aplicar One-Hot Encoding a variables categóricas
df_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.

Aportes 21

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

No me agrada

df_data.isnull().sum()

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).

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

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()
Como agregar el Dataset sin Descargar nada: `import kagglehub` `import pandas as pd` `from 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 object` `path = Path(path) ` `# 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
OneHotEncoding Perron perron: ```from sklearn.preprocessing import OneHotEncoder categorical\_cols = df.select\_dtypes(include=\['object']).columnsencoder = OneHotEncoder(sparse\_output=False, drop='first') encoded\_array = encoder.fit\_transform(df\[categorical\_cols])encoded\_df = pd.DataFrame(    encoded\_array,     columns=encoder.get\_feature\_names\_out(categorical\_cols)) encoded\_df.reset\_index(drop=True, inplace=True)df.drop(categorical\_cols, axis=1, inplace=True)df.reset\_index(drop=True, inplace=True) \# Concatenate the DataFramesdf\_final = pd.concat(\[df, encoded\_df], axis=1) df\_final.head()df = df\_finaldf.head()```
Pase de bools a int64 de esta manera: ```python categorical_cols = data_processing.select_dtypes(include=['object']).columns data_processing = pd.get_dummies(data_processing, columns=categorical_cols, drop_first=True) bool_cols = data_processing.select_dtypes(include=['bool']).columns data_processing[bool_cols] = data_processing[bool_cols].astype('int64') data_processing.info() ``` ![](https://static.platzi.com/media/user_upload/image-c48faf30-807b-4b4a-b426-cb7f83c34f4a.jpg) ![](https://static.platzi.com/media/user_upload/image-87c03fea-b150-4244-810a-750f4b3eb225.jpg)
Les recomiendo hacer el one-hot encoding con el drop\_first para evitar la multicolinealidad ```js df_data_processing = pd.get_dummies(df_data_processing, drop_first=True) ```
Otra forma de codifica las variables churn ```js label_encoder = LabelEncoder() df_data['Churn'] = label_encoder.fit_transform(df_data['Churn']) ```

Interesante este metodo de conversion, no sabia nada. Ahora si tengo ganas de mejorar mis capacidades.

porque cuando realiza el get\_dummies las variables categoricas les cambia el nombre, agregando un (\_) mas el nombre de la variable? me genera el proble de crear muchisimas columnas mas de las que tiene el dataset original, porque=>

Esto es lo que hace el comando dropna más el arugmento inpalce_True =

  • inplace=True: Este argumento se utiliza para indicar que deseas realizar la eliminación de las filas directamente en el DataFrame df_data en su lugar. Si inplace está configurado en True, los cambios se aplican al DataFrame original y no se crea un nuevo DataFrame. Si se establece en False o no se proporciona, se devuelve un nuevo DataFrame con las filas eliminadas, y el DataFrame original permanece sin cambios.

Entonces, cuando ejecutas df_data.dropna(inplace=True), elimina todas las filas en df_data que contienen valores nulos y aplica este cambio directamente en el DataFrame original df_data. El resultado es que df_data ahora contendrá solo las filas que no tienen valores nulos en ninguna de sus columnas. Las filas con valores nulos se han eliminado del DataFrame.

Comandos similares a la misma familia de comandos como dropna:

  • .fillna(): Este método se utiliza para rellenar valores nulos con un valor específico o una estrategia de relleno. Puedes proporcionar un valor constante, un diccionario de relleno por columna o utilizar métodos de interpolación.

  • .isnull() y .notnull(): Estos métodos te permiten crear máscaras booleanas que indican dónde se encuentran los valores nulos y no nulos en un DataFrame. Son útiles para filtrar o seleccionar datos basados en la presencia o ausencia de valores nulos.

  • .interpolate(): Este método se utiliza para realizar la interpolación de valores nulos en una serie o DataFrame. La interpolación calcula valores intermedios para rellenar los valores nulos basándose en los valores adyacentes.

  • .drop(): Aunque su nombre es similar al de .dropna(), el método .drop() se utiliza para eliminar filas o columnas específicas en un DataFrame, pero puedes especificar etiquetas de fila o columna en lugar de valores nulos.

  • .replace(): Este método se utiliza para reemplazar valores específicos, incluidos los valores nulos, por otros valores en un DataFrame.

  • .ffill() y .bfill(): Estos métodos se utilizan para rellenar valores nulos hacia adelante (ffill) o hacia atrás (bfill) utilizando el valor más cercano en la misma columna.

  • .melt(): Esta función se utiliza para realizar una operación de “melt” o “unpivot” en un DataFrame, lo que puede ayudar a lidiar con datos faltantes.

  • .combine_first(): Este método se utiliza para combinar dos DataFrames, rellenando los valores nulos en el DataFrame original con los valores del otro DataFrame.

Estos son algunos ejemplos de los métodos y funciones disponibles en pandas para el manejo de valores nulos y la limpieza de datos. La elección del método adecuado dependerá de la naturaleza de tus datos y del tipo de operación que necesites realizar.

Tan rápido que hizo la limpieza y lo de más en un video de 14 minutos!, si hubiera empezado por estos videos no hubiera perdido mi tiempo en los de limpieza instalando paquetes que probablemente nunca utilizaré

Yo converti los valores del target usando where de numpy que es igual a los condicionales de excel

df_data['Churn'] = df_data['Churn'].apply(lambda x: np.where(x == 'Yes', 1, 0))