Skip to main content
Glama
agent-risk-ai

agent-risk-ai

by faanogueira

🏦 신용위험 AI 에이전트 (Agent Risk AI) — ML + MCP 서버

Python XGBoost scikit--learn Optuna SHAP MCP Tests License

신용위험 AI 에이전트: MCP를 통한 자율 신용 인텔리전스 및 위험 분석가. 엄격한 방법론(층화 교차검증, Optuna 베이지안 튜닝, 최적화된 임계값, SHAP 설명 가능성)으로 훈련된 신용카드 채무불이행 예측 모델을 MCP 서버로 제공 — Claude Desktop/Code 및 AI 에이전트가 자연어로 직접 조회할 수 있습니다.


📌 이 프로젝트가 "모델 훈련만 하는 것"과 다른 이유

대부분의 포트폴리오 프로젝트는 모델을 훈련하고 .ipynb로 지표를 보여주는 데서 그칩니다. 이 프로젝트는 한 단계 더 나아갑니다: 모델이 6개의 비즈니스 도구를 갖춘 MCP 서버(Model Context Protocol)에 캡슐화되어 있어, 호환되는 모든 LLM 호스트 (Claude Desktop, Claude Code)가 코드 작성 없이 자연어로 모델을 조회할 수 있습니다:

🗣️ "이 고객의 채무불이행 위험은 얼마인가요: 나이 46세, 소득 R$107,934, 신용 점수 544, 이전 채무불이행 2건?" 🤖 → predict_default 호출 → 확률, 클래스, SHAP 설명으로 응답.

이것은 정적 대시보드 뒤가 아니라 "대화 속에" 프로덕션 모델을 배치하려는 위험/데이터 팀에서 떠오르고 있는 바로 그 패턴입니다.


Related MCP server: Credit Risk Copilot

🗂️ 비즈니스 문제

45,528명의 신용카드 고객 데이터셋으로 인구통계, 소득, 신용 행동 변수를 포함합니다. 목표 변수: credit_card_default(이진), **실제 불균형 8.1%**의 채무불이행률 — 신용위험의 전형적인 시나리오로, 단순 정확도는 오해를 불러일으키는 지표입니다.

훈련 행 수

45,528

채무불이행률

8.12% (불균형)

원본 변수

17개 (+ customer_id, name)

엔지니어링 후 변수

30개


🏗️ 시스템 작동 방식 (간단한 아키텍처)

이 프로젝트는 원시 신용 데이터를 4단계 통합 프로세스를 통해 AI 에이전트가 소비하는 실행 가능하고 감사 가능한 의사결정으로 변환합니다:

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>"]

4단계 흐름:

  1. 📁 1. 데이터 처리 및 금융 인텔리전스 (data_processing.py / feature_engineering.py)

    • 민감 데이터(PII)를 제거하고 데이터셋의 이상값(은퇴자 센티널 등)을 처리합니다.

    • 실제 금융 지표 생성: 부채-소득 비율(DTI), 한도 사용률, 1인당 소득.

  2. 🤖 2. 머신러닝 파이프라인 (pipeline.py / train.py)

    • 변환(결측값 대체, 원-핫 인코딩, 스케일링)을 격리된 상태로 실행(데이터 누수 없음).

    • Optuna(25 trials)로 XGBoost를 5-fold 교차검증에서 훈련 및 튜닝하고, 최적 결정 임계값을 보정($F_1 = 0.875$).

  3. 🧠 3. 설명 가능성 및 감사 (inference.py / evaluate.py)

    • 최적 모델과 SHAP TreeExplainer를 저장하여 각 고객의 위험을 높이거나 낮추는 정확한 변수를 실시간으로 분해합니다.

  4. 🔌 4. MCP 에이전트 계층 (mcp_server/server.py)

    • 모든 AI 어시스턴트 또는 에이전트(Claude Desktop, Claude Code 등)가 자연어로 모델을 조회하고, 시나리오를 시뮬레이션하며, 전체 포트폴리오를 평가할 수 있는 6개의 도구를 제공합니다.


🔬 도메인 중심 피처 엔지니어링

"모든 것을 XGBoost에 넣기" 대신, 각 파생 피처에는 명시적인 신용위험 근거가 있습니다:

피처

비즈니스 근거

debt_to_income_ratio (DTI)

연간 소득 중 부채로 상환되는 비율 — 언더라이팅의 고전적 핵심 지표

credit_limit_to_income_ratio

상환 능력 대비 부여된 레버리지

credit_utilization_frac × prev_defaults

상호작용: 한도 사용률이 높은 경우 기존 채무불이행 이력이 있는 고객에게 더 큰 가중치

income_per_family_member

명목 소득이 아닌 1인당 가용 소득

employment_tenure_ratio

나이 대비 고용 안정성

risk_flags_sum

이미 관찰된 위험 플래그 합계(이전 채무불이행, 최근 채무불이행, 사용률 > 80%)

is_retired_or_unemployed

no_of_days_employed에서 발견된 센티널 값(~365,243일)에 대한 명시적 플래그 — 실제로는 은퇴자/비고용자를 나타내며, 이를 숫자 그대로 처리하면 모델이 왜곡됨


🧪 방법론 및 통계적 엄격성

  • 훈련 데이터에서만 학습된 Winsorization(99.5 백분위수)을 테스트/홀드아웃에 재적용 — 데이터 누수 없음.

  • 단일 sklearn 파이프라인(ColumnTransformer + 모델) — 결측값 대체와 인코딩이 전체 데이터셋에 한 번만 적용되는 것이 아니라 교차검증의 각 폴드마다 재계산됩니다 (지표를 인위적으로 부풀리는 흔한 오류).

  • 선택 지표: PR-AUC (Average Precision) — ROC-AUC나 정확도가 아닌, 양성 클래스 비율 8%에 대한 올바른 선택.

  • Optuna 튜닝 중 전혀 보지 못한 15% 홀드아웃 — 아래 최종 지표는 검색 과정에 대한 과적합이 아닌 실제 일반화 성능입니다.

  • 결정 임계값 재보정 — 양성 클래스가 희소할 때 필수적인, 홀드아웃의 정밀도-재현율 곡선에서 F1을 최대화(0.875)하는 임계값을 맹목적인 0.5 대신 사용.

  • SHAP TreeExplainer를 통한 설명 가능성 — MCP 서버의 각 예측은 요인별로 감사 가능(신용 규제 준수에 중요).


📊 결과 및 성능 지표

아래 모든 지표는 Optuna의 하이퍼파라미터 탐색 중 완전히 격리된 홀드아웃 세트(6,830명 고객) 에서 계산되었습니다:

1. 모델 비교 (층화 5-Fold 교차검증)

모델

PR-AUC (CV 5-fold)

Baseline 대비 개선

로지스틱 회귀 (균형 조정된 선형 baseline)

0.9454

—

Random Forest (400 추정기, balanced subsample)

0.9484

+0.30%

XGBoost + Optuna (25회 베이지안 TPE trials)

0.9546

+0.92%


2. 홀드아웃 성능 지표 (최적 모델)

통계 및 비즈니스 지표

값

실무적 해석

ROC-AUC

0.9960

우량/불량 채무자 구분의 전반적 판별력이 거의 완벽.

PR-AUC (Average Precision)

0.9625

불균형에 대한 우선 지표 (무작위 baseline 8.12% 대비).

지니계수 (신용)

0.9920

$2 \times \text{ROC-AUC} - 1$ — 탁월한 위험 분리 능력.

전체 정확도

98.14%

평가된 6,830명 중 6,703건의 예측 정확.

정밀도 (Precision / PPV)

96.52%

채무불이행자로 분류된 고객 100명 중 96.5명이 실제로 채무불이행.

재현율 / 민감도

80.00%

실제 채무불이행자 10명 중 8명을 포착, 신용 손실 방지.

특이도 (TNR)

99.75%

우량 고객의 99.75%를 보존, 건전한 대출 실행 보장.

오탐률 (FPR)

0.25%

분석된 6,275명 중 건강한 고객 16명만 오류로 거절.

F1-Score

0.8749

정밀도와 재현율 간 최적의 조화 균형.

최적화된 결정 임계값

0.875

PR 곡선을 통해 보정된 임계값 (단순 0.5 기준 대비).


3. 홀드아웃 상세 혼동 행렬

실제 \ 예측

우량 (0)

채무불이행 (1)

실제 합계

신용사업 영향

실제 우량 (0)

6,259 (TN)

16 (FP)

6,275

최소 마찰: 부당하게 거절된 우량 고객 16명에 불과 (FPR = 0.25%).

실제 채무불이행 (1)

111 (FN)

444 (TP)

555

방지된 손실: 444건의 채무불이행을 성공적으로 차단 (재현율 = 80.00%).

예측 합계

6,370

460

6,830

위험 경고 시 적중률: 정밀도 96.52%.


4. 최적 하이퍼파라미터 (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. 감사 가능한 상위 10대 위험 요인 (평균 $|\text{SHAP}|$ 중요도)

순위

특성

평균 $|\text{SHAP}|$

위험 근거

1위

credit_score

3,3044

지배적 요인: 신용평가기관의 과거 점수.

2위

credit_limit_used(%)

1,8558

부여된 회전 한도의 사용률.

3위

credit_utilization_frac

0,6122

신용 한도 사용률의 소수 비율.

4위

risk_flags_sum

0,1516

기존 위험 플래그의 가중 합계.

5위

prev_defaults

0,1167

과거 채무불이행 발생 건수.

6위

yearly_debt_payments

0,0445

지불에 사용되는 연간 재정 부담.

7위

no_of_days_employed

0,0382

고용 안정성 및 현재 직장 근속 기간.

8위

gender_F

0,0339

감사 목적으로 모니터링되는 인구통계 범주.

9위

utilization_x_prev_defaults

0,0266

상호작용: 과거 채무불이행과 결합된 높은 사용률.

10위

occupation_type_Unknown

0,0240

미보고 직업 / 은퇴자 플래그.

📈 시각적 산출물은 reports/figures/에 있습니다:

  • roc_curve.png — 무작위 기준선이 포함된 ROC 곡선.

  • precision_recall_curve.png — 기본 유병률과 비교한 정밀도-재현율 곡선.

  • confusion_matrix.png — 최적 임계값에서의 혼동 행렬.

  • shap_summary.png — 전역 설명 가능성의 Beeswarm 요약 플롯.

🔒 위의 모든 지표는 재현 가능하며 models/model_metadata.json의 감사 메타데이터에 저장됩니다.


💡 결과 해석 가이드 (비전문가 및 비즈니스 담당자용)

데이터 과학자, 신용 분석가, 비기술 임원 간의 커뮤니케이션을 원활하게 하기 위해, 시스템의 각 출력은 직접적인 비즈니스 의미를 갖습니다:

1. 📈 채무불이행 확률(PD) 및 조치 구간

  • 정의: 고객이 향후 수개월 내에 청구서 결제를 90일 이상 지연할 추정 확률(0%~100%).

  • 구간별 조치 방법:

    • 🟢 매우 낮음 (< 5%) 및 낮음 (5%~15%): 경쟁력 있는 금리로 신용 부여 및 한도 증액을 자동으로 권장.

    • 🟡 중간 (15%~35%): 경계선 고객. 보수적인 초기 한도 또는 소득 증빙 요청 권장.

    • 🔴 높음 (35%~60%) 및 매우 높음 (≥ 60%): 채무불이행 위험이 높음. 제안 거절 또는 연대보증인/실물 담보 요구 권장.

2. 📊 SHAP 설명 가능성 그래프 읽는 방법

  • 🔴 오른쪽 막대(긍정 기여): 위험을 높이는 등록 또는 행동 요인 (예: 낮은 점수, 회전 한도 과다 사용, 과거 채무불이행).

  • 🟢 왼쪽 막대(부정 기여): 고객을 보호하고 위험을 낮추는 건전한 요인 (예: 수년간의 고용 안정성, 높은 소득, 높은 점수).

  • 📏 막대 길이: 막대가 길수록 해당 변수가 AI의 최종 판정에 더 결정적이었음을 의미합니다.

3. 📉 What-If 시뮬레이션이란?

  • 규칙 변경의 영향을 시뮬레이션하거나 거절된 고객을 안내하는 데 사용됩니다. 예: "신용 한도 사용률을 73%에서 30%로 낮추면 위험이 68%에서 22%로 낮아져 카드 승인이 가능해집니다."

4. 💰 총 노출 및 포트폴리오 기대 손실

  • 총 노출: 기관이 노출시킨 총 금융 규모(부여된 신용 한도의 합계).

  • 기대 손실 ($PD \times \text{노출}$): 아무 조치도 취하지 않을 경우 기관이 채무불이행으로 인해 통계적으로 손실할 것으로 예상되는 금액(헤알).

  • 손실률(%): 대손충당금(PDD / IFRS 9)의 직접적인 근거.


🔌 MCP 서버 — 비즈니스 도구 6종

도구

용도

predict_default

한 고객의 확률 + 등급 + 위험 구간

explain_prediction

점수 배후의 상위 SHAP 요인(감사/컴플라이언스)

what_if_analysis

"사용 한도가 30%로 낮아지면?" — 정책 시뮬레이션

score_portfolio_csv

디스크의 전체 CSV 일괄 점수 산정

portfolio_risk_summary

기대 손실(PD × 노출), 위험 분포, 상위 고객

get_model_performance

모델 기술 문서(지표, 하이퍼파라미터, 특성)

서버에서 사용하는 위험 구간: 매우 낮음 (<5%) · 낮음 (5–15%) · 중간 (15–35%) · 높음 (35–60%) · 매우 높음 (≥60%).


🌐 브라우저 웹 채팅 인터페이스 (Streamlit)

이 프로젝트에는 Streamlit으로 구축된 완전한 대화형 웹 인터페이스가 포함되어 있어, 신용 및 언더라이팅 팀의 데모, 빠른 테스트, 운영 사용에 적합합니다:

make web
# ou: streamlit run app.py

브라우저에서 접속하세요: http://localhost:8501

✨ 웹 인터페이스 주요 기능:

  • 💬 자연어 채팅: 포르투갈어로 고객, 시뮬레이션 또는 포트폴리오에 대해 자유롭게 질문하세요.

  • ⚡ 빠른 실행(전체 5개 위험 구간): 클릭 한 번으로 각 구간의 대표 프로필을 즉시 불러옵니다:

    • 🟢 1. 매우 낮음 (<5%): 프라임 고객(고소득, 점수 910, 한도 사용률 10%).

    • 🟢 2. 낮음 (5–15%): 건전 고객(점수 810, 한도 사용률 25%, 채무불이행 0건).

    • 🟡 3. 중간 (15–35%): 경계선 고객(점수 580, 한도 사용률 50%, 연체 없음).

    • 🔴 4. 높음 (35–60%): 경고 고객(점수 580, 한도 사용률 50%, 최근 채무불이행 1건).

    • ⛔ 5. 매우 높음 (≥60%): 위기 고객(점수 544, 한도 사용률 73%, 채무불이행 2건).

  • 🛠️ 추천 질문 그리드:

    • 📊 기술 문서: 검증 지표, ROC-AUC, PR-AUC 및 정확도 표시.

    • 📁 CSV 포트폴리오: 벡터화된 점수 산정으로 11,000명의 고객을 0.7초에 평가하고 기대 손실(R$) 및 총 노출 계산.

    • 📉 What-If 시뮬레이션: 한도 축소(30%), 부채 상환 또는 점수 상승(+150점) 시뮬레이션.

    • 🔬 SHAP 감사: 신용 위험의 주요 동인에 대한 순위 및 막대 그래프.

  • 💡 비전문가용 확장 가이드: 각 응답에는 SHAP 그래프, 확률 변화 및 손실 충당금의 의미를 설명하는 교육용 범례가 포함됩니다.


🔌 옵션 2: 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

Claude Desktop / Claude Code에 연결

mcp_server/claude_desktop_config.example.json을 클라이언트의 MCP 구성 파일로 복사하고 절대 경로를 조정하세요:

{
  "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" }
    }
  }
}

클라이언트를 다시 시작하고 예를 들어 다음과 같이 질문하세요: "agent-risk-ai 서버를 사용하여 이 고객의 위험은 무엇입니까: ..."


📁 프로젝트 구조

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

⚠️ 알려진 제한 사항 및 향후 과제

제한 사항에 대한 투명성은 진지한 데이터 과학의 일부입니다:

  • 기대 손실 계산에서 LGD를 100%로 가정(portfolio_risk_summary) — 단순화를 위한 것이며, 실제 운영에서는 과거 회수 데이터에서 도출되어야 합니다.

  • 드리프트 모니터링 없음 — 다음 자연스러운 단계는 시간에 따른 특성 분포 로깅을 predict_default에 계측하는 것입니다.

  • 확률 보정은 CalibratedClassifierCV로 검증되지 않았습니다 — 확률은 판별적(위험 순위 지정에 유용)이지만 절대 규모에서 완벽하게 보정되지 않을 수 있습니다.

  • occupation_type = "Unknown" 은 가장 빈번한 범주(기준의 약 31%)이며 은퇴자/비고용 플래그와 일치합니다 — 향후 개선 사항은 이 범주를 세분화하는 것입니다.


🧠 기술 스택

Python 3.12 · pandas · scikit-learn · XGBoost · Optuna (TPE 기반 베이지안 튜닝) · SHAP (설명 가능성) · 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.
    -