聊天視窗

數據洞察:從基礎到實踐的資料科學全書 - 第 7 章

第七章 模型評估、選擇與解釋

發布於 2026-02-28 05:50

# 第七章 模型評估、選擇與解釋 > 本章將帶領讀者從 **評估指標** 到 **模型選擇**,再到 **解釋技術**,幫助你在實務上能夠快速判斷模型好壞、避免過擬合/欠擬合,並將黑盒模型轉為可說明的智慧系統。 ## 7.1 評估指標全覽 | 目標 | 指標 | 適用場景 | 公式範例 | |------|------|----------|----------| | 迴歸 | MSE | 連續預測 | \[ \text{MSE} = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat y_i)^2 \] | 迴歸 | RMSE | 連續預測 | \[ \text{RMSE} = \sqrt{\text{MSE}} \] | 迴歸 | MAE | 連續預測 | \[ \text{MAE} = \frac{1}{n}\sum_{i=1}^{n}|y_i - \hat y_i| \] | 分類 | Accuracy | 二/多分類 | \[ \text{Accuracy} = \frac{\text{TP}+\text{TN}}{\text{Total}} \] | 分類 | Precision | 召回平衡 | \[ \text{Precision} = \frac{\text{TP}}{\text{TP}+\text{FP}} \] | 分類 | Recall | 避免漏判 | \[ \text{Recall} = \frac{\text{TP}}{\text{TP}+\text{FN}} \] | 分類 | F1‑Score | 兩者折中 | \[ \text{F1} = 2\times\frac{\text{Precision}\times\text{Recall}}{\text{Precision}+\text{Recall}} \] | 分類 | AUC‑ROC | 二分類區分 | \[ \text{AUC} = \int_{0}^{1}\text{TPR}(\text{FPR}) d\text{FPR} \] > **備註**:選擇指標時,必須結合商業目標。例如,信用卡詐騙檢測更關注 **Recall** 而非 Accuracy。 ## 7.2 交叉驗證(Cross‑Validation) ### 7.2.1 K‑fold CV 將資料隨機切成 K 個子集,輪流使用 K‑1 個做訓練、剩餘 1 個做驗證,最後平均 K 次評分。 python from sklearn.model_selection import KFold, cross_val_score from sklearn.ensemble import RandomForestClassifier X, y = load_data() clf = RandomForestClassifier(n_estimators=200) kfold = KFold(n_splits=5, shuffle=True, random_state=42) cv_scores = cross_val_score(clf, X, y, cv=kfold, scoring='roc_auc') print('AUC scores:', cv_scores) print('Mean AUC:', cv_scores.mean()) ### 7.2.2 留出法(Hold‑out) 將資料固定比例分為訓練集與測試集,適用於資料量大且計算成本高時。 ### 7.2.3 留一交叉驗證(Leave‑One‑Out, LOOCV) 當樣本量非常小(< 200)時使用。 > **小技巧**:在 `scikit‑learn` 中,`cross_val_score` 內建多種 scoring 指標,利用 `scoring='neg_mean_absolute_error'` 可直接取得 MAE(因為 CV 會最小化負值)。 ## 7.3 過擬合與欠擬合診斷 | 類型 | 症狀 | 檢查方法 | |------|------|----------| | 過擬合 | 訓練精度極高、驗證/測試精度低 | 觀察 CV 結果、學習曲線 | | 欠擬合 | 訓練與驗證精度均低 | 觀察模型複雜度、特徵表現 | ### 7.3.1 學習曲線 python import matplotlib.pyplot as plt from sklearn.model_selection import learning_curve train_sizes, train_scores, valid_scores = learning_curve( clf, X, y, cv=5, scoring='roc_auc', n_jobs=-1 ) plt.plot(train_sizes, train_scores.mean(axis=1), label='Train') plt.plot(train_sizes, valid_scores.mean(axis=1), label='Validation') plt.xlabel('Training Samples') plt.ylabel('AUC') plt.legend() plt.show() > **解讀**:若訓練曲線上升但驗證曲線停滯不前,則為過擬合;若兩曲線都低,則欠擬合。 ## 7.4 特徵重要性與模型解釋 ### 7.4.1 內建重要性(Tree‑Based) python import pandas as pd importances = clf.feature_importances_ feat_names = X.columns feat_importances = pd.Series(importances, index=feat_names).sort_values(ascending=False) print(feat_importances.head(10)) ### 7.4.2 迴歸系數(Linear Models) python coeffs = pd.Series(clf.coef_[0], index=feat_names) print(coeffs.sort_values(ascending=False).head(5)) > **注意**:對於高度共線的特徵,系數可能不可靠。 ## 7.5 SHAP(SHapley Additive exPlanations) SHAP 借用遊戲理論中的 Shapley 值,將模型預測拆解為各特徵的貢獻。 python import shap explainer = shap.TreeExplainer(clf) shap_values = explainer.shap_values(X) # 簡單圖表 shap.summary_plot(shap_values, X) ### 7.5.1 什麼是 Shapley 值? - **公平分配**:將模型預測誤差公平分配給每個特徵。 - **特徵重要性**:可以同時說明整體重要性與單個樣本貢獻。 ### 7.5.2 與 LIME 的比較 | | SHAP | LIME | |---|---|---| | 計算方式 | 線性模型的 Shapley | 近似局部線性 | | 穩定性 | 高 | 低 | | 可擴展性 | 針對樹模型優化 | 隨機 | | 使用難度 | 需要額外安裝 | 直接 import | > **實務建議**:在需要詳細報告與審計時,SHAP 是首選;若只需快速可視化,LIME 亦可滿足需求。 ## 7.6 模型卡(Model Card) - **定義**:一份包含模型描述、訓練環境、數據來源、評估指標、偏差分析、限制條件的文件。 - **格式**:Markdown / YAML / JSON。 markdown # 模型卡示例 ## 1. 模型概述 - **名稱**:Customer Churn Random Forest - **版本**:v1.0.0 - **目標**:預測客戶流失 ## 2. 資料 - **來源**:公司 CRM 系統 - **樣本量**:12,000 - **特徵**:30 ## 3. 評估指標 - **AUC**:0.87 - **Precision**:0.72 - **Recall**:0.65 ## 4. 偏差與限制 - 未考慮季節性波動 - 受訓練資料時期限制 > **部署提醒**:模型卡可直接放入模型倉庫(例如 MLflow、ModelDB)以便版本追蹤。 ## 7.7 實戰案例:信用卡風險評估 | 步驟 | 技術 | 目的 | |------|------|------| | 1. 資料分割 | Stratified K‑Fold | 保持正負樣本比例 | | 2. 特徵工程 | 互動項 + 標準化 | 捕捉非線性關係 | | 3. 模型 | XGBoost | 高性能分類器 | | 4. 評估 | AUC + Recall | 針對風險較高案例優先召回 | | 5. 解釋 | SHAP | 產生樣本層級解釋 | | 6. 模型卡 | Markdown | 供內部審計 | python # 5. 解釋示例 import shap explainer = shap.TreeExplainer(xgb_clf) shap_values = explainer.shap_values(X_test) shap.initjs() shap.force_plot(explainer.expected_value, shap_values[0], X_test.iloc[0]) > **結論**:透過 SHAP 解釋,客戶風險較高的案例常因 *年齡*、*交易頻次* 兩項特徵推高預測值;此資訊可用於設計針對性保留策略。 ## 7.8 小結 - **評估**:選擇合適指標並使用交叉驗證確保模型泛化能力。 - **診斷**:透過學習曲線與特徵重要性判斷過擬合/欠擬合。 - **解釋**:SHAP、LIME 及模型卡為模型透明化與合規審計提供實用工具。 - **實務建議**:結合數據治理流程,將評估、選擇與解釋嵌入開發週期。 > 在下一章,我們將深入探討模型公平性與偏見檢測,了解如何在實際應用中防止不公平決策。