返回目錄
A
數據科學:從原始資料到策略洞察 - 第 6 章
第 6 章:模型評估與驗證
發布於 2026-02-25 11:51
# 第 6 章:模型評估與驗證
> **本章目標**:建立一套科學、可重複、可解釋的評估流程,確保模型在實務環境中的可靠性與效能。
---
## 6.1 何謂模型評估?
| 名稱 | 定義 | 目的 |
|---|---|---|
| **訓練集** | 用來學習參數的資料子集 | 讓模型捕捉資料分佈 |
| **驗證集** | 用來調參與模型選擇的資料子集 | 估算模型泛化表現 |
| **測試集** | 最終用於評估模型表現的資料子集 | 評估實際業務績效 |
評估不是「測試」一次就結束,而是一個循環:**建立 → 調參 → 驗證 → 測試 → 部署**。若缺乏嚴謹的評估,模型可能因過擬合、資料漂移或評價指標不當而失敗。
---
## 6.2 交叉驗證(Cross‑Validation)
交叉驗證是評估模型泛化能力最常用且有效的技術。以下列出三種常見的交叉驗證策略:
1. **k‑fold 交叉驗證**
* 將資料分成 k 個等份,輪流將其中一份作為驗證集,其餘作為訓練集。
* 計算 k 次評估指標的平均值與標準差,反映模型穩定性。
2. **留一交叉驗證(Leave‑One‑Out, LOO)**
* 對於樣本數不多的情況,k 等於樣本數,提供最大利用資料的機會。
3. **時間序列交叉驗證(Time‑Series CV)**
* 適用於時間序列資料,保證訓練集總是在驗證集之前。
### 6.2.1 k‑fold 範例程式碼(Python / scikit‑learn)
```python
from sklearn.model_selection import cross_val_score, KFold
from sklearn.ensemble import RandomForestRegressor
import numpy as np
X, y = load_data()
model = RandomForestRegressor(random_state=42)
cv = KFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=cv, scoring='neg_mean_absolute_error')
print('MAE (CV) :', -np.mean(scores), '±', np.std(scores))
```
---
## 6.3 典型評估指標
| 類型 | 指標 | 適用場景 | 計算方式 |
|---|---|---|---|
| **回歸** | **MAE / MSE / RMSE** | 連續預測 |
| | | | MAE = 1/n Σ|yᵢ - ŷᵢ| |
| | | | MSE = 1/n Σ(yᵢ - ŷᵢ)² |
| | | | RMSE = √MSE |
| **分類** | **Accuracy** | 兩類或多類 |
| | | | Acc = (TP+TN)/N |
| | **Precision / Recall / F1‑Score** | 不平衡類別 |
| | | | Precision = TP/(TP+FP) |
| | | | Recall = TP/(TP+FN) |
| | | | F1 = 2*Precision*Recall/(Precision+Recall) |
| | **ROC‑AUC** | 二分類 |
| | | | AUC = area under ROC curve |
| | **PR‑AUC** | 不平衡二分類 |
| | | | AUC under precision‑recall curve |
| | **Log‑Loss** | 需要概率輸出 |
| | | | LL = -1/n Σ[yᵢ log(pᵢ) + (1-yᵢ) log(1-pᵢ)] |
### 6.3.1 何時使用 ROC‑AUC vs PR‑AUC
- **ROC‑AUC** 對樣本平衡性敏感,若正負類比例接近 1:1,ROC 適用。
- **PR‑AUC** 針對稀疏正類,重視召回率,PR 更能反映模型在少量正類下的表現。
---
## 6.4 置信區間與統計檢驗
評估結果應附帶置信區間,以說明不確定性。常見做法:
- **Bootstrapping**:重複抽樣,計算指標分布,導出 95% 置信區間。
- **Paired t‑test / Wilcoxon**:比較兩模型的 CV 分數,檢驗差異是否顯著。
```python
from sklearn.utils import resample
import numpy as np
scores = []
for _ in range(1000):
X_boot, y_boot = resample(X, y)
score = cross_val_score(model, X_boot, y_boot, cv=cv, scoring='neg_mean_absolute_error')
scores.append(-np.mean(score))
lower = np.percentile(scores, 2.5)
upper = np.percentile(scores, 97.5)
print(f"MAE 95% CI: [{lower:.2f}, {upper:.2f}]")
```
---
## 6.5 召回與精確度的權衡
在業務決策中,往往需要在召回率和精確度之間做權衡。例如:
- **醫療篩檢**:偏向高召回率,避免漏診。
- **廣告點擊預測**:偏向高精確度,降低廣告成本。
使用 **Youden's J** 指標或 **Cost‑Sensitive Learning** 可在模型訓練階段納入權衡。
---
## 6.6 模型校準(Calibration)
尤其在預測概率時,模型的輸出概率往往與真實發生率不一致。校準方法包括:
- **Platt Scaling**:用一層 Logistic 回歸擬合模型輸出。
- **Isotonic Regression**:非參數方法,保持單調性。
```python
from sklearn.calibration import CalibratedClassifierCV
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf_cal = CalibratedClassifierCV(base_estimator=clf, method='isotonic', cv=5)
clf_cal.fit(X, y)
```
---
## 6.7 模型比較框架
| 步驟 | 內容 | 目標 |
|---|---|---|
| 1 | **基準模型** | 先建立簡單模型(如線性迴歸、決策樹)作為基準 | 了解複雜模型提升幅度 |
| 2 | **交叉驗證** | 用同一 CV 方案評估所有模型 | 保持公平性 |
| 3 | **統計檢驗** | 例如 McNemar 檢驗、配對 t‑test | 判斷差異是否顯著 |
| 4 | **成本/效益分析** | 將模型績效轉換為商業指標(ROI) | 決策依據 |
| 5 | **部署可行性** | 考慮計算成本、維運成本 | 綜合評估 |
---
## 6.8 實務建議
1. **盡量使用多種評估指標**:單一指標可能會誤導,例如 Accuracy 可能在不平衡資料中失真。
2. **保證資料分層抽樣**:k‑fold CV 需保證各類別比例一致,避免 CV 結果不穩定。
3. **使用 `scikit‑learn` 的 `Pipeline`**:將特徵轉換、模型、校準串聯起來,避免資料泄漏。
3. **記錄每一次評估結果**:用 `mlflow`、`Weights & Biases` 等工具自動儲存 CV 分數、指標、參數。
4. **在模型訓練時加入資料漂移監控**:使用 `river` 或 `scikit‑evolutionary` 等庫。
5. **與業務同仁討論指標定義**:確保「業務成功」的定義在評估指標中得到體現。
---
## 6.9 小結
本章提供了一套從資料分割、交叉驗證、指標選擇到統計檢驗、校準與模型比較的完整評估流程。透過以下關鍵點,可將模型從「學習」推進到「價值交付」:
- **嚴謹的交叉驗證**,確保模型泛化。
- **多元評估指標**,兼顧回歸與分類、平衡與不平衡資料。
- **統計置信區間**,量化不確定性。
- **校準與成本分析**,將技術績效轉為商業價值。
在下一章中,我們將把這些評估結果納入 **模型部署** 的決策流程,確保模型在真實環境中的持續表現。