Machine Learning
Machine Learning en el mundo real
El cuaderno de un profesional del ML que aprendió a desconfiar de sus propias cifras. Tres hilos conductores: la caza de fugas de datos y de scores inflados, el rigor estadístico en la comparación de modelos (bootstrap pareado, 5x2cv, McNemar), y el salto del score académico a la decisión de negocio (umbral por coste, calibración auditada). Mostramos el código erróneo Y el código correcto, y siempre cuantificamos la diferencia.
20 snippets destacados
- TargetEncoder nativo: codificación por la variable objetivo sin fugaEl TargetEncoder de scikit-learn aplica un cross-fitting interno durante fit_transform: cada fila se codifica con medias calculadas sin ella, lo que neutraliza la fuga de la variable objetivo.
- Cross-validation purgada con embargo (finanzas)Generador de folds temporales que elimina las observaciones adyacentes al fold de test: imprescindible cuando las etiquetas abarcan varios periodos (rendimiento a horizonte H) y se solapan.
- Nested CV: estimar el rendimiento DESPUÉS del tuningLa puntuación de un GridSearchCV es optimista porque los hiperparámetros se eligieron sobre esos mismos folds. El bucle externo de una nested CV da la estimación no sesgada de todo el procedimiento.
- Umbral por minimización del coste de negocio esperadoCuando un falso negativo cuesta 50 veces más que un falso positivo, el umbral correcto no se lee en ninguna curva estándar: se minimiza directamente el coste total esperado sobre la validación.
- PSI: detectar la deriva de una feature en producciónEl Population Stability Index compara la distribución de una variable entre el entrenamiento y la producción. Umbrales habituales: < 0.10 estable, 0.10-0.25 a vigilar, > 0.25 drift importante.
- Validación adversarial: ¿son comparables train y test?Entrenar un clasificador para distinguir train de producción: un AUC cercano a 0.5 indica distribuciones parecidas; por encima de 0.7, las features más importantes señalan el origen del drift.
- Exportar un pipeline completo a ONNX y verificar la paridadConversión del pipeline de scikit-learn entero (preprocesamiento incluido) a ONNX, y luego una aserción numérica entre las salidas de sklearn y onnxruntime — el paso que uno lamenta haberse saltado.
- Serializar el modelo CON sus metadatos de trazabilidadUn .joblib pelado es una bomba de relojería: incrustar versión, fecha, hash de los datos, métricas y columnas esperadas en el mismo artefacto hace que cada modelo sea auditable.
- Restricciones de monotonía: inyectar el conocimiento del negocioForzar al modelo a respetar relaciones conocidas (más endeudamiento nunca reduce el riesgo): regularización gratuita, robustez frente al ruido y un modelo defendible ante un comité.
- Fuga corregida: selección de features sobre todo el datasetSeleccionar las features correlacionadas con el target ANTES de la cross-validation produce AUC disparatadas sobre puro ruido — demostración con cifras y luego corrección mediante un pipeline.
- Duelo de gradient boostings: XGBoost, LightGBM, CatBoost, HistGBBanco de pruebas de las cuatro implementaciones principales de gradient boosting sobre el mismo conjunto tabular: AUC, tiempo de entrenamiento, latencia de predicción y tamaño del modelo serializado, en una única tabla de decisión.
- Bootstrap de la diferencia de AUC: ¿es real la brecha?Bootstrap PAREADO sobre el test set: ambos modelos se evalúan sobre los mismos muestreos, lo que aísla la diferencia de calidad del simple ruido de muestreo. Veredicto por intervalo de confianza.
- Varianza de semilla: el mismo modelo entrenado diez vecesDiez entrenamientos idénticos salvo por la semilla cuantifican el ruido propio del modelo: cualquier ganancia de tuning inferior a esta varianza es indistinguible del azar — un garde-fou que se calcula una vez por proyecto.
- SMOTE distorsiona las probabilidades: prueba y correcciónDemostración con cifras: tras el reequilibrado 50/50, las probabilidades predichas son 6 veces demasiado altas. La corrección analítica del prior (Elkan, 2001) las devuelve a la tasa real sin reentrenar.
- Split conformal prediction: un intervalo garantizado al 90%Split conformal prediction en 12 líneas: el cuantil de los residuos de un conjunto de calibración dedicado da un intervalo cuya cobertura está garantizada matemáticamente, sea cual sea el modelo.
- Fuga por duplicados: filas del test ya vistas en el trainHashing de las filas para detectar duplicados exactos entre train y test, y luego AUC recalculada con y sin ellos: la diferencia cuantifica exactamente cuánto se había inflado el score anunciado.
- Labels sospechosos: detección por confianza cruzada (estilo cleanlab)Las predicciones out-of-fold dan la probabilidad que el modelo asigna al label observado: las filas donde esta confianza es ínfima son candidatas a estar mal etiquetadas, ordenadas para revisión humana.
- Null importances: ¿es significativa la importancia?Cincuenta modelos entrenados sobre un target barajado construyen la distribución nula de la importancia de cada feature: solo una importancia real que supera el percentil 95 nulo prueba una señal verdadera.
- Evaluar una señal de trading ML: win rate, profit factor, expectancyEl AUC no paga las facturas: conversión de las probabilidades de un modelo en métricas de trading — número de trades, win rate, profit factor, expectancy y drawdown máximo de la curva de equity.
- Recall a tasa de falsos positivos fija: la métrica de fraudeLectura operativa de la curva ROC: para cada presupuesto de falsos positivos (0.1%, 0.5%, 1%, 5%), el umbral a aplicar, el recall obtenido y el volumen diario de alertas que el equipo deberá absorber.