聊天視窗

洞察決策:大數據分析實務手冊 - 第 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 測試、漂移檢測到回饋迴圈,為你構建可持續運營的數據驅動產品。