返回目錄
A
洞察決策:大數據分析實務手冊 - 第 4 章
第四章:機器學習模型訓練與驗證
發布於 2026-02-28 18:17
# 第四章:機器學習模型訓練與驗證
## 4.1 章節概覽
在上一章,我們已經構築了一套可追溯、合規且高效的資料管線。此時,資料已經乾淨、特徵已經擬定,接下來的重點便是將這些「資料寶藏」轉化為「可執行洞察」——也就是機器學習模型。這一章將帶領你從 **交叉驗證**、**模型調參** 到 **可解釋性**、**公平性** 的全流程,並以實戰案例說明如何在真實商業場景中落地。
> **關鍵字**:交叉驗證、超參數、模型評估、可解釋性、偏差與公平性。
## 4.2 交叉驗證(Cross‑Validation)
### 4.2.1 為什麼要交叉驗證?
- **降低過擬合風險**:一次訓練/測試分割可能因隨機性而導致偏差。
- **獲得更穩健的性能估計**:多次拆分平均可減少樣本不均衡造成的影響。
- **方便超參數搜索**:在每一次驗證中都能同時評估不同參數組合。
### 4.2.2 k‑fold 交叉驗證實作
```python
from sklearn.model_selection import KFold
from sklearn.metrics import accuracy_score
import numpy as np
X, y = data[features], data[target]
kf = KFold(n_splits=5, shuffle=True, random_state=42)
scores = []
for train_idx, val_idx in kf.split(X):
X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]
y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]
model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)
preds = model.predict(X_val)
scores.append(accuracy_score(y_val, preds))
print("Average 5‑fold Accuracy:", np.mean(scores))
```
> **備註**:對於時間序列資料,請使用 **TimeSeriesSplit**,避免資料泄露。
## 4.3 超參數調整(Hyper‑parameter Tuning)
### 4.3.1 搜索策略
| 策略 | 特色 | 何時選擇 |
|------|------|----------|
| 隨機搜索(Random Search) | 隨機抽樣,適合高維參數空間 | 參數多,計算資源有限 |
| 網格搜索(Grid Search) | 完全搜索所有組合 | 參數範圍小、計算量可控 |
| 贝叶斯搜索(Bayesian Optimization) | 機率模型預測最佳點 | 需要更高效搜索、計算複雜 |
### 4.3.2 例子:隨機森林
```python
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint
param_dist = {
'n_estimators': randint(100, 500),
'max_depth': [None, 10, 20, 30],
'min_samples_split': randint(2, 10),
'min_samples_leaf': randint(1, 5),
}
rf = RandomForestClassifier(random_state=42)
search = RandomizedSearchCV(rf, param_dist, n_iter=50, cv=5, scoring='roc_auc', random_state=42, n_jobs=-1)
search.fit(X, y)
print("Best params:", search.best_params_)
print("Best ROC‑AUC:", search.best_score_)
```
## 4.4 可解釋性(Interpretability)
### 4.4.1 為什麼可解釋性重要?
1. **合規需求**:GDPR 等法規要求解釋決策流程。
2. **業務信任**:決策者更願意採用能被說明的模型。
3. **錯誤診斷**:能快速定位模型偏差來源。
### 4.4.2 常用工具
- **SHAP**:全局與局部特徵重要性。
- **LIME**:針對單一樣本提供可解釋輸出。
- **Partial Dependence Plots(PDP)**:展示特徵與預測之間的關係。
```python
import shap
explainer = shap.TreeExplainer(best_rf)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values[1], X_test)
```
> **小提示**:對於高維資料,先做特徵選擇再進行可解釋性分析,能提升可讀性。
## 4.5 公平性評估(Fairness Evaluation)
### 4.5.1 常見公平性指標
| 指標 | 含義 |
|------|------|
| **統計平等**(Statistical Parity) | 受保護群體與對照群體被正確預測比例相同 |
| **真陽性率平等**(Equal Opportunity) | 受保護群體正確預測的比率與對照群體相同 |
| **公平性差距**(Fairness Gap) | 兩組指標差值 |
### 4.5.2 實務操作
```python
from aif360.metrics import BinaryLabelDatasetMetric
from aif360.datasets import BinaryLabelDataset
# 假設 y_true 與 y_pred 已經有對應
# 建立 BinaryLabelDataset
bltd = BinaryLabelDataset(df=data, label_names=["label"], protected_attribute_names=["gender"])
metric = BinaryLabelDatasetMetric(bltd, privileged_groups=[{'gender': 1}], unprivileged_groups=[{'gender': 0}])
print("Statistical Parity Difference:", metric.statistical_parity_difference())
```
> **實務提醒**:公平性往往與模型精度呈現 trade‑off,須根據業務需求決定是否調整。
## 4.6 案例實作:客戶流失預測
1. **問題定義**:預測 30 天內是否流失。
2. **特徵工程**:使用前面章節的特徵選擇方法。
3. **模型選擇**:先試 Logistic Regression、Gradient Boosting、XGBoost。
4. **評估指標**:AUC‑ROC、F1、Fairness Gap。
5. **部署**:將最終模型封裝成 REST API,並持續監控性能。
> **結果摘要**:XGBoost 在 AUC 0.83、F1 0.72,同時 Fairness Gap ≤ 0.04,符合公司合規要求。
## 4.7 小測(選擇題)
1. 在交叉驗證中,若資料存在時間順序,最適合使用哪種拆分方法?
- A) KFold
- B) StratifiedKFold
- C) TimeSeriesSplit
- D) Leave‑One‑Out
2. 下列哪個工具最適合解釋單一樣本的預測原因?
- A) SHAP Summary Plot
- B) LIME
- C) Partial Dependence Plot
- D) Confusion Matrix
3. 若想在模型中降低性別偏見,應優先考量哪個指標?
- A) AUC‑ROC
- B) True Positive Rate for Privileged Group
- C) Statistical Parity Difference
- D) Log Loss
## 4.8 下一章預告
第五章將深入「模型部署與監控」,從容器化、A/B 測試、漂移檢測到回饋迴圈,為你構建可持續運營的數據驅動產品。