Coste computacional
Introducción
El coste computacional es uno de los aspectos más importantes a considerar durante el proceso de feature engineering. Cuanto más complejo sea el conjunto de características que se generan, más recuros en tiempo y recursos en memoria se consumirán. Este artículo explorará cómo el over-engineering puede afectar al coste computacional y ofrecerá una guía práctica para minimizar este impacto.
Explicación principal con ejemplos
El over-engineering en feature engineering implica la creación de un número excesivo de características sin considerar su valor real en mejorar el rendimiento del modelo. A continuación, se presentan algunos ejemplos y una pequeña muestra de código para ilustrar este concepto.
Ejemplo 1: Creación innecesaria de características
Supongamos que estamos trabajando con un dataset de registros de ventas diarias:
import pandas as pd
# Dataset simulado
data = {
'fecha': ['2023-01-01', '2023-01-01', '2023-01-01'],
'hora': [9, 10, 11],
'precio_producto': [50.45, 67.98, 32.50],
'cantidad_vendida': [1, 2, 3]
}
df = pd.DataFrame(data)
# Creando características innecesarias
df['fecha_hora'] = pd.to_datetime(df['fecha'] + ' ' + df['hora'].astype(str) + ':00')
df['precio_cantidad'] = df['precio_producto'] * df['cantidad_vendida']
En este ejemplo, fecha_hora y precio_cantidad no aportan valor significativo a las predicciones del modelo. En cambio, pueden aumentar el tiempo de entrenamiento y la memoria requerida.
Ejemplo 2: Combinaciones innecesarias
Supongamos que estamos analizando un conjunto de datos con información sobre usuarios en una plataforma social:
data = {
'edad': [25, 30, 35],
'genero': ['M', 'F', 'M'],
'horas_diurnas': [4, 6, 8],
'horas_nocturnas': [10, 8, 6]
}
df = pd.DataFrame(data)
# Creando combinaciones innecesarias
df['edad_genero'] = df['edad'].astype(str) + '_' + df['genero']
df['horas_total'] = df['horas_diurnas'] + df['horas_nocturnas']
En este caso, edad_genero no es una característica útil y puede aumentar la complejidad computacional sin mejorar el rendimiento del modelo.
Ejemplo 3: Transformaciones innecesarias
Consideremos un dataset con valores numéricos:
data = {
'valor': [10, 25, 40]
}
df = pd.DataFrame(data)
# Aplicando transformaciones innecesarias
df['log_valor'] = df['valor'].apply(lambda x: math.log(x))
df['raiz_valor'] = df['valor'].apply(lambda x: math.sqrt(x))
Las transformaciones como log_valor y raiz_valor pueden aumentar el tiempo de cálculo sin aportar valor significativo al modelo.
Errores típicos / trampas
Trampa 1: Creación de características basadas en correlaciones débiles o inestables
Generar características basándose en correlaciones débiles o que cambian frecuentemente puede aumentar el coste computacional sin mejorar significativamente el rendimiento del modelo.
# Ejemplo de creación innecesaria de una característica basada en correlaciones débiles
df['correlacion_inestable'] = df['edad'].apply(lambda x: 0.5 * x + np.random.normal(0, 1))
Trampa 2: Transformaciones complejas sin valor añadido
Transformar variables de formas complejas o no interpretables puede aumentar el coste computacional y reducir la claridad del modelo.
# Ejemplo de transformación compleja innecesaria
df['transformacion_compleja'] = df['valor'].apply(lambda x: (x**2 + 3*x - 1) * math.sin(x))
Trampa 3: Overfitting en la selección de características
Señalar demasiadas características puede causar overfitting, lo que aumenta el coste computacional y reduce la capacidad del modelo para generalizar.
# Ejemplo de overfitting en selección de características
df['overfitting'] = df.apply(lambda row: (row['edad'] * row['horas_diurnas']) + (row['genero'] == 'M') * 10, axis=1)
Checklist accionable
- Analiza la correlación: Valora las características que tienen una fuerte correlación con el objetivo.
- Evita transformaciones complejas: Limita las transformaciones a aquellas que tienen un impacto claro y significativo en el rendimiento del modelo.
- Mide el impacto del coste computacional: Usa herramientas de análisis de perfilado para medir el tiempo de ejecución y la memoria utilizada por cada paso del pipeline.
- Implementa validación cruzada: Verifica que las características seleccionadas mejoren el rendimiento en múltiples particiones del dataset, no solo en una sola.
- Mantén un registro: Documenta todas las transformaciones realizadas y su impacto en el rendimiento del modelo para futuras referencias.
Cierre con "Siguientes pasos"
Siguientes pasos
- Optimiza la escalabilidad: Asegúrate de que tu pipeline es escalable y puede manejar conjuntos de datos más grandes sin un aumento excesivo en el coste computacional.
- Implementa técnicas de reducción de características: Usa métodos como PCA o LASSO para reducir el número de características innecesarias.
- Monitorea el rendimiento: Continúa monitoreando el rendimiento del modelo y ajusta las características según sea necesario.
Siguiendo estos consejos, podrás minimizar el coste computacional en tu proceso de feature engineering y mejorar la eficiencia y escalabilidad de tus modelos de machine learning.