聊天視窗

數據科學:從原始資料到策略洞察 - 第 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 小結 本章提供了一套從資料分割、交叉驗證、指標選擇到統計檢驗、校準與模型比較的完整評估流程。透過以下關鍵點,可將模型從「學習」推進到「價值交付」: - **嚴謹的交叉驗證**,確保模型泛化。 - **多元評估指標**,兼顧回歸與分類、平衡與不平衡資料。 - **統計置信區間**,量化不確定性。 - **校準與成本分析**,將技術績效轉為商業價值。 在下一章中,我們將把這些評估結果納入 **模型部署** 的決策流程,確保模型在真實環境中的持續表現。