Un entrenamiento que corre una vez en un PC y una app que solo lee lo que ese entrenamiento dejó escrito. Cinco vistas: contenedores, flujos, datos, despliegue y decisiones. Haz clic en cualquier caja; reproduce un flujo para ver el recorrido.
Cada caja es una pieza que corre por separado: un conjunto de scripts, una carpeta de archivos, un servicio o el navegador de quien visita. Las líneas son llamadas reales: protocolo y qué viaja.
Entrenar el torneo tarda minutos y necesita los microdatos, que no se redistribuyen. La app solo necesita la carpeta models/: lee los modelos ya ajustados y dos JSON con todo lo que se muestra. Por eso puede vivir en un hosting gratuito.
feature_schema.json dice qué variables existen y sus rangos; ui_artifacts.json trae lo caro ya calculado. La interfaz no escribe ningún número a mano: si el modelo cambia, el formulario cambia con él.
Los microdatos de la encuesta se descargan del INEI y quedan fuera del repo (data/ está ignorado por git). Lo que se publica son los modelos, que no contienen filas de personas, y los reportes agregados.
| Archivo | Quién lo escribe | Qué contiene |
|---|---|---|
feature_schema.json | scripts 06, 07 y 08, por secciones (guardar_schema) | variables, rangos, opciones, defaults, etiquetas, métricas de test, punto operativo y ablación |
ui_artifacts.json | script 09 | curva de umbral, ROC y PR, calibración, dependencia parcial, importancia por permutación, cohortes y narrativa del torneo |
ui_maquinas.json | script 09 | embudo de filas auditado y tamaños medidos de los artefactos |
regresor_e9.joblib | script 07 | Gradient Boosting con objetivo en logaritmo (TransformedTargetRegressor) |
clasificador_gb.joblib | script 06 | clasificador de informalidad |
clasificador_gb_reducido.joblib | script 08 | variante sin tamaño de empresa ni categoría, de la ablación |
_hiperparametros.json | torneo y clasificador | caché de la búsqueda en grilla; borrarlo fuerza el recálculo |
Todos los JSON se escriben a un archivo temporal y se mueven con os.replace: nunca queda uno truncado.
El entrenamiento se corre en un PC con Windows, con los microdatos descargados a mano. Lo que se versiona son los modelos y los JSON; Streamlit Cloud sirve la app desde el repo público. La página del proyecto en el portafolio enlaza a la demo.
requirements.txtvenvrun.ps1 corre un script de src/ y deja logs en logs/python -udata/raw, fuera de gitdescarga manualtests/pytestmodels/ versionadosin datosapp/streamlit_app.py con requirements.txtStreamlit 1.61.streamlit/config.tomlsin telemetríaQué cambiaría al escalar: pruebas como paso de CI antes de publicar, y los artefactos en un almacén aparte si el repo crece.
| Decisión | Por qué | Descartado |
|---|---|---|
| Formulario dirigido por el schema | Los rangos y opciones salen del pipeline ya ajustado, así que la interfaz no puede desincronizarse del modelo | Declarar cada campo a mano en la app |
| Precomputar lo caro al entrenar | Curva de umbral, dependencia parcial y permutación se calculan una vez y viajan en un JSON de unos 46 KB; la app solo interpola | Recalcular en cada sesión de la nube |
| Verificar antes de escribir | El script 09 recalcula los umbrales desde las probabilidades out-of-fold y aborta sin escribir si no coinciden con los publicados | Confiar en que el schema y la curva siempre coinciden |
| Fragmentos de Streamlit | Mover el control de umbral reejecuta solo ese bloque, no el formulario ni la carga de artefactos | Reejecutar el script entero en cada movimiento |
| Objetivo en logaritmo dentro del artefacto | TransformedTargetRegressor devuelve soles (mediana); la media se obtiene con el factor de smearing publicado en el schema | Que la interfaz maneje logaritmos |
| Caché de hiperparámetros tras cada algoritmo | Si la máquina se cuelga a mitad de una grilla no se pierde lo ya buscado; el regresor se puede reajustar sin repetir el torneo | Guardar la caché solo al final |
| Escritura atómica de JSON | Archivo temporal más os.replace: lo publicado nunca queda a medias | Escribir directo al destino |
| Paletas como datos, no variables CSS | Los gráficos viajan a iframes que no ven el CSS del padre; pasar los colores como parámetro mantiene una sola fuente | Variables CSS y bloques duplicados por tema |
| Microdatos fuera del repo | La app no necesita data/; se enlaza a la fuente del INEI en vez de redistribuirla | Versionar los CSV |