返回目錄
A
AI與金融風險管理:數據科學的實務指南 - 第 4 章
第四章:信用風險預測實戰
發布於 2026-03-06 17:59
# 第四章:信用風險預測實戰
在前三章已建立機器學習的基礎架構,本章將帶領讀者進入信用風險預測的實務領域。以個人貸款、企業債務或信用卡違約為例,我們將從資料前處理、特徵工程、模型構建、評估驗證、可解釋性到部署與監控,完整展示「從論文到線上」的流程。
> **學習目標**
>
> 1. 掌握信用風險預測常用演算法:邏輯回歸、決策樹、XGBoost。 2. 了解各種模型評估指標與交叉驗證技巧。 3. 能夠將模型嵌入合規框架,確保可解釋性與模型治理。 4. 能撰寫實務案例報告並進行部署。
---
## 4.1 信用風險概念與數據特性
| 指標 | 定義 | 例子 |
|------|------|------|
| **違約** | 借款人無法在約定期限內還款 | 逾期 90 天以上且已無還款行為 |
| **違約概率 (PD)** | 未來某段期間內違約的機率 | 透過機器學習預測得到 0.12 |
| **違約損失率 (LGD)** | 違約時損失的資產比例 | 30% |
| **曝險額 (EAD)** | 風險敞口 | 借款本金 |
### 4.1.1 典型資料來源
- **內部信用紀錄**:貸款申請表、還款歷史、帳戶活動。
- **外部信用評分**:征信機構資料、社交媒體行為。
- **結構化財務數據**:公司財務報表、營業額、利潤率。
- **非結構化資料**:客服通話錄音、郵件內容。
> **重點**:金融資料高度敏感,必須嚴格遵守資料隱私與合規規範,實務中常採用「資料遮罩」與「差分隱私」技術。
---
## 4.2 數據前處理
```python
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer
# 讀取資料
df = pd.read_csv('loan_data.csv')
# 1. 產生標籤
# 0: 未違約, 1: 違約
X = df.drop(columns=['default'])
y = df['default']
# 2. 分割訓練/測試集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, stratify=y, random_state=42)
# 3. 缺失值處理
imp = SimpleImputer(strategy='median')
X_train = imp.fit_transform(X_train)
X_test = imp.transform(X_test)
# 4. 標準化(對數學模型如邏輯回歸重要)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
```
> **注意**:對於樹模型(決策樹、XGBoost)不需要標準化,但缺失值處理仍需保留。
---
## 4.3 特徵工程
| 步驟 | 內容 | 工具 | 範例 |
|------|------|------|------|
| **類別編碼** | 對非數值類別進行 One‑Hot 或 Target Encoding | `pandas.get_dummies`, `category_encoders` | `marital_status` → `married`, `single` |
| **交互特徵** | 產生 `income * debt_ratio` 等複合特徵 | `PolynomialFeatures` | |
| **時間特徵** | 提取「逾期天數」的季節性成分 | `pd.to_datetime` | |
| **正則化 / 取對數** | 防止偏態分佈 | `np.log1p` | |
| **特徵選擇** | L1 正則化、Tree Feature Importance | `sklearn.feature_selection` | |
```python
# 例:使用 Target Encoding 來處理 'education'
import category_encoders as ce
encoder = ce.TargetEncoder(cols=['education'])
X_train = encoder.fit_transform(X_train, y_train)
X_test = encoder.transform(X_test)
```
---
## 4.4 模型構建
### 4.4.1 邏輯回歸(Logistic Regression)
邏輯回歸是信用風險最傳統且易於解釋的模型。它假設特徵與對數 odds 之間線性關係。
```python
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score, roc_curve
logreg = LogisticRegression(max_iter=1000, class_weight='balanced')
logreg.fit(X_train, y_train)
# 預測機率
y_pred_prob = logreg.predict_proba(X_test)[:, 1]
print('AUC:', roc_auc_score(y_test, y_pred_prob))
```
> **技巧**:對不平衡資料使用 `class_weight='balanced'` 或 `SMOTE` 等過採樣方法。
### 4.4.2 決策樹(Decision Tree)
決策樹不需標準化,易於解釋。常用來做特徵重要性排序。
```python
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier(max_depth=5, min_samples_leaf=100, random_state=42)
tree.fit(X_train, y_train)
```
### 4.4.3 XGBoost(Gradient Boosting)
XGBoost 在金融領域表現卓越,能處理缺失值並且可調參。
```python
import xgboost as xgb
xgb_clf = xgb.XGBClassifier(
n_estimators=500,
learning_rate=0.05,
max_depth=6,
subsample=0.8,
colsample_bytree=0.8,
objective='binary:logistic',
eval_metric='auc',
reg_lambda=1,
random_state=42
)
xgb_clf.fit(X_train, y_train)
```
---
## 4.5 模型評估
| 指標 | 計算方式 | 解析 | 典型閾值 |
|------|-----------|------|------------|
| **AUC‑ROC** | 分類器分數排序的 ROC 曲線下的面積 | 0.5~1,越大越好 | >0.80(實務) |
| **KS 統計** | 最大距離 between cumulative distribution of positives & negatives | 0~1 | >0.4 |
| **Gini** | 2 * AUC - 1 | | |
| **精確率/召回率** | `precision_recall_curve` | | |
| **F1** | 2 * precision * recall / (precision + recall) | | |
| **Brier Score** | MSE between predicted probability & actual label | 0~1,越小越好 | <0.1 |
```python
from sklearn.metrics import roc_auc_score, precision_recall_curve, f1_score, brier_score_loss
# AUC
auc = roc_auc_score(y_test, y_pred_prob)
print('AUC:', auc)
# KS
fpr, tpr, thresholds = roc_curve(y_test, y_pred_prob)
ks = max(tpr - fpr)
print('KS:', ks)
# F1
y_pred = (y_pred_prob > 0.5).astype(int)
print('F1:', f1_score(y_test, y_pred))
```
> **實務建議**:金融機構通常以 AUC 及 KS 為首要指標,並以 Brier Score 監控概率預測的校準性。
---
## 4.6 驗證與風險控制
### 4.6.1 交叉驗證
```python
from sklearn.model_selection import StratifiedKFold, cross_val_score
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
cv_scores = cross_val_score(logreg, X_train, y_train, cv=skf, scoring='roc_auc')
print('CV AUC:', cv_scores.mean())
```
### 4.6.2 時間序列驗證
信用風險資料往往具有時間依賴,使用「前後切分」驗證。
```python
# 假設 df 中有 'loan_date'
train_end = '2022-12-31'
X_ts_train = X[df['loan_date'] <= train_end]
y_ts_train = y[df['loan_date'] <= train_end]
X_ts_test = X[df['loan_date'] > train_end]
y_ts_test = y[df['loan_date'] > train_end]
```
### 4.6.3 模型風險審核
| 步驟 | 目的 | 範例 |
|------|------|------|
| **可解釋性報告** | 讓風險經理理解模型決策 | `SHAP summary plot` |
| **性能基準** | 確保模型滿足合規門檻 | AUC > 0.80, KS > 0.40 |
| **回測** | 驗證模型在歷史不同市場環境下的穩健性 | `backtest_strategy()` |
---
## 4.7 模型可解釋性
| 工具 | 特色 | 用途 |
|------|------|------|
| **SHAP** | 計算每個特徵對單筆預測的貢獻 | 解釋個案違約原因 |
| **LIME** | 近似局部線性模型 | 交互式解釋 |
| **Partial Dependence Plot (PDP)** | 觀察特徵單變化對預測的影響 | 風險監控 |
```python
import shap
explainer = shap.TreeExplainer(xgb_clf)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test, plot_type='bar')
```
> **合規提示**:金融監管要求模型可解釋性,必須在模型訓練前設計好可解釋性檢查點。
---
## 4.8 部署與持續監控
1. **模型簽名**:使用 `MLflow` 或 `DVC` 追蹤版本、參數、性能指標。
2. **漂移檢測**:利用 `River` 或 `scikit‑detector` 監測輸入特徵與預測分佈漂移。
3. **回測機制**:每月或每季使用最新的歷史資料重新評估模型。
4. **警報**:若 AUC 或 KS 下降 > 5% 立即發送 Slack/Email 通知。
5. **模型再訓練**:設計自動化腳本,根據漂移閾值觸發全量或增量再訓練。
---
## 4.9 案例:某商業銀行信用卡違約預測
| 步驟 | 具體做法 | 結果 |
|------|----------|------|
| **資料** | 200k 申請人,包含 20 個特徵 |
| **特徵工程** | Target Encoding `occupation`, Log‑transform `income` |
| **模型** | XGBoost(n_estimators=800, depth=8) |
| **評估** | AUC 0.867, KS 0.432, F1 0.35 |
| **可解釋性** | SHAP top‑5 features: `payment_ratio`, `credit_history_length`, `age`, `income`, `num_of_defaults` |
| **部署** | MLflow 版本 1.0,線上推論 1.5ms/次 |
| **監控** | 每週檢測特徵漂移,當 KS < 0.40 重新訓練 |
| **合規** | 內部合規審核通過,報告已上傳至合規管理系統 |
---
## 4.10 綜合實務建議
| 類別 | 建議 |
|------|------|
| **模型選擇** | 若解釋性首位,先用邏輯回歸;若追求預測精度,採用 XGBoost。 |
| **數據質量** | 確保資料完整度 > 95%,缺失值 ≤ 5%。 |
| **特徵重要性** | 以 Tree-based importance 為主,並交叉驗證。 |
| **合規檢查** | 在模型訓練流程中嵌入「合規審核」節點,避免後期返工。 |
| **持續學習** | 設計 A/B 測試框架,驗證新模型改進與風險控制。 |
---
## 4.11 章節小結
本章從資料前處理、特徵工程、三種主流模型(邏輯回歸、決策樹、XGBoost)的實作,到模型評估、可解釋性與合規審核,最後探討部署與持續監控的完整流程。透過實際案例與實作範例,讀者可以在實務中快速上手並構建符合監管要求的信用風險預測系統。下一章將聚焦於市場風險量化與情境分析,進一步擴大風險管理範疇。