Uso para Validación

Fuga de información

¿Por qué a veces un modelo parece perfecto… pero falla en la realidad?

¿Qué es la fuga de información?

Ocurre cuando el modelo usa información que no debería conocer.

Esto hace que el desempeño parezca mejor de lo que realmente es.

Tipos de fuga

Fuga en las variables

Se usan datos que no estarán disponibles en el momento de predecir.

Ejemplos: - Información del futuro
- Variables construidas con la respuesta

Tipos de fuga

Fuga en la validación

La forma de evaluar el modelo no refleja el problema real.

Ejemplos: - Mezclar datos de entrenamiento y prueba
- Dividir mal los datos
- Usar validación cruzada incorrectamente

Ejemplo intuitivo

Queremos predecir si un cliente cancelará su servicio.

Pero usamos una variable como:

“número de quejas DESPUÉS de cancelar”

El modelo aprende perfecto… pero es trampa.

¿Por qué es grave?

  • El modelo parece muy preciso
  • Pero falla en producción
  • Lleva a malas decisiones

Señales de alerta

  • Resultados sospechosamente altos
  • Variables “demasiado buenas”
  • Desempeño que cae en datos nuevos

Idea clave

Un buen modelo no es el que mejor funciona en entrenamiento.

Es el que funciona con datos nuevos.

Regla práctica

Antes de entrenar, pregúntate:

¿Esta variable existiría en el momento real de predicción?

Datos en el tiempo

Cuando los datos tienen orden temporal, no podemos dividirlos aleatoriamente.

El problema

Si mezclamos los datos, el modelo puede aprender del futuro.

Esto es una forma de fuga de información.

Ejemplo conceptual

Entrenar con datos de 2023
y evaluar con datos de 2022

El modelo ya “vio el futuro”.

Validación en series de tiempo

Respetamos el orden de los datos.

Siempre entrenamos con el pasado
y evaluamos en el futuro.

Validación en series de tiempo

from sklearn.model_selection import TimeSeriesSplit

time_kfold = TimeSeriesSplit(n_splits=5)

train = train.sort_values('date')

for train_index, test_index in time_kfold.split(train):
    cv_train, cv_test = train.iloc[train_index], train.iloc[test_index]

Idea clave

El modelo nunca debe ver datos futuros durante el entrenamiento.

Pipeline de validación

fold_metrics = []

for train_index, test_index in CV_STRATEGY.split(train):
    
    cv_train, cv_test = train.iloc[train_index], train.iloc[test_index]

    model.fit(cv_train)

    predictions = model.predict(cv_test)

    metric = evaluate(cv_test, predictions)

    fold_metrics.append(metric)

¿Qué estamos haciendo?

  • Entrenamos el modelo en cada fold
  • Evaluamos en datos no vistos
  • Guardamos el resultado

Comparación de modelos

Fold Modelo A Modelo B
1 2.95 2.97
2 2.84 2.45
3 2.62 2.73
4 2.79 2.83

Score global de validación

import numpy as np

mean_score = np.mean(fold_metrics)

lower_bound = mean_score - np.std(fold_metrics)
upper_bound = mean_score + np.std(fold_metrics)

Interpretación

  • Promedio → desempeño esperado

  • Desviación → estabilidad del modelo

Comparación final

Fold Modelo A Modelo B
1 2.95 2.97
2 2.84 2.45
3 2.62 2.73
4 2.79 2.83
Promedio 2.80 2.75
Global 2.92 2.94