聊天視窗

洞悉未來:資料科學決策師的實務指南 - 第 4 章

第4章:從特徵到模型:機器學習的實務選擇

發布於 2026-03-01 14:12

## 第4章:從特徵到模型:機器學習的實務選擇 在前兩章已經完成資料清理與特徵工程的工作,接下來的重點是選擇合適的機器學習模型並將其落地於企業決策。此章將從模型分類、評估指標、驗證方法、部署流程以及實務案例四個面向,為非技術決策者呈現一套完整且易於執行的流程。 --- ### 4.1 模型分類與選擇指引 | 模型類型 | 適用場景 | 主要優點 | 主要風險 | |---|---|---|---| | **線性模型** (Logistic、線性回歸) | 需要可解釋性、資料量大、變數線性關係明顯 | 易於解釋、訓練快、參數少 | 易受異常值影響、非線性關係處理差 | | **樹模型** (Decision Tree、Random Forest、Gradient Boosting) | 需要捕捉非線性、變數類型多樣 | 可解釋、處理缺失值、特徵重要性可視化 | 可能過擬合、模型複雜度高 | | **神經網路** (MLP、CNN、RNN) | 大規模資料、複雜非線性 | 能學習高度抽象特徵 | 訓練成本高、可解釋性差 | | **集成模型** (Bagging、Boosting、Stacking) | 希望提升預測穩定性 | 通常能顯著提升表現 | 需要更多參數調整、解釋困難 | #### 何時選擇哪一類模型 1. **資料量**:資料數量不足時,線性模型或簡單樹模型較為適合;資料量足夠時可考慮集成模型或深度學習。 2. **商業需求**:若需要解釋性(例如合規要求),線性或樹模型更合適;若追求最高預測精度,集成模型或深度學習可先做預實驗。 3. **運算資源**:樹模型在 CPU 上可快速訓練,神經網路則需 GPU;若部署於嵌入式或移動端,需考慮模型尺寸。 ### 4.2 評估指標 | 指標 | 適用場景 | 公式(二分類) | |---|---|---| | **準確率 (Accuracy)** | 樣本分布均衡 | ```text Accuracy = (TP + TN) / (TP + TN + FP + FN) ``` | | **精確率 (Precision)** | 重視錯誤正例成本 | ```text Precision = TP / (TP + FP) ``` | | **召回率 (Recall)** | 重視漏報成本 | ```text Recall = TP / (TP + FN) ``` | | **F1 分數** | 平衡精確率與召回率 | ```text F1 = 2 * (Precision * Recall) / (Precision + Recall) ``` | | **ROC-AUC** | 綜合評估二分類器 | ```text AUC = ``` | | **MSE / RMSE** | 回歸問題 | ```text RMSE = sqrt(mean((y_true - y_pred)^2)) ``` | > **注意**:在不均衡資料下,Accuracy 可能會產生誤導。建議先用 **Precision‑Recall 曲線** 或 **AUC‑PR** 作為主要指標。 ### 4.3 交叉驗證與參數調整 > **交叉驗證**(Cross‑Validation)是評估模型泛化能力的核心手段。以下是實務建議: > > - **K‑Fold CV**:常用 K=5 或 K=10。若資料量極大,使用 **Stratified K‑Fold** 以保證每折的類別比例一致。 > - **時間序列**:使用 **Time‑Series Split**,確保驗證資料永遠在訓練資料之後。 > - **驗證報表**:建議產生 **confusion matrix**、**feature importance**、**partial dependence plots** 等,便於後續解釋。 #### 參數調整工具 | 工具 | 說明 | |---|---| | `GridSearchCV` | 網格搜尋,適合小規模參數空間 | | `RandomizedSearchCV` | 隨機搜尋,適合大規模參數空間 | | `Optuna` | 標準化的 Bayesian 優化,能自動調整步驟 | > **實務提醒**:參數調整時間成本高,建議先用 **RandomizedSearchCV** 掃描大範圍,後續再用 **GridSearchCV** 精細調整。 ### 4.4 模型部署與持續監控 | 步驟 | 工具 | 目的 | |---|---|---| | 1. 模型序列化 | `pickle` / `joblib` / `ONNX` | 將訓練好的模型保存於檔案 | | 2. API 建立 | `FastAPI` / `Flask` | 將模型封裝為可供前端呼叫的 REST 接口 | | 3. 監控 | `Prometheus` + `Grafana` | 追蹤預測延遲、錯誤率、資料漂移 | | 4. 迭代 | CI/CD pipeline (GitHub Actions, GitLab CI) | 自動化模型重訓與部署 | > **監控重點**: > - **輸入資料分佈變化**(Drift):使用 **Kolmogorov‑Smirnov** 檢驗或 **Population Stability Index (PSI)**。 > - **模型性能衰退**:定期評估 AUC、F1 分數,設定閾值觸發重訓。 ### 4.5 案例:客戶流失預測 #### 1. 背景 某電信公司想預測哪些客戶將在下個月離開,預期提前 1‑2 個月發送個性化優惠以降低流失率。 #### 2. 資料描述 - **客戶資料**:年齡、性別、合約期限、使用量、客服呼叫次數、付款方式等。 - **標籤**:`churn`(1/0)。 #### 3. 選擇模型 - 先用 **Random Forest** 進行基線評估: ```python from sklearn.ensemble import RandomForestClassifier rf = RandomForestClassifier(n_estimators=200, max_depth=8, random_state=42) rf.fit(X_train, y_train) ``` - 然後嘗試 **XGBoost**: ```python import xgboost as xgb xgb_model = xgb.XGBClassifier(n_estimators=300, learning_rate=0.05, max_depth=6, subsample=0.8, colsample_bytree=0.8, random_state=42) xgb_model.fit(X_train, y_train) ``` #### 4. 評估結果 | 模型 | Accuracy | Precision | Recall | F1 | AUC | |---|---|---|---|---|---| | Random Forest | 0.84 | 0.78 | 0.70 | 0.74 | 0.88 | | XGBoost | 0.86 | 0.81 | 0.74 | 0.77 | 0.90 | > **決策建議**:採用 XGBoost,因其在召回率與 AUC 上皆優於 Random Forest。根據模型重要性,調整客戶細分策略: > - **高呼叫頻率** 的客戶需要優先關注。 > - **長期合約** 的客戶即使流失風險高,折扣力度仍需控制。 #### 5. 部署示例 ```python import joblib joblib.dump(xgb_model, 'xgb_churn.pkl') ``` 建立 FastAPI 服務: ```python from fastapi import FastAPI import joblib app = FastAPI() model = joblib.load('xgb_churn.pkl') @app.post("/predict/") async def predict(features: dict): df = pd.DataFrame([features]) prob = model.predict_proba(df)[:,1] return {"churn_probability": prob[0]} ``` --- ### 小結 本章以模型選擇、評估、驗證與部署為核心,強調「可操作性」與「可解釋性」。對於非技術決策者,重點在於: 1. **選擇合適的模型類型**,避免「模型即一刀切」的陷阱。 2. **使用合適的評估指標**,防止因資料不均衡而產生誤導。 3. **實行交叉驗證**,確保模型泛化能力。 4. **部署與監控**,確保模型長期有效,並在必要時進行迭代。 通過實務案例,我們見證了從特徵到模型、再到商業落地的完整迴圈。下一章將聚焦於「模型解釋與溝通」,協助決策者將模型洞察轉化為具體策略。