Un pipeline completo sobre California Housing — 20,640 viviendas, nueve modelos, 180 experimentos registrados. El resultado interesante no fue el error más bajo, sino descubrir cuáles de las mejoras eran reales y cuáles solo lo parecían.
El dataset trae ocho variables por distrito censal de California — ingreso medio, antigüedad, habitaciones, población, coordenadas — y el precio medio de la vivienda. Es el problema con el que arranca el libro, y su virtud es que todas las trampas del oficio caben en él.
El capítulo no enseña trucos, enseña un orden de trabajo. Ocho pasos que se siguen siempre, en un problema de casas o en cualquier otro.
| Paso | Qué significó en este proyecto |
|---|---|
| Enmarcar el problema | Regresión supervisada. La métrica es el error en dólares, no la exactitud. |
| Obtener los datos | 20,640 distritos del censo. Apartar el 20% antes de mirarlos. |
| Explorar | Mapas y correlaciones. El ingreso medio manda; la geografía pesa. |
| Preparar | Rellenar huecos, escalar, codificar categorías — todo dentro del pipeline. |
| Entrenar | Nueve modelos con parámetros por defecto, para saber desde dónde se parte. |
| Afinar | Búsqueda aleatoria sobre modelo y preparación. 137 combinaciones. |
| Presentar | Esta página. |
| Desplegar | El modelo elegido recibe datos crudos y responde en 2.3 ms. |
Seguir ese orden es la mitad del capítulo. La otra mitad es lo que se aprende al hacerlo — y ahí lo interesante fueron las veces que el resultado contradijo lo que parecía obvio.
Cada punto es uno de los 4,128 distritos del conjunto de prueba — casas que el modelo nunca vio al entrenar. El color indica si subestimó osobreestimó el precio. Filtra y las métricas de abajo se recalculan sobre el subconjunto.
El dataset incluye una variable categórica que dice si el distrito está tierra adentro, cerca de la bahía o frente al mar. Al añadirla, XGBoost la reportó como su variable número uno por importancia — 0.61 contra 0.14 del ingreso medio, que era el favorito hasta entonces. Parecía la mejora grande del proyecto.
Midiendo con una ablación — mismo conjunto, misma semilla, única diferencia la columna — resultó que mejora seis de siete modelos por márgenes mínimos, y que a XGBoost lo empeora.
La explicación: latitud y longitud ya estaban ahí. “Cerca del mar” era deducible de las coordenadas, solo que costaba varios cortes. Al recibirlo servido, el modelo lo usa de inmediato y reordena su ranking de importancia — pero la información no era nueva. Importancia alta no significa mejora predictiva cuando hay redundancia.
Un árbol solo puede partir el espacio con cortes rectangulares sobre latitud y longitud, así que aproximar “cerca de San Francisco” le cuesta muchos cortes y nunca queda fino. La solución del libro es un transformador propio: agrupar las coordenadas con K-means y reemplazar cada casa por susimilitud a cada centro.
Fue el cambio que más rindió de todo el proyecto — más que cualquier ajuste de hiperparámetros. Y reordenó por completo la tabla: los métodos que promedian árboles independientes, que eran los más penalizados por tener que aproximar la geografía a mano, pasaron a ganarle a los de boosting.
Siguiendo la misma idea, se añadió otra variable geográfica: unk-vecinos sobre las coordenadas que responde “¿cuánto cuestan las casas de al lado?”. Su respuesta entra al modelo como una columna más.
En la primera versión su correlación con el precio era de 0.993. Una variable casi perfecta — y ahí estaba el problema: era demasiado buena.
El k-vecinos se había entrenado con las mismas casas sobre las que después predecía, así que cada casa aparecía entre sus propios vecinos. Estaba copiando la respuesta. Calculando la predicción de cada fila con un modelo que nunca la vio, la correlación cae a 0.845 — ese es su valor real.
Aun corregida, sigue siendo la segunda variable más útil del proyecto. Pero sin ese ajuste habría lucido espléndida durante el entrenamiento y se habría derrumbado en producción.
Con todo afinado, extra_trees quedó primero con 0.4063 de RMSE y XGBoost tercero con 0.4291. Ordenar por esa columna y declarar un ganador es el reflejo natural. Es también un error.
El RMSE sale de una muestra concreta de 4,128 casas. Con otras 4,128 habría dado distinto. El intervalo de confianza acota cuánto puede moverse — y cuando dos intervalos se traslapan, la diferencia cabe dentro del ruido del muestreo.
Si la precisión no distingue a los tres primeros, el desempate lo pone lo que sí se puede medir sin ambigüedad. Y ahí la diferencia no es sutil.
extra_trees crece 300 árboles sin límite de profundidad; XGBoost los poda a 7 niveles.extra_trees pide 1.3 GB de memoria — no entra en ningún plan gratuito ni en un servidor pequeño — y tarda trece veces más por petición. XGBoost ocupa 2.4 MB, cabe en cualquier lado y responde en 2.3 milisegundos.
Renunciar a 0.023 de RMSE que no se puede demostrar, a cambio de un modelo 293 veces más pequeño, no es una concesión. Es la decisión correcta, y es la que se toma en producción todos los días.
Pipeline.