聊天視窗

數據洞察實戰:從數據採集到模型部署的完整路徑 - 第 7 章

第七章 模型評估與解釋

發布於 2026-02-27 22:59

# 第七章 模型評估與解釋 本章將帶您深入瞭解如何在實務專案中評估機器學習模型的效能,以及如何用可解釋性工具說明模型的決策邏輯。\n ## 7.1 交叉驗證(Cross‑Validation)\n 交叉驗證是評估模型在未知資料上的泛化能力的基礎方法。常見的變體包括: | 變體 | 目的 | 何時使用 | |------|------|----------| | K‑fold CV | 把資料切成 K 個子集,輪流作為驗證集 | 大部分情境 | Stratified K‑fold | 保留類別比例 | 分類不平衡資料 | TimeSeriesSplit | 對時間序列保持時序 | 時間序列預測 | Leave‑One‑Out (LOO) | 逐個樣本驗證 | 小資料集 ### 範例:5‑fold Stratified CV python from sklearn.model_selection import StratifiedKFold from sklearn.metrics import f1_score from sklearn.ensemble import RandomForestClassifier X, y = load_data() # 你的特徵與標籤 skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42) scores = [] for train_idx, val_idx in skf.split(X, y): clf = RandomForestClassifier(n_estimators=200, random_state=42) clf.fit(X[train_idx], y[train_idx]) preds = clf.predict(X[val_idx]) scores.append(f1_score(y[val_idx], preds)) print('5‑fold Stratified CV F1:', np.mean(scores)) ## 7.2 主要評估指標\n | 指標 | 適用場景 | 計算方式 | 典型值範圍 | |------|----------|-----------|------------| | Accuracy | 多數分類 | (TP+TN)/N | 0–1 | | Precision | 召回高、誤報低 | TP/(TP+FP) | 0–1 | | Recall (Sensitivity) | 召回高、漏報低 | TP/(TP+FN) | 0–1 | | F1‑Score | Precision‑Recall 平衡 | 2\*Precision\*Recall/(Precision+Recall) | 0–1 | | ROC‑AUC | 二分類概率 | AUC of ROC curve | 0.5–1 | | PR‑AUC | 不平衡二分類 | AUC of PR curve | 0–1 | | RMSE / MAE | 回歸 | | R² | 回歸 | > **小貼士**:對於不平衡資料,PR‑AUC 或 F1‑Score 可能比 Accuracy 更能反映真實效能。 ## 7.3 針對不平衡資料的評估技巧\n 1. **重採樣**:過抽樣(SMOTE)、欠抽樣。 2. **成本敏感學習**:在損失函數中加入誤分類成本。 3. **評估時使用分層 CV**:確保驗證集保持類別比例。 4. **使用多指標評估**:同時報告 Accuracy、Recall、PR‑AUC。 ## 7.4 特徵重要性與局部解釋\n ### 7.4.1 變異性重要性(Permutation Importance) python from sklearn.inspection import permutation_importance import pandas as pd result = permutation_importance(clf, X_val, y_val, n_repeats=30, random_state=42) importance_df = pd.DataFrame({'feature': X.columns, 'importance': result.importances_mean}) importance_df.sort_values('importance', ascending=False, inplace=True) print(importance_df.head()) ### 7.4.2 SHAP(SHapley Additive exPlanations) python import shap explainer = shap.TreeExplainer(clf) shap_values = explainer.shap_values(X_test) shap.summary_plot(shap_values, X_test) **SHAP summary plot** 可視化每個特徵對預測的正負影響;**dependence plot** 可觀察特徵值與 SHAP 值的關係。 ### 7.4.3 LIME(Local Interpretable Model‑agnostic Explanations) python import lime.lime_tabular explainer = lime.lime_tabular.LimeTabularExplainer(X_train, feature_names=X.columns, class_names=['0','1'], discretize_continuous=True) exp = explainer.explain_instance(X_test[0], clf.predict_proba, num_features=5) exp.show_in_notebook(show_table=True, show_all=False) > **注意**:LIME 依賴於局部線性擬合,對於高維資料的可解釋性較差,適合單一樣本說明。 ## 7.5 公平性評估(Fairness Metrics)\n | 指標 | 定義 | 受限於 | 典型閾值 | |------|------|--------|--------| | Statistical Parity Difference | 不同群體陽性率差 | 隱私特徵 | < 0.1 | | Equal Opportunity Difference | 真陽性率差 | 隱私特徵 | < 0.1 | | Disparate Impact | 受益比例 | 隱私特徵 | > 0.8 | | Calibration | 置信度校準 | 群體 | 應相近 | > **實務做法**:在模型選擇階段加入公平性評估指標,必要時使用對抗性訓練或重採樣平衡群體分布。 ## 7.6 可解釋性工具整合實務(Python 典型庫)\n | 库 | 功能 | 範例 | |------|------|------| | shap | 全局/局部 SHAP | `shap.summary_plot()` | | lime | 局部解釋 | `explainer.explain_instance()` | | eli5 | 特徵重要性 | `eli5.show_weights()` | | sklearn.inspection | 變異性重要性 | `permutation_importance()` | | scikit‑learn pipelines | 端到端流程 | `Pipeline([...])` | ## 7.7 實戰案例:二手車價格預測\n 1. **資料**:二手車銷售交易資料(特徵:品牌、年份、里程、車況、地區等)。 2. **評估指標**: - **RMSE**:衡量價格預測誤差。 - **R²**:解釋變異度。 3. **可解釋性**: - 用 SHAP 可視化各特徵對單筆預測的影響。 - 透過 Partial Dependence Plot(PDP)觀察里程與價格的非線性關係。 4. **公平性**:檢查不同地區之間的預測偏差,確保模型對全市車輛都給予合理估價。 ## 7.8 小結 - **交叉驗證** 是評估泛化能力的基礎,避免過度擬合。 - **多指標評估** 能更全面反映模型效能,尤其是在不平衡資料下。 - **可解釋性工具**(SHAP、LIME、Permutation Importance)可協助資料科學家說服商業決策者與利益相關者。 - **公平性評估** 讓模型不僅準確,更具社會責任。 - 在實務專案中,建議先建立評估腳本(包含 CV、指標、解釋、可視化),再投入模型訓練與部署。 > **提醒**:可解釋性與公平性不是一次性完成的任務,應該融入模型開發生命周期,持續監控與迭代。