Skip to main content
Glama
agent-risk-ai

agent-risk-ai

by faanogueira

🏦 Agente de Riesgo IA (Agent Risk AI) — ML + MCP Server

Python XGBoost scikit--learn Optuna SHAP MCP Tests License

Agente de Riesgo IA: Su analista autónomo de inteligencia y riesgo de crédito vía MCP. Un modelo de predicción de impago de tarjeta de crédito, entrenado con rigor metodológico (CV estratificada, tuning bayesiano con Optuna, umbral optimizado, explicabilidad vía SHAP) y expuesto como servidor MCP — consultable directamente por Claude Desktop/Code y agentes de IA en lenguaje natural.


📌 Por qué este proyecto es diferente de "solo entrenar un modelo"

La mayoría de los proyectos de portafolio se quedan en entrenar el modelo y mostrar un .ipynb con métricas. Este va un paso más allá: el modelo está encapsulado en un servidor MCP (Model Context Protocol) con 6 herramientas de negocio, lo que significa que cualquier host LLM compatible (Claude Desktop, Claude Code) puede consultar el modelo en lenguaje natural, sin escribir código:

🗣️ "¿Cuál es el riesgo de impago de este cliente: edad 46, ingresos R$107.934, score de crédito 544, 2 impagos anteriores?" 🤖 → llama a predict_default → responde con probabilidad, clase y explicación SHAP.

Esto es exactamente el patrón que está emergiendo en equipos de riesgo/datos que quieren poner modelos de producción "en la conversación", no detrás de un dashboard estático.


Related MCP server: Credit Risk Copilot

🗂️ El problema de negocio

Dataset de 45.528 clientes de tarjeta de crédito con variables demográficas, de ingresos y de comportamiento crediticio. Objetivo: credit_card_default (binario), con desequilibrio real de 8,1% de impagos — escenario típico de riesgo de crédito, donde la precisión ingenua es una métrica engañosa.

Filas de entrenamiento

45.528

Tasa de impago

8,12% (desequilibrado)

Variables originales

17 (+ customer_id, name)

Variables tras ingeniería

30


🏗️ Cómo Funciona el Sistema (Arquitectura Simple)

El proyecto transforma datos brutos de crédito en decisiones accionables y auditables consumidas por agentes de IA a través de 4 etapas integradas:

flowchart LR
    A["📁 1. Dados Brutos<br/><b>train.csv / test.csv</b>"] --> B["🧹 2. Limpeza & Features<br/><b>DTI, Limite, Flags</b>"]
    B --> C["🤖 3. Cérebro Preditivo<br/><b>XGBoost + Optuna + SHAP</b>"]
    C --> D["🔌 4. Servidor MCP<br/><b>6 Ferramentas de Negócio</b>"]
    D --> E["💬 5. Agente de IA<br/><b>Claude / Cursor / LLMs</b>"]

El Flujo en 4 Pasos:

  1. 📁 1. Tratamiento e Inteligencia Financiera (data_processing.py / feature_engineering.py)

    • Elimina datos sensibles (PII) y trata anomalías del dataset (como el centinela de jubilados).

    • Crea indicadores financieros reales: Debt-to-Income (DTI), utilización de límite e ingresos per cápita.

  2. 🤖 2. Pipeline de Machine Learning (pipeline.py / train.py)

    • Ejecuta transformaciones (imputación, one-hot encoding y escala) de forma estanca (sin fuga de datos).

    • Entrena y ajusta el XGBoost vía Optuna (25 trials) en validación cruzada 5-fold, calibrando el umbral de decisión óptimo ($F_1 = 0,875$).

  3. 🧠 3. Explicabilidad y Auditoría (inference.py / evaluate.py)

    • Persiste el modelo ganador y el SHAP TreeExplainer para descomponer exactamente qué variables aumentan o reducen el riesgo de cada cliente en tiempo real.

  4. 🔌 4. Capa Agéntica MCP (mcp_server/server.py)

    • Expone 6 herramientas listas para que cualquier asistente o agente de IA (Claude Desktop, Claude Code, etc.) pueda consultar el modelo, simular escenarios y evaluar carteras enteras en lenguaje natural.


🔬 Ingeniería de features orientada a dominio

En lugar de "echarlo todo al XGBoost", cada feature derivada tiene una justificación de riesgo de crédito explícita:

Feature

Racional de negocio

debt_to_income_ratio (DTI)

Cuánto de los ingresos anuales está comprometido con deuda — pilar clásico de underwriting

credit_limit_to_income_ratio

Apalancamiento concedido relativo a la capacidad de pago

credit_utilization_frac × prev_defaults

Interacción: el uso alto del límite pesa más para quien ya ha tenido impago

income_per_family_member

Ingresos disponibles per cápita, no solo nominales

employment_tenure_ratio

Estabilidad laboral relativa a la edad

risk_flags_sum

Suma de indicadores de riesgo ya observados (impago previo, impago reciente, utilización > 80%)

is_retired_or_unemployed

Flag explícito para el valor centinela (~365.243 días) encontrado en no_of_days_employed, que en realidad marca jubilados/no empleados — tratarlo como número literal distorsionaría el modelo


🧪 Metodología y rigor estadístico

  • Winsorización aprendida solo en el entrenamiento (percentil 99,5%) y reaplicada en el test/holdout — sin fuga de datos.

  • Pipeline sklearn único (ColumnTransformer + modelo) — imputación y encoding se recalculan en cada fold de la validación cruzada, no una sola vez en el dataset completo (error común que infla métricas artificialmente).

  • Métrica de selección: PR-AUC (Average Precision), no ROC-AUC ni exactitud — la elección correcta para 8% de prevalencia de la clase positiva.

  • Holdout de 15% nunca visto durante el tuning del Optuna — las métricas finales siguientes son de generalización real, no de overfitting al proceso de búsqueda.

  • Umbral de decisión recalibrado maximizando F1 en la curva precisión-recall del holdout (0,875), en lugar de usar 0,5 a ciegas — esencial cuando la clase positiva es rara.

  • Explicabilidad vía SHAP TreeExplainer — cada predicción del servidor MCP puede auditarse factor a factor (relevante para el cumplimiento normativo de crédito).


📊 Resultados y Métricas de Rendimiento

Todas las métricas siguientes se calcularon en el conjunto de holdout (6.830 clientes), completamente aislado durante la búsqueda de hiperparámetros con Optuna:

1. Comparativa de Modelos (Validación Cruzada Estratificada 5-Fold)

Modelo

PR-AUC (CV 5-fold)

Ganancia vs Baseline

Regresión Logística (baseline lineal balanceado)

0,9454

—

Random Forest (400 estimadores, balanced subsample)

0,9484

+0,30%

XGBoost + Optuna (25 trials bayesianos TPE)

0,9546

+0,92%


2. Métricas de Rendimiento en el Holdout (Modelo Campeón)

Métrica Estadística y de Negocio

Valor

Interpretación Práctica

ROC-AUC

0,9960

Capacidad discriminativa global casi perfecta entre buenos y malos pagadores.

PR-AUC (Average Precision)

0,9625

Métrica prioritaria para desequilibrio (vs baseline aleatorio de 8,12%).

Índice de Gini (Crédito)

0,9920

$2 \times \text{ROC-AUC} - 1$ — excelente poder de separación de riesgo.

Exactitud Global

98,14%

6.703 predicciones correctas de 6.830 clientes evaluados.

Precisión (Precision / VPP)

96,52%

De cada 100 clientes clasificados como morosos, 96,5 realmente incurren en impago.

Recall / Sensibilidad

80,00%

Captura 8 de cada 10 morosos reales, evitando pérdidas de crédito.

Especificidad (TNR)

99,75%

Preserva el 99,75% de los buenos clientes, garantizando una concesión saludable.

Falsa Alarma (FPR)

0,25%

Solo 16 clientes sanos rechazados por error de 6.275 analizados.

F1-Score

0,8749

Equilibrio armónico óptimo entre precisión y recall.

Umbral de Decisión Optimizado

0,875

Threshold calibrado vía curva PR (vs corte ingenuo de 0,5).


3. Matriz de Confusión Detallada en el Holdout

Real \ Previsto

Pagador (0)

Moroso (1)

Total Real

Impacto en el Negocio de Crédito

Pagador Real (0)

6.259 (TN)

16 (FP)

6.275

Fricción mínima: solo 16 buenos clientes rechazados indebidamente (FPR = 0,25%).

Moroso Real (1)

111 (FN)

444 (TP)

555

Pérdida evitada: 444 impagos bloqueados con éxito (Recall = 80,00%).

Total Previsto

6.370

460

6.830

Tasa de acierto al señalar riesgo: 96,52% de precisión.


4. Hiperparámetros Ganadores (Optuna — 25 Trials)

{
  "n_estimators": 500,
  "max_depth": 4,
  "learning_rate": 0.0121,
  "subsample": 0.7244,
  "colsample_bytree": 0.7301,
  "min_child_weight": 8,
  "gamma": 3.1878,
  "reg_lambda": 3.5388,
  "reg_alpha": 0.0774,
  "scale_pos_weight": 11.3164
}

5. Top 10 Factores de Riesgo Auditables (Importancia Media $|\text{SHAP}|$)

Ranking

Feature

Media $|\text{SHAP}|$

Racional de Riesgo

1º

credit_score

3,3044

Factor dominante: puntuación histórica de burós de crédito.

2º

credit_limit_used(%)

1,8558

Compromiso del límite rotativo concedido.

3º

credit_utilization_frac

0,6122

Fracción decimal de utilización del límite de crédito.

4º

risk_flags_sum

0,1516

Suma ponderada de indicadores de riesgo preexistentes.

5º

prev_defaults

0,1167

Cantidad de ocurrencias de impago previo.

6º

yearly_debt_payments

0,0445

Carga financiera anual comprometida con pagos.

7º

no_of_days_employed

0,0382

Estabilidad laboral y tiempo en el empleo actual.

8º

gender_F

0,0339

Categoría demográfica monitoreada para auditoría.

9º

utilization_x_prev_defaults

0,0266

Interacción: alta utilización combinada con impago pasado.

10º

occupation_type_Unknown

0,0240

Indicador de ocupación no informada / jubilado.

📈 Artefactos Visuales en reports/figures/:

  • roc_curve.png — Curva ROC con línea base aleatoria.

  • precision_recall_curve.png — Curva Precisión-Recall comparada con la prevalencia base.

  • confusion_matrix.png — Matriz de confusión en el umbral óptimo.

  • shap_summary.png — Gráfico de resumen beeswarm de explicabilidad global.

🔒 Todas las métricas anteriores son reproducibles y se guardan en el metadato de auditoría en models/model_metadata.json.


💡 Guía de Interpretación de los Resultados (Para Legos y Negocios)

Para facilitar la comunicación entre científicos de datos, analistas de crédito y directores no técnicos, cada salida del sistema tiene un significado de negocio directo:

1. 📈 Probabilidad de Default (PD) y Rangos de Acción

  • ¿Qué es? La probabilidad estimada (de 0% a 100%) de que el cliente retrase el pago de la factura más de 90 días en los meses siguientes.

  • ¿Cómo actuar según el rango?

    • 🟢 MUY_BAJO (< 5%) y BAJO (5% a 15%): Concesión de crédito y aumento de límite recomendados de forma automática con tasas competitivas.

    • 🟡 MODERADO (15% a 35%): Cliente límite. Se recomienda un límite inicial conservador o solicitar comprobación de ingresos.

    • 🔴 ALTO (35% a 60%) y MUY_ALTO (≥ 60%): Riesgo elevado de impago. Se recomienda rechazo de la propuesta o exigencia de avalistas/garantías reales.

2. 📊 Cómo Leer el Gráfico de Explicabilidad SHAP

  • 🔴 Barras hacia la DERECHA (Contribución Positiva): Factores registrales o de comportamiento que empujan el riesgo hacia ARRIBA (ej: puntuación baja, uso excesivo del límite rotativo, impago previo).

  • 🟢 Barras hacia la IZQUIERDA (Contribución Negativa): Factores saludables que protegen al cliente y empujan el riesgo hacia ABAJO (ej: estabilidad de años en el empleo, ingresos altos, puntuación alta).

  • 📏 Longitud de la Barra: Cuanto más larga sea la barra, más decisiva fue esa variable para el veredicto final de la IA.

3. 📉 ¿Qué es la Simulación What-If?

  • Permite simular el impacto de cambios en reglas o guiar a clientes rechazados. Por ejemplo: "Si reduces la utilización de tu límite del 73% al 30%, tu riesgo bajará del 68% al 22%, permitiendo la aprobación de tu tarjeta."

4. 💰 Exposición Total y Pérdida Esperada de la Cartera

  • Exposición Total: El volumen financiero total que la institución puso en juego (suma de los límites de crédito concedidos).

  • Pérdida Esperada ($PD \times \text{Exposición}$): El valor en Reales que la institución proyecta perder estadísticamente por impago si no se toma ninguna acción.

  • Tasa de Pérdida (%): Base directa para la Provisión para Deudores Dudosos (PDD / IFRS 9).


🔌 El servidor MCP — 6 herramientas de negocio

Herramienta

Uso

predict_default

Probabilidad + clase + rango de riesgo de un cliente

explain_prediction

Principales factores SHAP detrás del puntaje (auditoría/cumplimiento)

what_if_analysis

"¿Y si el límite usado bajara al 30%?" — simulación de política

score_portfolio_csv

Puntaje en lote de un CSV completo en el disco

portfolio_risk_summary

Pérdida esperada (PD × exposición), distribución de riesgo, principales clientes

get_model_performance

Ficha técnica del modelo (métricas, hiperparámetros, características)

Rangos de riesgo usados por el servidor: MUY_BAJO (<5%) · BAJO (5–15%) · MODERADO (15–35%) · ALTO (35–60%) · MUY_ALTO (≥60%).


🌐 Interfaz Web Chat en el Navegador (Streamlit)

El proyecto incluye una interfaz web conversacional completa construida en Streamlit para demostraciones, pruebas rápidas y uso operativo por equipos de crédito y suscripción:

make web
# ou: streamlit run app.py

Accede en tu navegador: http://localhost:8501

✨ Principales Características de la Interfaz Web:

  • 💬 Chat en Lenguaje Natural: Haz preguntas libres sobre clientes, simulaciones o carteras en español.

  • ⚡ Acciones Rápidas (Todos los 5 Rangos de Riesgo): Carga instantáneamente perfiles representativos de cada rango con 1 clic:

    • 🟢 1. Muy Bajo (<5%): Cliente Prime (ingresos altos, puntuación 910, uso de límite 10%).

    • 🟢 2. Bajo (5–15%): Cliente Saludable (puntuación 810, uso de límite 25%, 0 impagos).

    • 🟡 3. Moderado (15–35%): Cliente Límite (puntuación 580, uso de límite 50%, sin retrasos).

    • 🔴 4. Alto (35–60%): Cliente Alerta (puntuación 580, uso de límite 50%, 1 impago reciente).

    • ⛔ 5. Muy Alto (≥60%): Cliente Crítico (puntuación 544, uso de límite 73%, 2 impagos).

  • 🛠️ Cuadrícula de Consultas Sugeridas:

    • 📊 Ficha Técnica: Muestra métricas de validación, ROC-AUC, PR-AUC y precisión.

    • 📁 Cartera CSV: Evalúa carteras completas con puntuación vectorizada de 11.000 clientes en 0,7s, calculando la Pérdida Esperada (R$) y la exposición total.

    • 📉 Simulación What-If: Simula reducciones de límite (30%), liquidación de deudas o aumento de puntuación (+150 puntos).

    • 🔬 Auditoría SHAP: Ranking y gráficos de barras con los mayores impulsores de riesgo de crédito.

  • 💡 Guías Expandibles para Legos: Cada respuesta contiene una leyenda didáctica que explica el significado de los gráficos SHAP, deltas de probabilidad y provisión de pérdidas.


🔌 Opción 2: Servidor MCP (Claude Desktop / Claude Code)

# 1. Instalar dependências
pip install -r requirements.txt --break-system-packages   # ou use um venv

# 2. Treinar o modelo (gera models/*.joblib e model_metadata.json)
python -m src.train

# 3. (Opcional) Gerar os gráficos de avaliação em reports/figures/
python -m src.evaluate

# 4. Rodar os testes
pytest -v

# 5. Subir o servidor MCP (stdio)
python -m mcp_server.server

Conectar a Claude Desktop / Claude Code

Copia mcp_server/claude_desktop_config.example.json al archivo de configuración MCP de tu cliente, ajustando las rutas absolutas:

{
  "mcpServers": {
    "agent-risk-ai": {
      "command": "python",
      "args": ["-m", "mcp_server.server"],
      "cwd": "/caminho/absoluto/para/agent-risk-ai",
      "env": { "PYTHONPATH": "/caminho/absoluto/para/agent-risk-ai" }
    }
  }
}

Reinicia el cliente y pregunta, por ejemplo: "Usando el servidor agent-risk-ai, ¿cuál es el riesgo de este cliente: ..."


📁 Estructura del proyecto

agent-risk-ai/
├── app.py                       # Interface Web Chat conversacional no navegador (Streamlit)
├── data/raw/                    # train.csv, test.csv, sample_submission.csv
├── src/
│   ├── config.py                 # caminhos, sementes, regras de negócio centralizadas
│   ├── data_processing.py        # limpeza (sentinelas, winsorização, PII)
│   ├── feature_engineering.py    # features de domínio (DTI, utilização, tenure...)
│   ├── pipeline.py                # ColumnTransformer sklearn (sem vazamento)
│   ├── train.py                   # baselines + Optuna + XGBoost + SHAP + persistência
│   ├── evaluate.py                # gera gráficos (ROC, PR, confusão, SHAP)
│   └── inference.py                # camada de predição reutilizada pelo MCP e Web Chat
├── mcp_server/
│   ├── server.py                   # servidor MCP com as 6 ferramentas
│   └── claude_desktop_config.example.json
├── models/                         # modelo treinado + metadados (gerado por train.py)
├── reports/figures/                 # gráficos de avaliação (gerado por evaluate.py)
├── tests/test_pipeline.py            # 7 testes unitários (pytest)
├── requirements.txt
├── Makefile
└── README.md

⚠️ Limitaciones conocidas y próximos pasos

La transparencia sobre las limitaciones es parte de hacer ciencia de datos seria:

  • LGD asumida al 100% en el cálculo de pérdida esperada (portfolio_risk_summary) por simplicidad — en producción, esto vendría de datos históricos de recuperación.

  • Sin monitoreo de deriva — el siguiente paso natural sería instrumentar predict_default con registro de distribución de características a lo largo del tiempo.

  • Calibración de probabilidad no fue validada con CalibratedClassifierCV — las probabilidades son discriminativas (buenas para clasificar riesgo), pero pueden no estar perfectamente calibradas en escala absoluta.

  • occupation_type = "Unknown" es la categoría más frecuente (~31% de la base) y coincide con el indicador de jubilados/no empleados — un refinamiento futuro sería desglosar esa categoría.


🧠 Stack técnica

Python 3.12 · pandas · scikit-learn · XGBoost · Optuna (ajuste bayesiano vía TPE) · SHAP (explicabilidad) · matplotlib · pytest · MCP Python SDK


Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Provides AI agents with quantitative risk tools such as VaR, expected shortfall, GARCH volatility, backtesting, stress testing, tail risk analysis, and credit scoring using synthetic or user-supplied data.
    7
    1
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A natural-language interface to a credit risk database, with SQL guardrails that enforce read-only, allowlisted access to tables and columns.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables users to query financial data and compute credit-risk metrics like Altman Z-Score and loan default probability through natural language.
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to run probabilistic portfolio analysis workflows, including input validation, instrument verification, simulation preparation, and approved interactive reporting.
    -