← Todos los capítulos
Capítulo 2 · Proyecto de punta a punta

Lo que el modelo aprendió,
y lo que no se puede afirmar

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.

Modelo desplegadoXGBoost300 árboles · 2.4 MB
RMSE en test0.429± USD 42,910
0.8634,128 casas
Latencia2.3 mspor predicción
El encargo

Predecir el precio medio de una vivienda por distrito

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.

Los ocho pasos, y qué fue cada uno aquí
PasoQué significó en este proyecto
Enmarcar el problemaRegresión supervisada. La métrica es el error en dólares, no la exactitud.
Obtener los datos20,640 distritos del censo. Apartar el 20% antes de mirarlos.
ExplorarMapas y correlaciones. El ingreso medio manda; la geografía pesa.
PrepararRellenar huecos, escalar, codificar categorías — todo dentro del pipeline.
EntrenarNueve modelos con parámetros por defecto, para saber desde dónde se parte.
AfinarBúsqueda aleatoria sobre modelo y preparación. 137 combinaciones.
PresentarEsta página.
DesplegarEl modelo elegido recibe datos crudos y responde en 2.3 ms.
El paso que más se salta en la práctica es el segundo: apartar el conjunto de prueba antes de explorar. Mirar los datos completos y después decidir cómo partirlos contamina la evaluación sin que se note.

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.

Explorador

Dónde se equivoca el modelo

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.

Proximidad al océano
Categoría de ingreso
Colorear por
Predicciones reales del modelo XGBoost sobre el conjunto de prueba, calculadas una sola vez y servidas como JSON. Los filtros y las métricas se computan en tu navegador — no hay servidor detrás.
Hallazgos

Tres cosas que resultaron al revés de lo esperado

La variable “más importante” no mejoraba nada

+0.004 RMSE en XGBoost

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.

Lo que sí funcionó fue darle la geografía masticada

−0.036 RMSE

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.

Una variable que se veía excelente estaba haciendo trampa

correlación 0.85 → 0.99

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.

Cuánto aportó cada decisión
Cambio en RMSE al añadir cada elemento, medido con ablación sobre el mismo conjunto. Hacia la izquierda es mejor. La selección de variables aparece del lado malo: descarta la mitad de las columnas y cuesta precisión. La partición estratificada no aparece porque no mueve el error — hace que el número sea confiable, que es otra cosa.
El hallazgo incómodo

Tres modelos empatados, aunque la tabla diga otra cosa

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.

RMSE con intervalo de confianza al 95%
Calculado con la distribución t sobre los errores cuadrados del conjunto de prueba. Los tres primeros se solapan entre sí: no hay evidencia para ordenarlos.
La decisión

Entonces gana el que se puede desplegar

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.

Costo de servir cada modelo
Medido cargando cada artefacto y cronometrando 20 predicciones individuales.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.

Resultados

Tabla completa

Nueve modelos, todos con búsqueda aleatoria de hiperparámetros sobre el modeloy el preprocesamiento. Cada combinación probada quedó registrada en MLflow como ejecución anidada: 137 candidatos en total.
Detalles
Datos
California Housing, 20,640 distritos del censo de 1990. CSV original del repositorio del libro.
Partición
80/20 estratificada por categoría de ingreso. Una partición aleatoria simple subrepresentaba el estrato más pobre en 9.4%.
Preprocesamiento
Imputación por mediana, estandarización, codificación one-hot y similitud a centros geográficos — todo dentro del Pipeline.
Seguimiento
MLflow. 180 ejecuciones, 137 de ellas candidatos anidados de las búsquedas.