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を 示すだけで終わります。これはさらに一歩進んでいます。モデルはMCPサーバー (Model Context Protocol)にカプセル化され、6つのビジネスツールを備えているため、 互換性のある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


🏗️ システムの仕組み(シンプルなアーキテクチャ)

このプロジェクトは、生のクレジットデータを、AIエージェントが消費できる実践的かつ監査可能な意思決定へと4つの統合ステージで変換します:

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)を削除し、データセットの異常値(退職者のセンチネル値など)を処理します。

    • 実用的な金融指標を作成:Debt-to-Income(DTI)、限度額利用率、一人当たり収入。

  2. 🤖 2. 機械学習パイプライン(pipeline.py / train.py)

    • 変換(欠損値補完、ワンホットエンコーディング、スケーリング)を漏れなく(データ漏洩なしで)実行します。

    • XGBoostをOptuna(25トライアル)で5分割交差検証により訓練・調整し、最適な決定閾値を較正します($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

名目収入だけでなく、一人当たりの利用可能収入

employment_tenure_ratio

年齢に対する雇用の安定性

risk_flags_sum

既に観察されたリスクフラグの合計(過去の債務不履行、最近の債務不履行、利用率 > 80%)

is_retired_or_unemployed

no_of_days_employed に見られるセンチネル値(約365,243日)の明示的なフラグ。これは実際には退職者・非雇用者を示す — これを数値リテラルとして扱うとモデルが歪む


🧪 方法論と統計的厳密性

  • 訓練データのみで学習したウィンソライズ(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分割交差検証)

モデル

PR-AUC(5分割CV)

ベースライン比の向上

ロジスティック回帰(バランス調整済み線形ベースライン)

0.9454

—

ランダムフォレスト(400推定器、バランス調整済みサブサンプル)

0.9484

+0.30%

XGBoost + Optuna(25トライアルベイズTPE)

0.9546

+0.92%


2. ホールドアウトでのパフォーマンスメトリクス(最優秀モデル)

統計・ビジネスメトリクス

値

実務的解釈

ROC-AUC

0.9960

良質な支払い者と不良な支払い者をほぼ完全に識別する全体的な判別能力。

PR-AUC(Average Precision)

0.9625

不均衡に対する優先メトリクス(ランダムベースライン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スコア

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トライアル)

{
  "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%)。

  • 区分に基づく対応方法:

    • 🟢 MUITO_BAIXO(5%未満)および BAIXO(5%〜15%): 競争力のある金利での自動的な与信付与と限度額引き上げを推奨。

    • 🟡 MODERADO(15%〜35%): 境界線上の顧客。保守的な初期限度額または収入証明の要求を推奨。

    • 🔴 ALTO(35%〜60%)および MUITO_ALTO(60%以上): 債務不履行リスクが高い。申し込みの拒否、または保証人・物的担保の要求を推奨。

2. 📊 SHAP説明可能性グラフの読み方

  • 🔴 右向きのバー(正の寄与): リスクを上昇させる登録情報・行動要因(例:低スコア、リボルビング枠の過剰使用、過去の債務不履行)。

  • 🟢 左向きのバー(負の寄与): 顧客を保護しリスクを低下させる健全な要因(例:長年の雇用安定性、高収入、高スコア)。

  • 📏 バーの長さ: バーが長いほど、その変数がAIの最終判定においてより決定的であったことを示します。

3. 📉 What-Ifシミュレーションとは?

  • ルール変更の影響をシミュレーションしたり、拒否された顧客を導いたりすることができます。例:「限度額の利用率を73%から30%に下げれば、リスクは68%から22%に低下し、カードの承認が可能になります。」

4. 💰 総エクスポージャーとポートフォリオの期待損失

  • 総エクスポージャー: 金融機関がリスクに晒した総資金量(付与されたクレジット限度額の合計)。

  • 期待損失($PD \times \text{エクスポージャー}$): 何も対策を講じない場合に、金融機関が債務不履行により統計的に失うと予測されるレアル建ての金額。

  • 損失率(%): 貸倒引当金(PDD / IFRS 9)の直接的な基礎。


🔌 MCPサーバー — 6つのビジネスツール

ツール

用途

predict_default

1件の顧客の確率+クラス+リスク区分

explain_prediction

スコアの背後にある主要SHAP要因(監査/コンプライアンス)

what_if_analysis

「限度額利用率が30%に下がったら?」— ポリシーシミュレーション

score_portfolio_csv

ディスク上のCSV全体のバッチスコアリング

portfolio_risk_summary

期待損失(PD×エクスポージャー)、リスク分布、上位顧客

get_model_performance

モデルのテクニカルシート(指標、ハイパーパラメータ、特徴量)

サーバーが使用するリスク区分:MUITO_BAIXO(5%未満)・BAIXO(5〜15%)・ MODERADO(15〜35%)・ALTO(35〜60%)・MUITO_ALTO(60%以上)。


🌐 ブラウザ上のWebチャットインターフェース(Streamlit)

このプロジェクトには、Streamlit で構築された完全な対話型Webインターフェースが含まれており、デモ、クイックテスト、信用・引受チームによる運用利用を目的としています:

make web
# ou: streamlit run app.py

ブラウザでアクセス:http://localhost:8501

✨ Webインターフェースの主な機能:

  • 💬 自然言語チャット: 顧客、シミュレーション、ポートフォリオについてポルトガル語で自由に質問できます。

  • ⚡ クイックアクション(全5リスク区分): 1クリックで各区分の代表的なプロフィールを即座に読み込みます:

    • 🟢 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.
    -