← Todos los capítulos
Capítulo 1 · Práctica

Los dos estilos de generalización,
sobre los mismos 27 países

El dataset más pequeño del libro. No sirve para construir nada y no pretende hacerlo: existe para volver tangible una única distinción: que hay dos maneras de responder por un caso que nunca se vio.

27 filas · 2 columnas · scikit-learn Probarlo en vivo →
El dato

Qué hay dentro

Dos fuentes cruzadas por país: el Better Life Index de la OCDE, que pregunta a la gente cómo de satisfecha está con su vida en una escala de 0 a 10, y las cifras de PIB per cápita del FMI. Géron lo publica ya cruzado y filtrado.

Filas27un país cada una
PIB per cápita26k – 60kUSD
Satisfacción5.4 – 7.6escala 0–10

Una sola variable de entrada. Eso es deliberado: con una dimensión todo cabe en una gráfica plana y no hace falta creerse nada. La diferencia entre los dos modelos se ve.

El montaje

Dos modelos, cuatro líneas

No hay preprocesamiento, ni partición, ni búsqueda de hiperparámetros. Se ajustan los dos sobre las 27 filas completas y se les pregunta lo mismo.

El núcleo de src/lifesat.py
lineal  = LinearRegression().fit(X, y)
vecinos = KNeighborsRegressor(n_neighbors=3).fit(X, y)

lineal.predict([[37_655.2]])    # Chipre, que no está en los datos
vecinos.predict([[37_655.2]])
Chipre no aparece en el dataset y su PIB per cápita real es 37,655 USD. Es el caso nuevo sobre el que ambos tienen que pronunciarse.
El resultado

Mismo número, caminos opuestos

Por modelo · recta6.30guarda 2 números
Por instancia · 3 vecinos6.33guarda 27 países

Tres centésimas de diferencia. Si el criterio fuera solo la respuesta, daría igual cuál usar, y ese es justamente el punto: la distinción no está en el resultado, está en qué tuvo que quedarse cada uno para producirlo.

Lo que cada modelo se lleva a producción
Regresión lineal Dos números: pendiente 6.78e-05 e intersección 3.75. Terminado el ajuste, los 27 países ya no hacen falta y se pueden borrar. Predecir es una multiplicación y una suma.
k-vecinos El dataset entero. No resume nada: guarda las 27 filas y, ante un caso nuevo, recorre buscando los 3 más parecidos y promedia su satisfacción. El «entrenamiento» es literalmente copiar los datos.
Aquí son 27 filas y no importa. Con volúmenes reales sí importa: el modelo por instancia despliega sus datos con él y responde más lento cuanto más ha visto. Vuelve a aparecer en el capítulo 2, donde el mejor modelo pesaba 703 MB frente a los 2.4 MB del elegido.
Lo que se ve

Una línea suave contra una escalera

Dispersión de PIB per cápita contra satisfacción con la vida, con una recta de regresión y la escalera del k-vecinos superpuestas
La escalera salta cada vez que el vecindario de los tres países más cercanos cambia de composición. Entre saltos el valor es plano, porque el promedio de los mismos tres países no depende del punto exacto dentro de ese tramo.

Esa forma no es un defecto del dibujo, es la predicción real. El k-vecinos no interpola: devuelve el promedio de un conjunto discreto, y ese conjunto solo cambia en saltos. Por eso los escalones tienen anchos distintos: son más anchos donde los países están más separados.

La recta, en cambio, no puede saltar. Se le impuso una forma antes de ver un solo dato, y lo único que el ajuste decidió fue su inclinación y su altura. Eso es exactamente lo que significa «basado en modelo»: la forma se elige, los datos solo la calibran.

En la demo se ve mejor que en la imagen, porque ahí se resaltan los tres países que el modelo está usando en cada momento y se puede ver el instante en que uno sale y otro entra.

El subajuste, de propina

R² = 0.73

La recta explica el 73% de la variación. El 27% restante no es ruido de medición ni un problema de muestra pequeña: es que la satisfacción de un país no es una función de su riqueza.

En la gráfica se ve a simple vista. Hay países ricos claramente por debajo de la recta y países modestos por encima. Ninguna recta puede pasar por ambos a la vez, porque una recta solo tiene dos grados de libertad y la estructura de los datos necesita más.

Eso es subajuste: un modelo demasiado simple para lo que hay. Se arregla con más parámetros, mejores variables o menos regularización, nunca con más datos. Esa es la diferencia clave frente al sobreajuste.

Lo que no se hizo, y por qué

Aquí no hay medición de generalización

Ese R² está calculado sobre los mismos datos con los que se ajustó. No es una estimación de cómo generalizaría. Es solo cuánta variación capta la recta donde ya sabe la respuesta. Con 27 filas no hay conjunto de prueba que signifique nada.

Sin train/testPartir 27 filas deja unas 5 en prueba. El número que saliera dependería de qué cinco países tocaron.
Sin MLflowEl resto del repositorio registra cada experimento. Aquí serían dos modelos de una línea sin hiperparámetros que comparar: ceremonia sin sustancia.
Sin validación cruzadaMismo motivo. Promediar pliegues de cinco países mide ruido de muestreo, no desempeño.

Decirlo importa porque el capítulo dedica su última sección justo a esto: a que el conjunto de prueba se gasta y a que medir mal es peor que no medir. Publicar un 0.73 sin la advertencia sería contradecir el capítulo dentro del capítulo.

Reproducirlo
cd ch01-panorama
make lifesat
Descarga el CSV si falta, imprime los números de arriba, regenera la gráfica en reports/lifesat.png y vuelca los datos que consume la demo en web/public/data/ch01.json, 2.4 KB, que es todo lo que el navegador necesita para reajustar ambos modelos por su cuenta.

Lo que este dataset deja. Que «entrenar» significa cosas distintas según el modelo: para uno es resolver un ajuste, para otro es guardar una copia. Y que dos modelos con la misma respuesta pueden tener costes de operación incomparables.

Probarlo en vivo →