Guía Completa para el Preprocesamiento de Datos: Codificación One-Hot y Manejo de Datos Faltantes con Python
En el ámbito de la ciencia de datos y el aprendizaje automático, el preprocesamiento de datos se posiciona como un paso fundamental que puede influir significativamente en el rendimiento y la precisión de tus modelos. Esta guía completa profundiza en técnicas esenciales de preprocesamiento como la Codificación One-Hot, el manejo de datos faltantes, la selección de características, y más, utilizando bibliotecas poderosas de Python como pandas y scikit-learn. Recorreremos estos conceptos con un ejemplo práctico usando el conjunto de datos Weather Australia.
Tabla de Contenidos
- Introducción
- Comprendiendo el Conjunto de Datos
- Manejo de Datos Faltantes
- Selección de Características
- Codificación de Etiquetas
- Codificación One-Hot
- Manejo de Datos Desequilibrados
- División de Entrenamiento y Prueba
- Escalado de Características
- Conclusión
Introducción
El preprocesamiento de datos es la base sobre la cual se construyen modelos de aprendizaje automático robustos. Implica transformar datos sin procesar en un formato limpio y organizado, haciéndolos adecuados para el análisis. Este proceso incluye:
- Manejo de Datos Faltantes: Abordar las brechas en el conjunto de datos.
- Codificación de Variables Categóricas: Convertir datos no numéricos en formato numérico.
- Selección de Características: Identificar y retener las características más relevantes.
- Balanceo del Conjunto de Datos: Asegurar una distribución equitativa de las clases.
- Escalado de Características: Normalizar los datos para mejorar el rendimiento del modelo.
Exploraremos estos conceptos paso a paso utilizando Python.
Comprendiendo el Conjunto de Datos
Antes de sumergirnos en el preprocesamiento, es crucial entender el conjunto de datos con el que estamos trabajando. Utilizaremos el conjunto de datos Weather Australia, que contiene 142,193 registros y 24 columnas. Este conjunto de datos incluye diversos atributos meteorológicos como temperatura, precipitaciones, humedad y más, junto con una variable objetivo que indica si lloverá al día siguiente.
Muestra del Conjunto de Datos
1 2 3 |
Date,Location,MinTemp,MaxTemp,Rainfall,Evaporation,Sunshine,WindGustDir,WindGustSpeed,WindDir9am,WindDir3pm,WindSpeed9am,WindSpeed3pm,Humidity9am,Humidity3pm,Pressure9am,Pressure3pm,Cloud9am,Cloud3pm,Temp9am,Temp3pm,RainToday,RISK_MM,RainTomorrow 2008-12-01,Albury,13.4,22.9,0.6,NA,NA,W,44,W,WNW,20,24,71,22,1007.7,1007.1,8,NA,16.9,21.8,No,0,No ... (additional rows) |
Manejo de Datos Faltantes
Los conjuntos de datos del mundo real a menudo contienen valores faltantes. Manejar adecuadamente estas brechas es esencial para prevenir resultados sesgados y asegurar la precisión del modelo.
Datos Numéricos
Las columnas numéricas en nuestro conjunto de datos incluyen MinTemp
, MaxTemp
, Rainfall
, Evaporation
, etc. Los valores faltantes en estas columnas pueden abordarse imputando con medidas estadísticas como la media, mediana o moda.
1 2 3 4 5 6 7 8 9 10 11 |
import numpy as np from sklearn.impute import SimpleImputer # Initialize imputer with mean strategy imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean') # List of numerical column indices numerical_cols = [2,3,4,5,6,8,11,12,13,14,15,16,17,18,19,20] # Fit and transform the data X.iloc[:, numerical_cols] = imp_mean.fit_transform(X.iloc[:, numerical_cols]) |
Datos Categóricos
Las columnas categóricas como Location
, WindGustDir
, WindDir9am
, etc., no pueden tener sus valores faltantes imputados con media o mediana. En su lugar, usamos el valor más frecuente (moda) para llenar estas brechas.
1 2 3 4 5 6 7 8 9 10 |
from sklearn.impute import SimpleImputer # List of categorical column indices string_cols = [1,7,9,10,21] # Initialize imputer with most frequent strategy imp_freq = SimpleImputer(missing_values=np.nan, strategy='most_frequent') # Fit and transform the data X.iloc[:, string_cols] = imp_freq.fit_transform(X.iloc[:, string_cols]) |
Selección de Características
La selección de características implica identificar las variables más relevantes que contribuyen a la tarea de predicción. En nuestro caso, eliminaremos columnas irrelevantes o redundantes como Date
y RISK_MM
.
1 2 |
# Dropping 'RISK_MM' and 'Date' columns X.drop(['RISK_MM', 'Date'], axis=1, inplace=True) |
Codificación de Etiquetas
La codificación de etiquetas convierte variables objetivo categóricas en formato numérico. Para tareas de clasificación binaria como predecir si lloverá mañana (Yes
o No
), este método es sencillo.
1 2 3 4 5 6 7 |
from sklearn import preprocessing # Initialize LabelEncoder le = preprocessing.LabelEncoder() # Fit and transform the target variable Y = le.fit_transform(Y) |
Codificación One-Hot
Mientras que la codificación de etiquetas es adecuada para datos ordinales, la Codificación One-Hot es preferida para datos nominales donde las categorías no tienen un orden inherente. Esta técnica crea columnas binarias para cada categoría, mejorando la capacidad del modelo para interpretar variables categóricas.
1 2 3 4 5 6 7 8 9 10 11 |
from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer # Initialize ColumnTransformer with OneHotEncoder for specified columns columnTransformer = ColumnTransformer( [('encoder', OneHotEncoder(), [0,6,8,9,20])], remainder='passthrough' ) # Fit and transform the feature matrix X = columnTransformer.fit_transform(X) |
Nota: Las columnas [0,6,8,9,20] corresponden a características categóricas como Location
, WindGustDir
, etc.
Manejo de Datos Desequilibrados
Los conjuntos de datos desequilibrados, donde una clase supera significativamente a la otra, pueden sesgar el modelo. Técnicas como el sobremuestreo y el submuestreo ayudan a equilibrar el conjunto de datos.
Sobremuestreo
Sobremuestreo Aleatorio duplica instancias de la clase minoritaria para equilibrar la distribución de clases.
1 2 3 4 5 6 7 8 9 10 11 |
from imblearn.over_sampling import RandomOverSampler from collections import Counter # Initialize RandomOverSampler ros = RandomOverSampler(random_state=42) # Resample the dataset X, Y = ros.fit_resample(X, Y) # Verify the new class distribution print(Counter(Y)) |
Salida:
1 |
Counter({0: 110316, 1: 110316}) |
Submuestreo
Submuestreo Aleatorio reduce instancias de la clase mayoritaria pero puede llevar a una pérdida de información. En esta guía, hemos empleado el sobremuestreo para conservar todos los puntos de datos.
División de Entrenamiento y Prueba
Dividir el conjunto de datos en conjuntos de entrenamiento y prueba es crucial para evaluar el rendimiento del modelo en datos no vistos.
1 2 3 4 5 6 7 8 9 |
from sklearn.model_selection import train_test_split # Split the data: 80% training, 20% testing X_train, X_test, y_train, y_test = train_test_split( X, Y, test_size=0.20, random_state=1 ) print(X_train.shape) # Output: (176505, 115) print(X_test.shape) # Output: (44127, 115) |
Escalado de Características
El escalado de características asegura que todas las características numéricas contribuyan por igual al rendimiento del modelo.
Estandarización
La estandarización transforma los datos para que tengan una media de 0 y una desviación estándar de 1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
from sklearn import preprocessing # Initialize StandardScaler sc = preprocessing.StandardScaler() # Fit on training data sc.fit(X_train) # Transform both training and testing data X_train = sc.transform(X_train) X_test = sc.transform(X_test) print(X_train.shape) # Output: (176505, 115) print(X_test.shape) # Output: (44127, 115) |
Normalización
La normalización escala las características a un rango entre 0 y 1. Aunque no se aborda en esta guía, es otra técnica valiosa de escalado dependiendo del conjunto de datos y los requisitos del modelo.
1 2 3 4 5 6 7 8 |
from sklearn.preprocessing import MinMaxScaler # Initialize MinMaxScaler mm_scaler = MinMaxScaler() # Fit and transform the data X_train_mm = mm_scaler.fit_transform(X_train) X_test_mm = mm_scaler.transform(X_test) |
Conclusión
El preprocesamiento efectivo de datos es fundamental para construir modelos de aprendizaje automático de alto rendimiento. Al manejar meticulosamente los datos faltantes, codificar variables categóricas, equilibrar el conjunto de datos y escalar las características, estableces una base sólida para tus tareas predictivas. Esta guía proporcionó un enfoque práctico utilizando las robustas bibliotecas de Python, demostrando cómo estas técnicas pueden integrarse sin problemas en tu flujo de trabajo de ciencia de datos.
Recuerda, la calidad de tus datos influye directamente en el éxito de tus modelos. Invierte tiempo en el preprocesamiento para desbloquear todo el potencial de tus conjuntos de datos.
Palabras Clave
- Preprocesamiento de Datos
- Codificación One-Hot
- Manejo de Datos Faltantes
- Python pandas
- scikit-learn
- Aprendizaje Automático
- Escalado de Características
- Datos Desequilibrados
- Codificación de Etiquetas
- Variables Categóricas