Preparación de Datos para el Aprendizaje Automático: Manejo de Valores Faltantes, Codificación y Equilibrio
Tabla de Contenidos
- Recapitulación: Fundamentos de la Codificación One-Hot
- Manejo de Valores Faltantes
- Abordando la Característica de Fecha
- Codificación One-Hot Revisitada
- Manejo de Datos Desequilibrados
- División de los Datos
- Escalado de Características
- Conclusión
Recapitulación: Fundamentos de la Codificación One-Hot
En nuestra sesión anterior, introdujimos la codificación one-hot, un método para convertir variables categóricas en un formato adecuado para los algoritmos de aprendizaje automático. Agregamos las declaraciones necesarias pero nos detuvimos para explorar más variables y contenido. Hoy, construiremos sobre esa base.
Manejo de Valores Faltantes
Identificación de Datos Faltantes
Antes de la codificación, es crucial asegurarse de que su conjunto de datos no contenga valores faltantes, lo que puede llevar a errores durante el entrenamiento del modelo. Utilizando pandas, podemos identificar valores faltantes de la siguiente manera:
1 2 3 4 |
import pandas as pd missing_values = pd.isnull(x).sum() print(missing_values) |
Una suma de cero indica que no hay valores faltantes. Sin embargo, si ciertas columnas muestran valores diferentes de cero, esas columnas contienen datos faltantes que deben ser abordados.
Gestión de Datos Faltantes Numéricos y Categóricos
Hemos manejado con éxito los valores faltantes en columnas numéricas utilizando estrategias como la imputación de la media o la mediana. Sin embargo, las columnas categóricas (de texto) requieren un enfoque diferente. Para los datos categóricos, a menudo se utiliza el valor más frecuente para la imputación. Aquí se muestra cómo implementarlo:
1 2 3 4 5 6 7 8 9 |
from sklearn.impute import SimpleImputer # Para datos numéricos num_imputer = SimpleImputer(strategy='mean') x_numeric = num_imputer.fit_transform(x_numeric) # Para datos categóricos cat_imputer = SimpleImputer(strategy='most_frequent') x_categorical = cat_imputer.fit_transform(x_categorical) |
Abordando la Característica de Fecha
Las fechas pueden ser complicadas ya que a menudo contienen valores únicos, lo que las hace menos útiles para la modelización predictiva. Incluir la fecha completa puede introducir una alta dimensionalidad y ralentizar su modelo sin agregar poder predictivo. Aquí hay algunas estrategias:
- Extracción de Características: Extraer componentes significativos como el día y el mes mientras se descarta el año.
- Codificación de Etiquetas: Asignar etiquetas numéricas a las fechas, pero tener precaución ya que esto puede introducir relaciones ordinales no deseadas.
- Codificación One-Hot: No se recomienda para fechas debido a la explosión en el número de características.
Dadas estas dificultades, la solución más directa es eliminar la característica de fecha por completo si no es esencial para su modelo:
1 |
x = x.drop(['date'], axis=1) |
En nuestro caso, basado en la descripción del conjunto de datos de «Rain Prediction in Australia» de Kaggle, también hemos excluido la variable risk_mm
para un mejor rendimiento.
Codificación One-Hot Revisitada
Después de manejar los valores faltantes y eliminar características irrelevantes, procedemos con la codificación one-hot:
1 2 3 4 5 |
from sklearn.preprocessing import OneHotEncoder encoder = OneHotEncoder() x_encoded = encoder.fit_transform(x) print(x_encoded.shape) # Ejemplo de salida: (número_de_muestras, 115) |
Como se esperaba, el número de columnas aumenta debido al proceso de codificación, expandiéndose de 23 a 115 en nuestro ejemplo.
Manejo de Datos Desequilibrados
Los conjuntos de datos desequilibrados pueden sesgar su modelo hacia la clase mayoritaria, reduciendo su capacidad para predecir con precisión la clase minoritaria. Aquí se explica cómo abordarlo:
- Comprobar el Desequilibrio:
1234from collections import Countercounter = Counter(y)print(counter) # Ejemplo de salida: {0: 2700, 1: 900}
Si una clase supera significativamente a la otra (por ejemplo, 75% vs. 25%), es necesario el equilibrio.
- Reaumento de la Clase Minoritaria:
123456789101112131415161718192021from sklearn.utils import resample# Combinar en un único DataFramedata = pd.concat([x_encoded, y], axis=1)# Separar las clases mayoritaria y minoritariamajority = data[data.y == 0]minority = data[data.y == 1]# Reaumentar la minoritariaminority_upsampled = resample(minority,replace=True,n_samples=len(majority),random_state=42)# Combinar la mayoría con la minoría reaumentadabalanced_data = pd.concat([majority, minority_upsampled])# Separar características y objetivoX_balanced = balanced_data.drop('y', axis=1)y_balanced = balanced_data['y']
- Verificación:
12print(Counter(y_balanced))# Salida: {0: 2700, 1: 2700}
División de los Datos
Con datos equilibrados, procedemos a dividirlos en conjuntos de entrenamiento y prueba:
1 2 3 4 5 |
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X_balanced, y_balanced, test_size=0.2, random_state=42) |
Escalado de Características
Finalmente, estandarizamos las características para asegurar que cada una contribuya por igual al rendimiento del modelo:
1 2 3 4 5 6 7 8 |
from sklearn.preprocessing import StandardScaler scaler = StandardScaler(with_mean=False) # Evitar centrar en matrices dispersas X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) print(X_train_scaled.shape) print(X_test_scaled.shape) |
Nota: Al tratar con matrices dispersas resultantes de la codificación one-hot, establecer with_mean=False
en StandardScaler
previene errores relacionados con el centrado.
Conclusión
El preprocesamiento de datos es tanto un arte como una ciencia, que requiere una toma de decisiones reflexiva para preparar su conjunto de datos de manera efectiva. Al manejar valores faltantes, codificar variables categóricas, gestionar características de fecha y equilibrar sus datos, establece una base sólida para construir modelos de aprendizaje automático robustos. Recuerde, la calidad de sus datos influye directamente en el rendimiento de sus modelos, por lo que debe invertir el tiempo y esfuerzo necesarios en estos pasos de preprocesamiento.
No dude en volver a visitar este cuaderno de Jupyter para una experiencia práctica, y no dude en ponerse en contacto si tiene alguna pregunta. ¡Feliz modelado!