返回目錄
A
數據洞察實戰:從數據採集到模型部署的完整路徑 - 第 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、指標、解釋、可視化),再投入模型訓練與部署。
> **提醒**:可解釋性與公平性不是一次性完成的任務,應該融入模型開發生命周期,持續監控與迭代。