返回目錄
A
數據驅動決策:從原始資料到洞察的全流程 - 第 7 章
第 7 章:模型評估、調參與驗證
發布於 2026-02-22 14:56
# 第 7 章:模型評估、調參與驗證
> **核心概念**:\n評估指標定義、交叉驗證流程、參數搜尋方法、過擬合與欠擬合診斷、模型選擇與可解釋性。
## 7.1 交叉驗證(Cross‑Validation)
交叉驗證是評估模型泛化能力的基礎方法,能有效利用有限資料避免過度擬合。
### 7.1.1 K‑fold 交叉驗證
| 步驟 | 說明 |
|------|------|
| 1. | 將資料集拆分為 K 個等大小的子集。 |
| 2. | 迭代 K 次,將第 i 個子集作為驗證集,其餘 K-1 個子集作為訓練集。 |
| 3. | 計算每一次驗證的評估指標,最後取平均作為模型性能。 |
#### Python 範例
python
from sklearn.model_selection import KFold
from sklearn.metrics import roc_auc_score
import numpy as np
X, y = ... # 資料與標籤
kf = KFold(n_splits=5, shuffle=True, random_state=42)
auc_scores = []
for train_idx, val_idx in kf.split(X):
X_train, X_val = X[train_idx], X[val_idx]
y_train, y_val = y[train_idx], y[val_idx]
model = ... # 例如 XGBoost
model.fit(X_train, y_train)
preds = model.predict_proba(X_val)[:, 1]
auc = roc_auc_score(y_val, preds)
auc_scores.append(auc)
print('Mean AUC:', np.mean(auc_scores))
### 7.1.2 留一交叉驗證(Leave‑One‑Out)
適用資料量極小時,每次留一筆作驗證集。計算量大,常用於小型研究或基準測試。
### 7.1.3 交叉驗證注意事項
- **資料泄露**:確保在交叉驗證前完成所有特徵工程(如標準化、離散化)。
- **分層抽樣**:對不平衡資料使用 `StratifiedKFold`,保持類別比例。
- **時間序列**:使用 `TimeSeriesSplit`,避免未來資訊洩漏。
## 7.2 參數搜尋(Hyper‑Parameter Tuning)
### 7.2.1 Grid Search
穩定、易於實作,但計算量隨參數組合數呈指數增長。
python
from sklearn.model_selection import GridSearchCV
param_grid = {
'n_estimators': [100, 200],
'max_depth': [5, 10, None],
'learning_rate': [0.01, 0.1]
}
search = GridSearchCV(model, param_grid, cv=5, scoring='roc_auc')
search.fit(X, y)
print('Best params:', search.best_params_)
### 7.2.2 Random Search
在參數空間內隨機取樣,常比 Grid Search 更快達到接近最佳解。
python
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform
param_dist = {
'n_estimators': [int(x) for x in np.linspace(50, 500, 10)],
'max_depth': [None] + list(range(3, 15)),
'learning_rate': uniform(0.01, 0.2)
}
search = RandomizedSearchCV(model, param_dist, n_iter=50, cv=5, scoring='roc_auc')
search.fit(X, y)
### 7.2.3 Bayesian Optimization
利用先前搜尋結果構造代理函數(如 Gaussian Process),在參數空間中智能尋找最優點。常用庫:`hyperopt`, `optuna`。
python
import optuna
def objective(trial):
params = {
'n_estimators': trial.suggest_int('n_estimators', 50, 500),
'max_depth': trial.suggest_int('max_depth', 3, 15),
'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.3),
}
model = XGBClassifier(**params)
score = cross_val_score(model, X, y, cv=5, scoring='roc_auc').mean()
return score
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)
print('Best trial:', study.best_trial)
## 7.3 過擬合與欠擬合診斷
| 指標 | 過擬合 | 欠擬合 |
|------|--------|--------|
| 訓練集表現 | 高 | 低 |
| 驗證集表現 | 低 | 高 |
### 7.3.1 可視化學習曲線
python
from sklearn.model_selection import learning_curve
import matplotlib.pyplot as plt
train_sizes, train_scores, val_scores = learning_curve(
model, 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, val_scores.mean(axis=1), label='Validation')
plt.xlabel('Training Size')
plt.ylabel('AUC')
plt.legend()
plt.show()
### 7.3.2 其他診斷指標
- **偏差-方差分析**:高偏差=欠擬合;高方差=過擬合。
- **正則化**:L1/L2 係數可控制模型複雜度。
- **Drop‑out / Early Stopping**:對深度模型特別有效。
## 7.4 模型選擇策略
| 類別 | 代表模型 | 適用情境 |
|------|----------|----------|
| 監督式 | Logistic Regression, Random Forest, XGBoost | 大多數二分類、回歸 |
| 時間序列 | ARIMA, Prophet, LSTM | 有序時間資料 |
| 圖形資料 | Graph Neural Network | 連接關係數據 |
#### 實務流程
1. **Baseline**:先跑 Logistic Regression 或 Random Forest。 2. **特徵工程**:再加複雜模型。 3. **參數搜尋**:使用 Random Search + Bayesian。 4. **診斷**:學習曲線、AUC、正則化。 5. **可解釋性**:使用 SHAP / LIME 對最終模型做特徵重要性分析。
## 7.4 模型可解釋性(Model Explainability)
在金融、醫療、法律等高風險領域,需提供「模型為何做出此決策」的證據。
| 工具 | 方式 |
|------|------|
| SHAP | 計算每個特徵對預測的貢獻。 |
| LIME | 在局部區域線性化模型,解釋單筆預測。 |
| 係數視覺化 | 對線性模型直接查看權重大小。 |
### SHAP 範例
python
import shap
explainer = shap.TreeExplainer(best_model)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test)
## 7.5 實務貼士與最佳實踐
1. **保持驗證集獨立**:所有模型選擇、參數搜尋、模型最終評估都必須使用未參與訓練的資料。
2. **分層 K‑fold**:對 1% 正樣本的資料集,使用 `StratifiedKFold` 可提升 AUC。 |
3. **計算資源管理**:在多 GPU/CPU 環境下,使用 `n_jobs=-1` 或 `joblib`。
4. **結果重現性**:在所有隨機過程(如抽樣、模型初始化)中設定 `random_state`。
5. **資料擴增**:對圖像或語音資料,可透過增強方式降低過擬合。 |
## 7.6 章節小結
| 重要概念 | 具體實作 |
|----------|-----------|
| 交叉驗證 | K‑fold / TimeSeriesSplit |
| 參數搜尋 | Grid / Random / Bayesian |
| 診斷指標 | 學習曲線、AUC、正則化 |
| 可解釋性 | SHAP / LIME |
> **結語**:在模型開發中,評估、調參與驗證不僅是技術細節,更是確保業務成功的關鍵。透過科學的流程與實用工具,我們能把「預測」轉化為「可執行的洞察」。下一章將進一步探討將這些模型落地於實際業務流程中的部署與監控策略。