返回目錄
A
從資料到決策:系統化資料科學實踐手冊 - 第 5 章
5. 模型評估與選擇:從指標到信心
發布於 2026-03-05 17:09
## 5. 模型評估與選擇:從指標到信心
資料科學的核心不只是模型本身,更在於如何正確衡量模型的表現、選擇合適的模型以及持續監控其效能。以下將以一個信用卡欺詐偵測的實務案例為線索,拆解模型評估與選擇的完整流程。
### 5.1 評估指標的哲學
- **準確率**:適用於類別平衡的情況。
- **召回率(Recall)**:對於漏判成本高的領域(如欺詐、疾病診斷)尤為重要。
- **F1 分數**:平衡 Precision 與 Recall,常見於業務場景。
- **ROC‑AUC / PR‑AUC**:評估模型的分離能力,對不平衡資料更為敏感。
> **小技巧**:在不平衡資料集,Precision‑Recall 曲線往往比 ROC 曲線更能反映實際效能。
### 5.2 交叉驗證與分層抽樣
```python
from sklearn.model_selection import StratifiedKFold
X = df.drop(columns='target')
y = df['target']
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
for fold, (train_idx, val_idx) in enumerate(skf.split(X, y)):
X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]
y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]
# 訓練模型...
```
> **注意**:分層抽樣能確保每個 fold 的類別比例與整體相近,避免評估偏差。
### 5.3 參數調整策略
1. **網格搜尋 (Grid Search)**:穩定但計算成本高。
2. **隨機搜尋 (Random Search)**:在大參數空間快速定位。
3. **貝葉斯優化**:利用前一次的結果更新搜尋方向。
```python
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform, randint
param_dist = {
'n_estimators': randint(100, 1000),
'max_depth': randint(3, 15),
'learning_rate': uniform(0.01, 0.3)
}
clf = XGBClassifier(objective='binary:logistic', eval_metric='logloss', seed=42)
search = RandomizedSearchCV(clf, param_distributions=param_dist, n_iter=50,
scoring='f1', cv=skf, random_state=42, n_jobs=-1)
search.fit(X_train, y_train)
```
> **小心**:過度調參可能導致過擬合,必須搭配驗證集監控。
### 5.4 監測與再訓練
模型部署後,實務上往往需要
- **特徵漂移偵測**:利用 KS 測試或漂移指標。
- **預測失效追蹤**:設定閾值自動觸發再訓練。
- **版本管理**:透過 MLflow 或 DVC 保存模型與資料。
### 5.5 案例研究:信用卡欺詐偵測
- **資料**:30 萬筆交易,類別比例 99.5% 正常 / 0.5% 欺詐。
- **特徵**:交易金額、時間、商戶類別、客戶歷史等。
- **模型**:XGBoost、LightGBM、隨機森林混合。
- **評估**:F1 = 0.72,PR‑AUC = 0.68。
- **迭代**:每月重新訓練,並加入新交易類別特徵。
> **經驗談**:在此案例中,模型的召回率比精確率高,因為對於欺詐交易,漏判的成本遠高於誤判。設計 KPI 時務必考量業務邊際。
### 5.6 小結
- **評估指標選擇要對症下藥**:不只是數字,更是業務價值。
- **交叉驗證能提供穩健的性能估計**,尤其在樣本有限時。
- **參數調整需平衡成本與效能**,避免過度擬合。
- **持續監測是模型可用性的關鍵**,漂移與失效必須即時回饋。
> **一句話提醒**:模型的真正價值不在於複雜度,而在於能在實際場景中持續提供正確決策。