聊天視窗

數據決策的藝術:從資料蒐集到洞察生成 - 第 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)處理金融市場數據,並透過 **因果推斷** 改進決策。