Validación y Análisis · Tema 09

Calibración de modelos

Ajustar parámetros para acercarse a los datos sin memorizarlos: la calibración honesta mejora el pasado conocido y se juzga con datos frescos.

01 · Punto de partida

El modelo correcto con los números equivocados

Un tanque con la regla perfecta pero balance 2 cuando el real es 1 falla la validación (Temas 5–7) sin estar conceptualmente roto. No hay que tirar el modelo: hay que calibrarlo, es decir, buscar los parámetros que minimizan el error contra datos de entrenamiento.

  • ¿Qué parámetros ajustar y en qué rango?
  • ¿Con qué métrica (MAE, ECM) y con qué datos?
  • ¿Cómo saber si el ajuste es genuino o sobreajuste?
  • ¿Cuándo calibrar esconde un modelo equivocado?

02 · Definición

Qué se ajusta y qué no

⚙

Parámetros

Se calibran: balance, tope, tasas. Viven en un rango declarado y tienen unidades.

◈

Estructura

No se calibra: la regla misma. Si falta evaporación, ningún balance la compensa de forma estable.

◎

Métrica

MAE (robusto, en unidades) o ECM (penaliza picos). Se elige antes, según el uso (Temas 20–22).

Calibración frente a validación y a estimación.
ActividadDatosProducto
Calibración (T9)Entrenamientoθ* que minimiza el error
Validación (T5–T8)Frescos / futurosVeredicto con tolerancia
Estimación (T18–19)Muestra + modelo prob.Estimador con incerteza e IC

03 · Método

Búsqueda por grilla, sin magia

  1. 1
    Elegir 1–2 parámetros y su rango.

    Ej.: balance en [0, 2]. Más parámetros que datos es sobreajuste garantizado.

  2. 2
    Fijar métrica y datos de entrenamiento.

    MAE en t=0…6. El test queda sellado hasta el final.

  3. 3
    Barrer la grilla y graficar error vs. θ.

    La curva en U revela el óptimo y su filo: ¿plano (robusto) o puntiagudo (frágil)?

  4. 4
    Elegir θ* y juzgarlo en test.

    Si MAE test ≈ MAE train, el ajuste generaliza; si se derrumba, hubo memorización.

  5. 5
    Documentar rango, métrica y θ*.

    «Balance 1,0 ± 0,2, MAE train 0,5, test 0,6». Sin papeles no hay calibración.

rango + métrica→grilla en train→θ*→juicio en test

04 · Riesgos

Cuándo el ajuste miente

Sobreajuste

Memoriza el ruido

Con muchos parámetros el train baja a 0 y el test explota. Antídoto: pocos parámetros, test sellado, curva error vs. complejidad.

No identificable

Varios θ empatan

Entrada 4/salida 3 empata con 3/2 (mismo balance). El óptimo no es único: hay que fijar uno por criterio externo.

Compensación
Un bug se «calibra» con un parámetro torcido (Tema 1, caso C). El train pasa y el próximo escenario rompe.
Extrapolación
θ* vale dentro del rango entrenado. Fuera de él, la calibración no garantiza nada.
Métrica equivocada
Optimizar ECM cuando el uso pide MAE (o viceversa) elige otro θ*. La métrica es parte del uso.

05 · Representación en Python

Grilla de calibración en 20 líneas

Python en tu navegador. La grilla prueba balances y se queda con el mejor solo según el train.

train = [11, 12, 13, 14, 15, 16, 17]  # t=0..6, lo único visible
test = [18, 19, 20, 21, 22, 23]        # sellado hasta el final
TOL = 1.0

def simular(inicio, balance, pasos):
    return [inicio + balance * (t + 1) for t in range(pasos)]

def mae(a, b):
    return sum(abs(x - y) for x, y in zip(a, b)) / len(a)

mejor, mejor_e = None, float("inf")
for balance in [round(0.5 + 0.25 * k, 2) for k in range(7)]:
    e = mae(simular(10, balance, len(train)), train)
    print(f"balance {balance}: MAE train {e:.2f}")
    if e < mejor_e:
        mejor, mejor_e = balance, e
print(f"theta* = {mejor} con MAE train {mejor_e:.2f}")

El óptimo es balance 1,0 con MAE 0. Probá con train ruidoso y mirá cómo el óptimo tiembla: esa es la incerteza de calibración.

Juicio en test sellado

sim_test = simular(10, mejor, len(train) + len(test))[len(train):]
print(f"MAE test con theta*={mejor}: {mae(sim_test, test):.2f} (tol {TOL})")
print("Generaliza" if mae(sim_test, test) <= TOL else "Sobreajustó o derivó")

06 · Exploración

Laboratorio: girá la perilla y mirá el error

La realidad es 10 + 1·t + ruido (semilla 9). Tu modelo propone 10 + balance·t. Mové el balance y el corte train/test. Abajo ves la curva de error vs. balance con tu posición y el óptimo marcado. Objetivo: encontrar θ* solo con el train y confirmar en el test.

EXPERIMENTO 09

Calibrar en train, juzgar en test

θ* = balance con menor MAE train · tol 1,0

Los resultados numéricos aparecen debajo.
MAE train0,00
MAE test0,00
Distancia a θ*0,00
Veredicto testVálido

Balance 1,0: óptimo en train y válido en test.

Arriba: historia real (puntos) frente a tu simulado (línea) con zona train/test. Abajo: curva MAE train vs. balance con tu posición (naranja) y el óptimo (lima).

Preguntas para explorar

  1. Con corte 7 y ruido 0,6: barrré el balance de 0 a 2. ¿Dónde está el mínimo del train? ¿Coincide el test?
  2. Subí el ruido a 1,5. ¿La U se aplana o se afila? ¿Qué le pasa a la distancia entre tu ojo y el θ* verdadero?
  3. Poné balance 1,6 a propósito. Train y test fallan parejo: ¿eso es sobreajuste o mala calibración? ¿Cómo lo arreglás?
Ver respuestas sugeridas
  1. Mínimo en 1,0 en ambas: el modelo está bien especificado y el ruido es moderado. Calibración y validación coinciden.
  2. Se aplana y el mínimo tiembla: con mucho ruido varios balances empatan. Esa planicie es incerteza de calibración honesta.
  3. Mala calibración (no sobreajuste): ambos errores altos y parejos. Se arregla volviendo a la grilla, no agregando parámetros.

07 · Comprensión

Confusiones frecuentes

«Calibrar es validar»

Calibrar minimiza error en train; validar juzga en datos frescos. El train nunca da veredictos.

«Más parámetros, mejor calibración»

Mejor train, peor test. Cada parámetro debe ganarse su lugar con mejora en test, no en train.

«El θ* es el valor verdadero»

Es el que minimiza la métrica elegida en estos datos. Con otros datos u otra métrica, cambia. Informá rango, no punto.

«Si calibra bien, la estructura es correcta»

Una estructura rota puede calibrar por compensación dentro del rango y romperse fuera. La estructura se verifica (T2–T4), no se calibra.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: calibrar a mano con grilla

Encontrá el balance que minimiza el MAE train. ¿Generaliza al test?

train = [11, 13, 14, 15, 17]
test = [18, 19, 21]
def sim(b, n):
    return [10 + b*(t+1) for t in range(n)]
def mae(a, b):
    return sum(abs(x-y) for x, y in zip(a, b))/len(a)
for b in [0.8, 1.0, 1.2]:
    print(b, round(mae(sim(b, 5), train), 2))
print("test con 1.0:", round(mae(sim(1.0, 8)[5:], test), 2))
Ver solución razonada

MAE train: 0,72 (0,8), 0,40 (1,0), 0,64 (1,2) → θ* = 1,0. Test con 1,0 ≈ 0,33: generaliza, no hay sobreajuste.

Ejercicio 2: detectar no identificabilidad

¿Por qué estos dos pares empatan y qué harías?

# nivel = inicio + (entrada - salida) * t ; solo importa el balance
print((4 - 3), (3 - 2), "mismo balance = mismo pronóstico")
print("Fijar uno por criterio externo (medir la salida)")
Ver solución

Ambos dan balance 1: la grilla no puede distinguirlos. Se fija la salida con medición independiente y se calibra solo la entrada (o el balance directo).

Ejercicio 3: calibración absurda delata estructura

La grilla pide tope 200 para un tanque de 14. ¿Qué concluís?

Ver una posible respuesta
print("theta* absurdo => estructura rota: falta evaporación o fuga")
print("No aceptar: volver al papel (Tema 2), no inflar el tope")

Un θ* físicamente imposible es el modelo gritando que la regla está incompleta. Aceptarlo es calibrar un bug.

09 · Síntesis

Ideas para recordar

  • Calibrar = argmin del error en train; validar = veredicto en datos frescos.
  • Pocos parámetros, rango declarado, métrica elegida por el uso, curva error vs. θ siempre graficada.
  • Train ≈ test: generaliza. Train ≪ test: sobreajuste. Ambos altos: sesgo o estructura rota.
  • θ* absurdo = estructura rota, no éxito de optimización.
  • Toda calibración se documenta con incerteza y se revalida con datos nuevos.

En el próximo tema conseguiremos la materia prima de todo lo anterior: datos para validación.