返回目錄
A
數據科學的邏輯與實踐:從基礎到高階決策 - 第 5 章
第 5 章:模型選擇與效能評估:從基礎到複雜模型的落地判斷
發布於 2026-03-06 14:58
# 第 5 章:模型選擇與效能評估:從基礎到複雜模型的落地判斷
> **前言**:在「資料前處理」的階段,我們已經為模型提供了乾淨、可用的特徵。然而,真正能將洞察轉化為決策的,是「模型選擇」與「效能評估」的科學。本文將以實際案例帶領讀者從直覺到數值,逐步掌握模型評估的核心思維。
---
## 5.1 為什麼評估指標不只是一個數字
### 5.1.1 模型「好壞」的多面向
- **準確性**:單純的正確率往往對不平衡資料表現失靈。
- **解釋力**:對業務人員而言,模型能說明什麼才更具價值。
- **部署成本**:複雜模型往往需要更高的計算資源與維護成本。
- **倫理風險**:敏感特徵的偏見會被放大,必須留意公平性指標。
在實務中,常見的三大評估面向為:
| 面向 | 代表指標 | 何時優先考量 |
|------|-----------|--------------|
| 預測表現 | AUC‑ROC / AUC‑PR / RMSE | 當目標是最小化錯誤成本時 |
| 解釋性 | 重要性排序、SHAP | 需要對決策流程進行說明時 |
| 稳定性 | K‑fold CV 的分散度、監控漂移 | 長期監控或自動化時 |
> **小提醒**:選擇評估指標前,先確認 *業務價值* 與 *資料特性*。否則即使模型表現好,也可能造成「精確但無法行動」的尷尬局面。
---
## 5.2 交叉驗證:從留一法到時間序列 CV
### 5.2.1 標準 K‑fold
python
from sklearn.model_selection import KFold
import numpy as np
X = np.random.rand(1000, 20)
y = np.random.randint(0, 2, 1000)
kf = KFold(n_splits=5, shuffle=True, random_state=42)
for fold, (train_idx, test_idx) in enumerate(kf.split(X)):
X_train, X_test = X[train_idx], X[test_idx]
y_train, y_test = y[train_idx], y[test_idx]
# ... 模型訓練、評估
print(f"fold {fold+1}: 參數量 = {len(train_idx)}")
> **注意**:若資料具有時間依賴,隨機洗牌會產生「資料泄漏」。
### 5.2.2 時間序列 CV
python
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)
for fold, (train_idx, test_idx) in enumerate(tscv.split(X)):
X_train, X_test = X[train_idx], X[test_idx]
y_train, y_test = y[train_idx], y[test_idx]
# ... 模型訓練、評估
print(f"fold {fold+1}: 先前數據 = {len(train_idx)}")
> **實務提醒**:在預測未來需求時,時間序列 CV 是「安全選擇」;若資料不含時間,K‑fold 或 StratifiedKFold 更合適。
---
## 5.3 評估指標實戰
以下以「客戶流失預測」為例,說明三種常用指標:
1. **AUC‑ROC**(Receiver Operating Characteristic Area Under Curve)
2. **AUC‑PR**(Precision‑Recall Area Under Curve)
3. **RMSE**(Root Mean Square Error)——適用於迴歸
### 5.3.1 AUC‑ROC
python
from sklearn.metrics import roc_auc_score
y_true = np.array([0, 0, 1, 1])
y_pred_proba = np.array([0.1, 0.4, 0.35, 0.8])
auc = roc_auc_score(y_true, y_pred_proba)
print(f"AUC‑ROC: {auc:.4f}")
> **解讀**:AUC 介於 0.5(隨機)與 1.0(完美)之間;數值越高,模型在正負樣本分離度越好。
### 5.3.2 AUC‑PR
python
from sklearn.metrics import average_precision_score
ap = average_precision_score(y_true, y_pred_proba)
print(f"AUC‑PR: {ap:.4f}")
> **何時使用**:當正類樣本稀少(如 5% 的流失客戶)時,AUC‑PR 能更真實反映模型在正類上的表現。
### 5.3.3 RMSE
python
from sklearn.metrics import mean_squared_error
import numpy as np
y_true = np.array([3.0, -0.5, 2.0, 7.0])
y_pred = np.array([2.5, 0.0, 2.1, 7.8])
rmse = np.sqrt(mean_squared_error(y_true, y_pred))
print(f"RMSE: {rmse:.4f}")
> **提醒**:RMSE 對離群值敏感,若資料含異常點可先進行 robust scaling 或使用 MAE。
---
## 5.4 Bias‑Variance Trade‑off:模型複雜度的藝術
| 低複雜度 | 低偏差 + 高方差 | 可能出現過擬合? |
|----------|----------------|------------------|
| 高複雜度 | 高偏差 + 低方差 | 可能欠擬合? |
### 5.4.1 直覺化圖例
python
import matplotlib.pyplot as plt
import numpy as np
# 生成示例數據
X = np.linspace(-3, 3, 100)
noise = np.random.normal(0, 0.5, 100)
y = X**3 + noise
# 拟合不同阶数多项式
for deg in [1, 3, 9]:
coeff = np.polyfit(X, y, deg)
p = np.poly1d(coeff)
plt.plot(X, p(X), label=f"Degree {deg}")
plt.scatter(X, y, s=10, alpha=0.3)
plt.legend(); plt.show()
> **結論**:選擇「最優」模型不只是追求最低的 RMSE,而是要平衡偏差、方差與實務可行性。
---
## 5.5 模型選擇流程圖(可視化)
mermaid
flowchart TD
A[資料探索] --> B{特徵量化?}
B -- 是 --> C[標準化 / 正規化]
B -- 否 --> D[類別編碼]
C --> E{樣本不平衡?}
D --> E
E -- 是 --> F[採用 SMOTE / 權重調整]
E -- 否 --> G[直接進行模型]
F --> G
G --> H[模型列表:LR, RF, XGB, LGB, NN]
H --> I[交叉驗證]
I --> J{評估指標?}
J --> K[選擇最佳模型]
K --> L[超參數優化]
L --> M[最終模型]
M --> N[部署]
> **提示**:流程圖可用於團隊討論,以確保每一步都有標準化流程。
---
## 5.6 典型案例:行銷活動預測
> **背景**:某電商平台希望預測「是否會點擊特定促銷郵件」。
>
> **資料**:
>
> - 5,000 條紀錄,10 個特徵(時間、地區、消費額、過往點擊、瀏覽行為等)。
>
> **流程**:
>
> 1. **前處理**:缺失值使用多重插補、類別特徵採用 One‑Hot、連續特徵 StandardScaler。
> 2. **特徵選擇**:使用 LightGBM 重要性,挑選 top 8。
> 3. **模型**:試用 Logistic Regression、Random Forest、XGBoost。
> 4. **評估**:採用 AUC‑PR + 召回率,因正類稀少。
> 5. **結果**:XGBoost 取得 AUC‑PR 0.62,優於 LR(0.48)與 RF(0.56)。
>
> **部署**:將 XGBoost 模型封裝至 Docker,FastAPI 提供 `/predict` 端點。
>
> **後續監控**:每週自動收集預測結果與真實標籤,更新模型以應對「概念漂移」。
>
> **教訓**:若僅依賴 AUC‑ROC 可能低估模型在低正類時的實際表現;因此結合多個指標能更全面評估。
---
## 5.7 監控與模型漂移
### 5.7.1 Drift 檢測指標
- **Population Stability Index (PSI)**
- **Kolmogorov‑Smirnov Test**
- **Feature Distribution Shift**(使用 KS、Jensen‑Shannon Divergence)
### 5.7.2 監控流程
1. **資料收集**:每日聚合預測與真實值。
2. **指標計算**:自動化腳本計算 PSI、AUC、召回率。
3. **告警門檻**:如 PSI>0.25 或 AUC下降 >10% 觸發告警。
4. **自動化再訓練**:設定阈值,若告警持續超過 3 天即觸發模型再訓練。
> **小結**:監控不僅是數字的追蹤,更是業務持續改善的關鍵環節。
---
## 5.8 模型倫理與公平性
- **不公平偏見**:特徵如「年齡」或「種族」可能導致模型偏見。
- **公平性指標**:Equal Opportunity, Demographic Parity, AUC‑fairness。
- **緩解策略**:
- 重新加權(Weight of Evidence)
- 生成對抗公平性模型(FairGAN)
- 事後調整閾值
> **實務建議**:在模型選擇初期就納入公平性評估,避免後續調整成本過高。
---
## 5.9 章末小練:實戰模型選擇與評估
1. **挑選一個公開資料集(如 Kaggle Titanic、UCI Adult)**。
2. **設計模型選擇流程**:包含特徵工程、交叉驗證、評估指標選擇。
3. **實作並記錄**:
- 模型表現(AUC / RMSE)
- 時間成本(訓練、驗證)
- 監控方案(PSI、回測)
4. **撰寫 README**:說明流程、結果、心得,並上傳至 GitHub 供同伴參考。
> **提示**:可使用 Google Colab 或 Kaggle Kernels,將 Notebook 轉為 PDF 分享。
---
## 5.10 總結
本章從「為什麼評估指標重要」到「如何實作監控與公平性」,逐步構建一個完整、可重複的模型選擇流程。關鍵在於:
1. **明確業務目標** → **選擇合適的評估指標**
2. **結合資料特性** → **設計適當的驗證策略**
3. **持續監控** → **主動應對漂移**
4. **納入公平性考量** → **確保社會責任**
透過實戰案例,我們見證了「小數據、少時間」亦能產出高質量預測,且能順利落地到 API 服務。期待在下一章,我們將進一步探討「模型部署與可觀測性」的實際操作。
---
> **結語**:模型選擇並非一次性的「最佳答案」,而是一個循環迭代的過程。每一次的「挑選」都是對業務價值的重新定位,對技術品質的再度提升。