返回目錄
A
數據決策的藝術:從資料蒐集到洞察生成 - 第 6 章
第六章:金融風險模型的特徵衍生與降維
發布於 2026-02-25 06:08
# 第六章:金融風險模型的特徵衍生與降維
> **小貼士**:本章將以「客戶交易行為」資料為例,從原始交易紀錄衍生出「信用分數」特徵,並透過 Lasso + PCA 兩步驟進行特徵選擇與維度縮減。最後,我們將把模型部署到雲端,並討論數據治理與倫理風險。
---
## 6.1 為什麼要衍生信用分數?
在金融業中,**信用分數**是判斷客戶風險的核心指標。傳統上,它依賴於手工設計的指標(如逾期率、欠款額占比等),但這種做法往往靈活度不足、維護成本高。透過 **自動化特徵衍生**,我們能夠更快速、可重複地捕捉客戶行為背後的風險信號。
> 例:對於一筆月交易紀錄,常見衍生特徵包括:
> - **平均交易金額**:`mean(amount)`
> - **交易頻率**:`count(*)/30`
> - **逾期比例**:`sum(is_overdue)/count(*)`
> - **交易金額波動**:`std(amount)`
> - **高頻交易比率**:`sum(amount>threshold)/count(*)`
這些特徵在機器學習模型中往往比原始交易列更具資訊量,也能降低維度,減少噪音。
## 6.2 資料預處理:從交易紀錄到特徵矩陣
```python
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.feature_extraction import DictVectorizer
# 讀取交易資料(假設已經完成資料清洗)
trx = pd.read_csv('transactions.csv')
# 轉成客戶級別的聚合特徵
trx_agg = trx.groupby('customer_id').agg({
'amount': ['mean', 'std', 'sum', 'count'],
'is_overdue': 'mean',
'transaction_date': lambda x: x.max() - x.min()
}).reset_index()
trx_agg.columns = ['customer_id', 'avg_amt', 'std_amt', 'sum_amt', 'trx_cnt', 'overdue_rate', 'trx_span']
# 生成額外的衍生特徵
trx_agg['high_freq_rate'] = (trx_agg['sum_amt'] > 10000).astype(int)
trx_agg['avg_daily_spend'] = trx_agg['sum_amt'] / (trx_agg['trx_span'].dt.days + 1)
# 數值標準化
scaler = StandardScaler()
X_num = scaler.fit_transform(trx_agg[['avg_amt', 'std_amt', 'sum_amt', 'trx_cnt', 'overdue_rate', 'trx_span', 'high_freq_rate', 'avg_daily_spend']])
```
> **提示**:保持所有數值特徵的 **scale** 一致,有助於 Lasso 的正則化效果。
## 6.3 Lasso 特徵選擇:自動剔除冗餘
Lasso(Least Absolute Shrinkage and Selection Operator)在進行線性回歸時,會同時施加 **L1 正則化**,將不重要的係數縮至 0,天然具備特徵選擇功能。這一步能有效剔除與目標變數(如違約率)關聯度低的特徵。
```python
from sklearn.linear_model import LassoCV
from sklearn.pipeline import Pipeline
lasso = Pipeline([
('scaler', StandardScaler()),
('lasso', LassoCV(cv=5, random_state=42))
])
lasso.fit(X_num, y) # y 為客戶違約率
# 取出非零係數對應特徵
import numpy as np
coef = lasso.named_steps['lasso'].coef_
selected_features = np.array(trx_agg.columns[2:])[coef != 0]
print('選擇的特徵:', selected_features)
```
> **批判**:Lasso 只適用於線性關係,若數據存在強烈非線性,效果可能受限。
## 6.4 PCA 降維:去除共線性,提升模型穩定性
即使 Lasso 已經剔除了部分特徵,剩餘特徵之間仍可能存在共線性。透過 **PCA**,我們可以把高維特徵投射到一組正交的主成分上,保留95% 的變異量,從而減少多重共線性的影響。
```python
from sklearn.decomposition import PCA
from sklearn.pipeline import make_pipeline
pca = PCA(n_components=0.95, svd_solver='full')
X_pca = pca.fit_transform(X_num[:, coef != 0])
print(f'PCA 產生 {X_pca.shape[1]} 個主成分,解釋變異量 {pca.explained_variance_ratio_.sum():.4f}')
```
> **注意**:PCA 是無監督的變換,主成分本身缺乏直觀解釋。若需保留可解釋性,可考慮 **Supervised PCA** 或 **Sparse PCA**。
## 6.5 模型構建:回歸 vs 分類
> **實務問題**:金融風險通常以 **違約(Binary)** 或 **違約金額(Regression)** 為目標。這裡以分類為例。
```python
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
rf = RandomForestClassifier(n_estimators=200, random_state=42)
cv_scores = cross_val_score(rf, X_pca, y_binary, cv=5, scoring='roc_auc')
print(f'CV AUC: {cv_scores.mean():.4f}')
```
> **批判**:雖然隨機森林在多數情況下表現優異,但其解釋性較弱。若需要可解釋性,可嘗試 **Gradient Boosting Decision Tree (GBDT)** 搭配 **SHAP** 分析。
## 6.6 部署與監控
### 6.6.1 模型序列化
```python
import joblib
joblib.dump(rf, 'rf_credit_score.pkl')
joblib.dump(pca, 'pca_credit_score.pkl')
```
### 6.6.2 API 部署(FastAPI)
```python
from fastapi import FastAPI, Request
import numpy as np
app = FastAPI()
rf = joblib.load('rf_credit_score.pkl')
pca = joblib.load('pca_credit_score.pkl')
@app.post('/predict')
async def predict(request: Request):
data = await request.json()
X = np.array(data['features']).reshape(1, -1)
X_scaled = pca.transform(X)
pred = rf.predict_proba(X_scaled)[0, 1]
return {'credit_score': float(pred)}
```
### 6.6.3 監控指標
- **概念漂移**:監控 **Mahalanobis 距離** 或 **Population Stability Index (PSI)**。若 PSI > 0.25,說明特徵分佈已發生重大變化。
- **模型漂移**:每月重新計算 **AUC**,若下降 > 5%,須重新訓練。
- **合規性**:確保模型訓練資料不包含任何歧視性特徵(如國籍、性別),並定期進行 **Fairness Audits**。
## 6.7 數據治理與倫理
1. **資料隱私**:交易資料往往包含敏感資訊,必須採用 **差分隱私** 或 **資料偽化** 技術。
2. **解釋性**:金融監管要求模型能被解釋。可使用 **LIME** 或 **SHAP**,將模型輸出轉化為人類可理解的敘述。
3. **持續合規**:隨著監管環境變化(如 GDPR、PDPA),定期更新資料處理流程,確保合規。
---
## 6.8 小結
- **特徵衍生**:從原始交易紀錄到可解釋的信用指標,是提高模型表現的前置條件。
- **Lasso + PCA**:先進行特徵選擇,再進行降維,兼顧可解釋性與計算效能。
- **部署與監控**:模型不是一次性產品,而是需持續迭代與監控的服務。
- **治理與倫理**:數據科學不僅是技術,更是一種責任。
> **前瞻**:下一章將探討如何使用 **時序模型**(如 Prophet、LSTM)處理金融市場數據,並透過 **因果推斷** 改進決策。