Logo de CursoIA
CursoIA Curso de Inteligencia Artificial

Feature engineering, Unidad 11 — Riesgos y malas prácticas, 11.1 — Over-engineering ·

Coste computacional

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

  1. Analiza la correlación: Valora las características que tienen una fuerte correlación con el objetivo.
  2. Evita transformaciones complejas: Limita las transformaciones a aquellas que tienen un impacto claro y significativo en el rendimiento del modelo.
  3. 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.
  4. Implementa validación cruzada: Verifica que las características seleccionadas mejoren el rendimiento en múltiples particiones del dataset, no solo en una sola.
  5. 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.

Contacto

Indica tu objetivo (ChatGPT, RAG, agentes, automatización) y tu stack (web/backend).