返回目錄
A
數據洞察:從基礎到實踐的資料科學全書 - 第 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 及模型卡為模型透明化與合規審計提供實用工具。
- **實務建議**:結合數據治理流程,將評估、選擇與解釋嵌入開發週期。
> 在下一章,我們將深入探討模型公平性與偏見檢測,了解如何在實際應用中防止不公平決策。