⚠️ Traducción en desarrollo. Esta edición en español aún no incorpora las revisiones más recientes y puede contener pasajes desactualizados. La edición en inglés es la versión de referencia.

14  Predicción y generalización

WarningEn desarrollo

Este capítulo forma parte de un libro en desarrollo activo y todavía no ha pasado por la revisión del autor. El contenido puede cambiar a medida que avanza la revisión.

Open In Colab

La decisión de investigación. Decide si tu pregunta es de verdad un pronóstico sobre casos que nadie ha visto todavía y, si lo es, firma un contrato de cuatro partes antes de ajustar nada: objetivo, línea base, partición, métrica, más una revisión de fuga de datos. Ese contrato es lo que te permite defender un puntaje modesto y honesto, y decir en voz alta dónde deja de funcionar tu pronóstico.

14.1 Por qué importa esta decisión

La decisión sobre la mesa: si estás pronosticando casos no vistos y, si es así, qué puntaje aceptarías como honesto.

Imagina a la persona a cargo de salud pública de un condado, que debe decidir semana a semana si publica un aviso para no nadar en un lago. Las floraciones de cianobacterias pueden convertir una playa segura en un riesgo sanitario en cuestión de días. Llega un proveedor con un modelo que detecta floraciones dañinas “con 94% de exactitud”.

“¿Noventa y cuatro por ciento comparado con QUÉ? Casi todas las semanas este lago está bien, así que si digo ‘no hay floración’ todas las semanas ya acierto más o menos el ochenta y cinco por ciento de las veces. Si su modelo no supera eso con claridad, y no demuestra que lo hizo en semanas que nunca estudió, no voy a cerrar una playa pública porque él lo diga.” — una responsable de salud pública a quien ya la quemó un número impresionante

Esa responsable hace las dos preguntas que este capítulo te entrena a responder antes de confiar en cualquier pronóstico. ¿Es mejor que la regla honesta más tonta, y se lo ganó en casos que el modelo nunca vio? Falla en cualquiera de las dos y gritarás “¡lobo!” o dejarás pasar un riesgo real.

14.2 El concepto

Una predicción es la mejor conjetura sobre un caso cuyo resultado todavía no puedes ver. Ejemplo: pronosticar si un lago florecerá la semana que viene, antes de que exista la semana que viene. La predicción es descriptiva, no causal. Pronostica qué pasará, nunca por qué.

Lo que hace de la predicción una pregunta propia es su alcance, los casos que una afirmación pretende cubrir. El alcance de la predicción son los casos no vistos, unidades que no están en tus datos y cuyo resultado sigue siendo desconocido, como las muestras del mes que viene. Su prima es la generalización, el alcance que va de tu muestra a una población más amplia, por ejemplo de los doce lagos que mediste a todos los lagos de la cuenca. Ambas van más allá de los datos que tienes en la mano, y ambas son honestas solo cuando puedes nombrar el cruce que las autoriza.

Un pronóstico se gana la confianza bajo un contrato de cuatro partes, en orden fijo. El objetivo es la única columna que predices, por ejemplo bloom_next_week. La línea base es la regla honesta más tonta que tienes que superar, casi siempre “adivina siempre la respuesta más común”; si el 85% de las semanas no tiene floración, esa regla saca 85% gratis, así que 85% es la vara. La métrica es cómo llevas el marcador, ajustada al objetivo; la exactitud engaña cuando las floraciones son raras, así que la sensibilidad sobre la clase con floración, la proporción de floraciones reales que el modelo detecta, suele importar más. Elijas la que elijas, puntúa la línea base y cada candidato con la misma métrica, o la comparación no significa nada.

La partición es donde se pierden casi todos los pronósticos de apariencia honesta, así que lleva tres partes en vez de dos. El conjunto de entrenamiento son los datos con los que aprende cada modelo candidato. Ejemplo: el modelo saca sus coeficientes de tu primer verano. El conjunto de selección son datos aparte que usas para elegir entre candidatos. Ejemplo: comparas tres listas de variables y eliges una en el segundo verano. El holdout final son los datos que guardas bajo llave y abres una sola vez, después de que toda elección está hecha. Ejemplo: solo el modelo que ya elegiste llega a tocar tu tercer verano.

Córrelos en ese orden. Ajusta en entrenamiento, elige en selección, y luego puntúa tu única elección en el holdout final. La razón del paso del medio es fácil de pasar por alto. Cuando pruebas doce modelos y te quedas con el mejor puntaje que viste, ese puntaje ganador está adulado por la suerte, en promedio: algún modelo siempre iba a parecer el mejor en esos datos concretos, en parte porque sus errores cayeron de manera amable ahí. En una partición cualquiera la adulación puede ser grande, pequeña o incluso invertida; a lo largo de muchas particiones apunta hacia arriba. El sesgo de selección de modelo es esa adulación, la distancia entre el puntaje de un ganador en los datos que lo coronaron y su puntaje honesto en datos que nunca ha visto. Reporta el puntaje de la coronación como final y prometerás un desempeño que el modelo no entrega.

Una consecuencia merece decirse con todas sus letras. Si el holdout final te hace volver y cambiar una variable, un umbral o un modelo, se unió al desarrollo y dejó de ser un examen. Entonces necesitas datos nuevos e intactos para la siguiente comprobación final. En el flujo simple que enseña este libro, ver el puntaje final sella el análisis; cualquier cambio posterior rompe el sello. Hay técnicas especializadas para reutilizar con cuidado, y quedan fuera de este capítulo, así que sostén la regla simple hasta tener una razón defendida para no hacerlo.

Hay una trampa por encima de todas. La fuga de datos es información que llega a tu modelo, o a tu elección de modelo, que no estaría disponible en el momento real del pronóstico. Ejemplo: la concentración de toxinas medida durante la floración. Una característica filtrada infla tu puntaje con los datos de hoy y se derrumba con los de mañana, porque no existirá cuando de verdad necesites el pronóstico. Elegir tu modelo en el holdout final es la misma falla con otra ropa, ya que ese puntaje debía representar datos que nunca has visto.

El tiempo trae su propia versión de esta trampa. Cuando tu objetivo es la semana que viene, tus semanas de examen deberían venir después de las semanas con las que aprendiste. Partir las semanas al azar le entrega agosto al modelo mientras le pides que pronostique julio, lo que responde qué tan bien rellena semanas pasadas sueltas, no qué tan bien pronostica la siguiente. Mantén los bloques en orden de calendario, y deja que el bloque más reciente sea el que guardas bajo llave. Ese es el valor por defecto que imita cómo se usará el pronóstico de verdad; hay quienes lo relajan en casos estrechos y argumentados, y ninguno empieza barajando el calendario.

14.3 Un ejemplo resuelto

Supón que quieres avisar con una semana de anticipación a quienes nadan. Tu objetivo es bloom_next_week, uno si el lago supera el umbral del aviso y cero si no. A lo largo de tres veranos de muestras semanales, el 85% de las semanas está limpio, así que tu línea base, “di siempre que no hay floración”, saca 0.85 sin modelo alguno.

Te quedas con características que de verdad se conocen con una semana de anticipación: temperatura del agua, lluvia reciente, carga de fósforo aguas arriba. Los tres veranos te dan tus tres papeles sin barajar nada. El verano uno entrena tus modelos candidatos. El verano dos elige entre ellos. El verano tres queda bajo llave hasta que la elección esté hecha. Ajustas un modelo logístico (un clasificador estándar de sí o no) y comparas algunas listas de variables en el verano dos. Luego abres el verano tres una sola vez, para el ganador solo. Puntuado con la misma métrica que la línea base, la exactitud, el modelo cae alrededor de 0.88 contra el 0.85 de la línea base (estas cifras están construidas para el ejemplo). Esa ventaja de tres puntos se siente pequeña, y su pequeñez es el resultado honesto: un triunfo modesto y verdadero vale más que uno dramático y falso. Aun así reportas la sensibilidad al lado, porque la exactitud sola esconde las floraciones que se escapan.

Entonces alguien con buenas intenciones agrega chlorophyll_a, la lectura del pigmento. El puntaje salta a 0.97. Emocionante, hasta que preguntas cuándo se mide la clorofila: durante la floración misma que estás pronosticando. Es el resultado disfrazado con otra etiqueta. Quítala, y el puntaje vuelve a 0.88. Lo que decide es la prueba del momento, no la exactitud. Y como entrenaste en un lago poco profundo, nombras la frontera en voz alta: en un embalse profundo y frío el patrón puede no sostenerse, así que el pronóstico todavía no generaliza ahí.

14.4 Una simulación con semilla

El capítulo afirma dos cosas a la vez, y el código de abajo muestra ambas. Un modelo puede mejorar con los datos que ya vio mientras empeora con los casos que nunca ha visto. Y el puntaje que coronó a tu ganador lo adula, en promedio. La semilla vuelve reproducible la corrida: el mismo código siempre sortea los mismos mundos.

La primera mitad construye un mundo (una curva senoidal más ruido) y corre el protocolo que acabas de aprender: doce polinomios ajustados en entrenamiento, comparados en selección, y el ganador solo puntuado una vez en un holdout final. La segunda mitad mide el sesgo de selección de modelo como lo exige la definición, como un promedio a lo largo de repeticiones. En cada uno de 500 mundos nuevos pregunta: ¿cómo se compara el error verdadero del ganador con el puntaje de selección que lo coronó? Nadie mide con exactitud el error verdadero de un modelo, así que el código lo representa con diez mil puntos frescos, una aproximación de alta precisión en esta simulación y mucho más de lo que tendría cualquier estudio real. Cada mitad reinicia la semilla, así que puedes correr cualquiera por su cuenta y obtener estos mismos números.

import numpy as np

SEED = 464
grados = np.arange(1, 13)

def mundo(rng, n):
    x = rng.uniform(-3, 3, n)
    return x, np.sin(1.5 * x) + rng.normal(0, .35, n)

def rmse(coefs, datos):
    x, y = datos
    return np.sqrt(np.mean((np.polyval(coefs, x) - y) ** 2))

# Primera mitad: un mundo, los tres papeles.
rng = np.random.default_rng(SEED)
entrenamiento, seleccion, final = (mundo(rng, 40) for _ in range(3))
ajustes = [np.polyfit(entrenamiento[0], entrenamiento[1], g) for g in grados]
err_sel = np.array([rmse(c, seleccion) for c in ajustes])
elegido = int(np.argmin(err_sel))         # elegido en SELECCIÓN, nunca en el final
print("grado elegido:", grados[elegido])
print("puntaje de selección que lo eligió:", round(float(err_sel[elegido]), 3))
print("su único puntaje de holdout final:", round(rmse(ajustes[elegido], final), 3))

# Segunda mitad: optimismo en expectativa. Reinicia la semilla para que este
# estudio se reproduzca por su cuenta.
rng = np.random.default_rng(SEED)
brechas = []
for _ in range(500):
    tr, sel, grande = mundo(rng, 40), mundo(rng, 40), mundo(rng, 10_000)
    f = [np.polyfit(tr[0], tr[1], g) for g in grados]
    se = np.array([rmse(c, sel) for c in f])
    pick = int(np.argmin(se))
    brechas.append(rmse(f[pick], grande) - se[pick])   # verdadero menos su corona
brechas = np.asarray(brechas)

print("optimismo medio:", round(float(brechas.mean()), 3), "RMSE")
print("mediana:", round(float(np.median(brechas)), 3))
print("ganador de verdad peor que su puntaje de coronación en",
      round(100 * float((brechas > 0).mean()), 1), "% de los mundos")
print("mayor brecha individual:", round(float(brechas.max()), 2))

Gráfico de dos paneles. A la izquierda: una línea azul de error de entrenamiento que cae de forma constante por los grados polinomiales 1 a 12, una línea naranja de error de selección que cae hasta el grado seis y luego sube, una línea vertical punteada en el grado seis rotulada elegido en la selección, y un rombo negro rotulado holdout final por encima de la curva de selección. A la derecha: un histograma del error verdadero del ganador menos su puntaje de selección ganador a lo largo de 500 mundos simulados, centrado apenas a la derecha de cero, anotado optimismo medio más 0.025 RMSE, mediana más 0.015, peor que su puntaje de coronación en 64 por ciento de los mundos, con una flecha que señala 4 mundos más allá de más 0.3 y el mayor en más 1.86.

A la izquierda: el error de entrenamiento sigue cayendo mientras el error de selección sube después del grado seis, donde se elige el modelo; un rombo marca su único puntaje de holdout final. A la derecha: a lo largo de 500 mundos, el error verdadero del ganador excede en promedio al puntaje que lo coronó, con una cola larga a la derecha.

Lee primero el panel izquierdo. El error de entrenamiento azul solo cae: cada grado extra de flexibilidad deja que el modelo se doble más cerca de puntos que ya vio. El error de selección naranja cae mientras el modelo aprende señal, toca fondo cerca del grado seis, y sube cuando el modelo empieza a memorizar ruido. Nada en la línea azul por sí sola te diría que pares en seis. Solo datos que el ajuste nunca tocó lo dicen.

Ahora el panel derecho, y léelo como un promedio, porque eso es el sesgo. A lo largo de 500 mundos el error verdadero del ganador excede al puntaje que lo coronó en 0.025 RMSE en promedio (mediana 0.015), y el ganador sale peor que su puntaje de coronación en 64 por ciento de los mundos. En el otro tercio la suerte corrió al revés, y por eso ninguna partición individual te muestra el sesgo: es una inclinación en el montón, no una propiedad de cada corrida.

Después mira la flecha. En 4 de los 500 mundos la brecha pasó de más 0.3, llegando a más 1.86, porque un ajuste desaforadamente flexible ganó la selección por casualidad y luego se disparó fuera de sus datos. Esos mundos no son ruido para recortar. Son el riesgo real del procedimiento mostrándose, y cualquier promedio que reportes tiene que hacerse cargo de ellos. El resumen honesto nombra las tres cosas: la inclinación (la media), el caso típico (la mediana) y la cola (qué tan mal, con qué frecuencia). En el cuaderno de acompañamiento, sube el ruido (el .35) y mira crecer las tres: cuanto más ruidoso el mundo, más le debe el ganador a la suerte.

14.5 El laboratorio en Colab

Este capítulo tiene su propio cuaderno de acompañamiento: ábrelo en Colab con la insignia de arriba. El cuaderno reúne los prompts y el código del capítulo y termina con el espacio de trabajo Ahora te toca a ti, para que completes el paso del capítulo en tu proyecto sin salir de Colab. El laboratorio de aula completo detrás de este capítulo es el cuaderno del curso nb08 — Prediction: generalizing to unseen cases (predicción: generalizar a casos no vistos) (abrir en Colab), parte del curso de acompañamiento presentado en el apéndice Para docentes. En el laboratorio firmas el contrato de cuatro partes sobre un conjunto de datos real, calificas primero una línea base honesta y luego construyes una fuga a propósito para que sientas subir un puntaje falso y aprendas a cazarlo por correlación y por momento antes de reentrenar limpio.

14.6 Prompts de IA recomendados

Comprométete primero con tu propia respuesta y luego delega. Pega salida real, nunca un número que recuerdas. Espera correr cada prompt más de una vez: lee la respuesta, nombra la parte que no te crees, devuelve esa objeción al prompt y vuelve a correrlo. Las herramientas que corren ese bucle de IA por su cuenta, el ciclo prompt → respuesta → interrogación → refinamiento → nueva ejecución, ajustando y reajustando un modelo a lo largo de varias vueltas, vuelven la pregunta de la fuga de datos más urgente, no menos. Nadie dentro de ese bucle, salvo tú, sabe cuándo se registraron tus datos.

Act as a Python tutor. Here is a cell that holds out 25% of my weekly
lake samples, scores a majority-class baseline on them, then scores a
logistic model on the SAME held-out weeks: [paste cell]. Explain, line
by line, what the split does and why it must happen before any fitting.
Then give me one independent way to confirm the held-out weeks were
never in training.

Después de ejecutarlo, verifica: lee la línea base, el modelo y el margen en tu propia impresión y confirma que los números de la herramienta coinciden, y que no son números que adivinó. Contrarresta la fabricación confiada (confident fabrication), un recorrido fluido que cita un margen que tu código nunca produjo.

Here is the outcome I want to predict and the moment I need the forecast:
a bloom next week, decided by next week's samples. Here is my candidate
feature list with when each value is recorded: [list]. For each feature,
say whether its value is settled before, at, or after the outcome, and
flag any that could not exist at prediction time.

Después de ejecutarlo, verifica: vuelve a derivar el momento de la característica que la herramienta aprueba con más seguridad. Si alguna queda fijada en el momento de la floración o después, recházala diga lo que diga la herramienta. Contrarresta la ilusión de exhaustividad, una lista ordenada que omite la única característica de definición tardía que arruina el pronóstico.

Act as a hostile reviewer. Attack this headline: "Our model forecasts
blooms with 88% held-out accuracy." Name every reason a skeptic would
distrust it, including the baseline it beat, the metric, and any hidden
leak.

Después de ejecutarlo, verifica: contrasta cada objeción con tu impresión y quédate con las que tus números respaldan. Contrarresta el acuerdo complaciente, cuando una asistente preparada para ayudar elogia un titular que escribiste tú.

ImportantNo delegues

Cuatro decisiones siguen siendo tuyas. El objetivo: qué pronosticas y por qué importa. La línea base: la regla honesta que el modelo debe superar. El momento de cada característica: si un valor existiría de verdad en el instante del pronóstico, algo que solo puedes resolver tú, que conoces la línea de tiempo de tus datos. Y el veredicto sobre si tu proyecto debería predecir siquiera. Una herramienta que nunca vio tu línea de tiempo no puede tomar estas decisiones por ti.

14.7 Un caso de falla de la IA

Pegas tu lista de características y le preguntas a un socio de IA cuáles son seguras de usar. Responde con seguridad: “chlorophyll_a es tu predictor más fuerte, consérvala”. El razonamiento suena impecable, porque la clorofila correlaciona casi a la perfección con las floraciones. Esa correlación casi perfecta es justamente la señal. Es la falla del método plausible pero equivocado: la herramienta ordenó la característica por qué tan bien ajusta el pasado, no por si podría existir a tiempo para un pronóstico. Lo detectas con una pregunta que la estadística sola no puede responder. ¿Cuándo se mide la clorofila? Durante la floración, así que ningún pronóstico hecho una semana antes podría tenerla. Quítala, mira el puntaje caer de vuelta a 0.88 y quédate con el modelo honesto.

14.8 Ahora te toca a ti

Tu diseño ya está declarado y diagnosticado. Este paso decide si tu proyecto está pronosticando de verdad casos que nadie ha visto todavía y, si es así, pone ese pronóstico bajo contrato antes de que ajustes un solo modelo.

  1. Hazte la versión más directa de tu pregunta: ¿tu proyecto necesita adivinar el resultado de un caso cuyo resultado todavía no existe? Escribe sí o no, y la oración que justifica tu respuesta.
  2. Si es que sí, firma el contrato de cuatro partes, en orden. Nombra la columna objetivo, la línea base honesta más tonta que tiene que superar, la partición que deja sin ver una porción de los casos, y la métrica ajustada a qué tan raro es tu resultado.
  3. Enumera tus características y escribe al lado de cada una el momento en que su valor queda fijado. Marca con un círculo todo lo que quede fijado en el momento del resultado o después. Ese conjunto marcado es tu lista de fuga de datos, y va en tu reporte tanto si quitas esas características como si no.
  4. Escribe la frontera en una oración: los casos que tu pronóstico cubre y los que quien te lea no debería suponer que cubre. Sé específico sobre qué los hace diferentes.
  5. Si la predicción no es tu pregunta, escribe la línea que lo diga con claridad y luego corre igual el paso 3. Una variable que queda fijada después del resultado también hunde en silencio el trabajo descriptivo y el causal.
  6. Registra el paso en tu AI Research Ledger (registro de investigación con IA) y verifica al menos una salida con un método nombrado de la Guía de Verificación. Para un modelo ajustado, el método es la muestra reservada: nunca reportes un puntaje calculado sobre filas con las que el modelo entrenó. Una IA revisora puede hacer la comprobación contigo; la decisión de aceptar o rechazar es tuya.