042 — Ingeniería y selección de características

← Clase anterior · Índice de la parte · Clase siguiente →

Parte: 03 — Machine learning clásico
Nivel: intermedio · Horas estimadas: 6
Laboratorio: ml · Estado: EXECUTABLE_CORE

🎯 Propósito

Comprender ingeniería y selección de características dentro de la evolución de la inteligencia artificial, implementar un experimento mínimo verificable y distinguir qué parte constituye evidencia frente a una afirmación todavía no comprobada.

📚 Resultados de aprendizaje

Al finalizar podrás:

  1. Explicar ingeniería y selección de características usando los conceptos features, encoding, selección, pipelines.
  2. Ejecutar el laboratorio con una semilla explícita y revisar su contrato JSON.
  3. Identificar al menos un supuesto, una limitación y un riesgo de aplicación.
  4. Comparar el enfoque con la etapa anterior de la ruta de aprendizaje.
  5. Producir una evidencia reproducible y una conclusión que no exceda los datos.

🧩 Conceptos centrales

features, encoding, selección, pipelines

🗺️ Ubicación en el mapa de la IA

En el ML clásico, la representación de los datos importa más que la elección del modelo: "applied machine learning is basically feature engineering" (Andrew Ng). Esta clase sistematiza cómo convertir datos crudos en features útiles y cómo elegir cuáles conservar — con el protocolo anti-fuga de la clase 037 como restricción permanente. Es también el contraste que da sentido al deep learning (parte 04), cuya promesa central es justamente aprender las representaciones que aquí se construyen a mano.

📖 Fundamentos

🔢 Transformaciones numéricas

🏷️ Codificación de categóricas

🧩 Interacciones, fechas y nulos

🎯 Selección de características

Tres familias, de más barata a más fiel al modelo final:

  1. Filtro: puntuar cada feature contra el target sin modelo (correlación, información mutua, test χ²). Rápido, ignora interacciones y redundancia.
  2. Wrapper: buscar subconjuntos entrenando el modelo (selección hacia adelante/atrás, RFE). Fiel pero caro y propenso a sobreajustar la búsqueda: exige CV anidada.
  3. Embedded: la selección ocurre dentro del entrenamiento — lasso (coeficientes a 0), importancias de árboles con umbral. Buen compromiso costo/calidad.

Regla anti-fuga transversal: toda transformación con parámetros aprendidos (μ, σ, medias de target, vocabularios, features seleccionadas) se ajusta SOLO con train, dentro del pipeline que se valida — seleccionar features con el dataset completo y "luego hacer CV" infla la métrica de manera sistemática (el selection bias clásico descrito en ESL §7.10.2).

🧮 Ejemplo trabajado

Target encoding con suavizado (k = 10) para la feature ciudad prediciendo impago (media global ȳ = 0.10):

Ciudad n_c impagos ȳ_c enc = (n·ȳ_c + 10·0.10)/(n+10)
A 90 18 0.20 (90·0.20 + 1)/(103) = 0.19
B 40 2 0.05 (40·0.05 + 1)/50 = 0.06
C 2 2 1.00 (2·1.00 + 1)/12 = 0.25

Sin suavizado, la ciudad C (2 casos, ambos impagos) quedaría codificada como 1.00 — memorización pura de dos filas. El suavizado la arrastra hacia la media global: 0.25. Y aun así, si este encoding se calcula sobre TODO el dataset, cada fila de C "conoce" su propia etiqueta a través del encoding: en CV se vería un lift ficticio. Con esquema out-of-fold, las filas de C se codifican usando solo las otras filas de C del train.

📊 Propiedades y comparación

Técnica Cardinalidad alta ¿Aprende del target? Riesgo de fuga Modelos que la exigen
One-hot Mala (explota) No Bajo Lineales, distancia
Ordinal Buena No Bajo (pero orden falso) Solo con orden real
Target encoding Excelente Alto (out-of-fold obligatorio) Cualquiera
Hashing Excelente No Bajo (colisiones) Lineales online
Filtro (corr/MI) Sí (por feature) Medio (hacerlo en train)
Wrapper (RFE) Sí (por subconjunto) Alto sin CV anidada
Embedded (lasso) Bajo dentro del pipeline
flowchart TD
    R["Datos crudos"] --> S["SPLIT primero<br/>(train / val / test)"]
    S --> T["Ajustar transformadores SOLO con train:<br/>μ,σ · vocabularios · encodings · imputadores"]
    T --> F["Generar features:<br/>numéricas, categóricas, fechas, interacciones"]
    F --> SEL{"Selección"}
    SEL -- "Filtro: corr, MI, χ²" --> M["Entrenar modelo"]
    SEL -- "Embedded: lasso, árboles" --> M
    SEL -- "Wrapper: RFE + CV anidada" --> M
    M --> V["Validar el PIPELINE completo<br/>(transformaciones incluidas)"]
    V -- "iterar" --> F
    V --> TE["Test: una sola vez"]

⚠️ Errores conceptuales frecuentes

  1. "Selecciono features con todo el dataset y después valido el modelo." El sesgo de selección contamina la CV: las features ya vieron el target de las filas de validación. La selección va DENTRO del pipeline validado.
  2. "Target encoding = reemplazar por la media y listo." Sin out-of-fold ni suavizado es una copia parcial del target dentro de las features: lift enorme en validación, colapso en producción.
  3. "Escalar siempre ayuda." A los árboles y ensembles les da igual; a los lineales con regularización y a los métodos de distancia les resulta imprescindible. Conocer la invariancia del modelo evita trabajo y errores.
  4. "Más features = más información = mejor modelo." Features irrelevantes añaden varianza y ruido a los métodos de distancia (maldición de la dimensionalidad) y oportunidades de correlación espuria a la selección.
  5. "La correlación baja con el target descarta la feature." La correlación de Pearson solo ve relaciones lineales marginales: una feature puede ser inútil sola y decisiva en interacción (XOR), o no lineal (información mutua sí la detectaría).

🚀 Del aprendizaje a la operación

En producción las features viven en un feature store con definiciones versionadas para que entrenamiento y serving computen exactamente lo mismo (el training-serving skew es la avería más común); hay que decidir qué hacer con categorías nunca vistas, monitorear la distribución de cada feature (los nulos que suben del 2 % al 30 % rompen el modelo en silencio), auditar features que son proxies de atributos protegidos (código postal ≈ raza/ingreso en muchos países, ver clase 047), y presupuestar la latencia de features calculadas en tiempo real frente a las precalculadas.

🧪 Laboratorio

python lab.py

El laboratorio llama a ai_evolution.labs.run_lab("ml"). Esta decisión evita 183 implementaciones divergentes: cada clase tiene un entrypoint propio, pero los motores didácticos se prueban como una biblioteca común.

🔍 Evidencia esperada

📓 Notebooks

📝 Evaluación

Criterio Peso
Comprensión conceptual 25 %
Ejecución reproducible 25 %
Interpretación basada en evidencia 25 %
Riesgos, límites y mejora propuesta 25 %

Consulta assessment.md para preguntas y criterio de aceptación.

⚠️ Errores comunes

Síntoma Causa probable Corrección
El código corre, pero no hay conclusión Se confundió ejecución con aprendizaje Explica qué demuestra y qué no demuestra
El resultado cambia sin explicación No se registró semilla o configuración Conserva semilla, versión y parámetros
Se promete uso real Se extrapoló desde una demo educativa Declara entorno, datos, límites y revisión humana
Se copia una métrica aislada No existe baseline ni costo de error Añade comparación y criterio de decisión

❓ Preguntas frecuentes

¿Debo usar una API comercial?
No. El núcleo funciona localmente. Las extensiones LIVE se documentan por separado.

¿El laboratorio representa una implementación industrial?
No por sí solo. Enseña el contrato y el patrón; producción exige integración, seguridad, observabilidad, pruebas y operación.

¿Dónde profundizo?
Revisa las especializaciones enlazadas en el README raíz y la ruta siguiente.

🔗 Referencias


📜 Papers que fundamentan esta clase

Bloque generado por python scripts/link_papers_to_classes.py. La fuente es papers/catalog/papers.json.

Paper Año Qué desbloqueó Miniatura
P81 · Introducción a la selección de variables y características 2003 Ordena el problema de elegir variables y demuestra por qué el ranking de una en una falla en las dos direcciones. notebook

Cada ficha explica el problema anterior, la matemática mínima, los límites y los errores de atribución más frecuentes. Para leerlas con método: cómo leer un paper de IA · anexos matemáticos.


📚 Bibliografía de apoyo

Bloque generado por python scripts/link_sources_to_classes.py. Cada obra lleva su localizador verificado en sources/bibliography.json.

Los papers dicen de dónde salió el mecanismo. Estas obras lo desarrollan con el espacio que una clase no tiene: teoría completa, demostraciones y ejercicios.

Obra Edición Localizador Papel en esta clase
Hastie, Trevor, Tibshirani, Robert y Friedman, Jerome — The Elements of Statistical Learning 2.ª · 2009 ISBN 9780387848570 · web de la obra citada en las referencias de esta clase · obra de referencia de la parte 03
James, Gareth et al. — An Introduction to Statistical Learning 2021 ISBN 9783031387470 · web de la obra obra de referencia de la parte 03 · toda la parte, nivel introductorio
Murphy, Kevin P. — Probabilistic Machine Learning 2022 ISBN 9780262046824 · web de la obra obra de referencia de la parte 03 · fundamentos probabilísticos del aprendizaje

⬅️ Clase anterior

041 — Random Forest, boosting y ensembles

➡️ Siguiente clase

043 — Clustering y reducción de dimensionalidad


📝 Evaluación completa

❓ Preguntas

  1. Define ingeniería y selección de características sin usar una marca o framework como definición.
  2. Explica la relación entre features, encoding, selección, pipelines.
  3. Ejecuta lab.py dos veces con la misma semilla. ¿Qué debe conservarse?
  4. Identifica una afirmación permitida y una afirmación exagerada sobre el resultado.
  5. Propón una prueba negativa o un caso límite.

🏆 Reto verificable

Amplía el resultado del laboratorio con una clave student_extension que incluya:

✅ Criterio de aceptación