返回目錄
A
資料科學實戰:從數據到決策的完整流程 - 第 5 章
第五章:建模與模型評估
發布於 2026-03-04 21:41
# 第五章:建模與模型評估
## 5.1 從洞察到模型
在上一章,我們透過 EDA 對週末促銷的數據進行了多角度分析,並提出了可操作的商業建議。接下來的任務是將這些洞察轉化為可量化的預測能力,進而支持決策。
> **關鍵提醒**:模型的好壞不僅取決於預測精度,更取決於其可解釋性、可維護性與實務落地的成本。這也是資料科學團隊在實務中常遇到的三難。
## 5.2 特徵工程:把業務邏輯編碼
1. **日期特徵**:將 `date` 轉成 `week_day`、`is_weekend`、`month`、`holiday_flag` 等;
2. **價格指標**:除原始 `price` 外,計算 `price_change_pct`、`discount_rate`;
3. **銷售趨勢**:使用滾動窗口計算過去 7 天、30 天的平均銷售量,作為滯後特徵;
4. **促銷組合**:編碼 `promo_type`(折扣、贈品、滿額免運等),並與 `is_weekend` 交叉成 `promo_weekend`;
5. **商品屬性**:將 `category`、`sub_category` One‑Hot 編碼,或使用 CatBoost 內建處理。
> **實戰小技巧**:對於大類別變數,先使用 `sklearn.preprocessing.OrdinalEncoder` 進行編碼,再利用 `sklearn.compose.ColumnTransformer` 只對數值特徵做標準化。
## 5.3 模型選擇策略
| 模型 | 優勢 | 劣勢 | 適用場景 |
|------|------|------|----------|
| **線性回歸** | 易解釋,計算量低 | 對非線性關係表現差 | 初步驗證、基線建模 |
| **決策樹 / 隨機森林** | 免標準化,可處理非線性 | 易過擬合,特徵重要性偏差 | 中小規模、特徵多樣 |
| **梯度提升機 (XGBoost / LightGBM)** | 高精度,處理缺失值好 | 訓練時間長,參數多 | 大規模、複雜關係 |
| **神經網路 (多層感知器)** | 可擬合極其複雜模式 | 需要大量數據與計算資源 | 非結構化、極大規模 |
> **實務建議**:先以線性回歸作為基線,評估 R²、MAE;若表現不滿意,逐步升級到樹模型,再嘗試 XGBoost;最後在需要極致準確且數據足夠時再考慮深度學習。
## 5.4 評估指標
- **R² (決定係數)**:衡量解釋變異比例。
- **MAE / MAPE**:直觀衡量預測誤差,對異常值不敏感。
- **RMSE**:更重視大誤差,適合風險評估。
- **Cross‑Validation**:k‑fold 或時間序列 split,避免數據泄露。
- **特徵重要性**:對於樹模型可直接提取;對於線性模型可觀察係數大小。
python
from sklearn.model_selection import TimeSeriesSplit, cross_val_score
from sklearn.metrics import r2_score, mean_absolute_error
tscv = TimeSeriesSplit(n_splits=5)
for train_idx, test_idx in tscv.split(X):
X_train, X_test = X.iloc[train_idx], X.iloc[test_idx]
y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
model.fit(X_train, y_train)
preds = model.predict(X_test)
print('R²:', r2_score(y_test, preds))
print('MAE:', mean_absolute_error(y_test, preds))
## 5.5 超參數調優
- **網格搜尋 (GridSearchCV)**:穩定但計算量大;
- **隨機搜尋 (RandomizedSearchCV)**:效率高,適合大參數空間;
- **貝葉斯優化 (Optuna, Hyperopt)**:可探索非結構化參數。
> **案例**:對 XGBoost,常調整 `max_depth`、`learning_rate`、`n_estimators`、`subsample` 等;同時監控 **AUC‑PR** 以應對銷售量長尾分佈。
## 5.6 模型解釋與公平性
1. **SHAP 值**:提供全局與局部解釋;可視化特徵對預測的貢獻。
2. **LIME**:針對單一樣本進行局部解釋。
3. **公平性指標**:如平均差異、受保護屬性分組對比;對於銷售預測,通常不涉及人群特徵,但若涉及消費者屬性,必須留意。
python
import shap
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test)
## 5.7 模型部署前的檢查
| 步驟 | 重點 |
|------|------|
| **性能穩定性** | 透過滑動窗口檢查預測漂移 |
| **資源消耗** | 估計推論延遲與記憶體需求 |
| **安全性** | 防止模型被逆向工程或數據洩漏 |
| **合規性** | 確認使用的數據符合 GDPR / 個資法規 |
> **部署工具**:使用 `mlflow` 追蹤實驗、`docker` 打包、`FastAPI` 提供 REST API;若需批量推論,可考慮 `AWS SageMaker` 或 `GCP Vertex AI`。
## 5.8 案例回顧:週末促銷銷售預測
- **目標**:預測週末每個商品的銷售額,協助決定折扣幅度與庫存調整。
- **特徵**:前 30 天平均銷售、當前折扣率、是否為節日、類別 One‑Hot。
- **模型**:LightGBM,最終 MAPE < 12%。
- **商業效果**:經過模型導向的折扣調整,ROI 提升 15%。
## 5.9 結語
- **循環迭代**:模型不是一次完成的,而是需要在新數據到來時持續更新與評估。
- **跨部門協作**:業務、IT、法務等團隊應共同參與模型開發與部署。
- **未來展望**:隨著時序資料的增多,預測模型將逐步融合強化學習、時序圖神經網路等前沿技術。
> **最終提示**:在資料科學的道路上,技術永遠是手段,洞察力與商業價值才是最終目的。祝你在建模旅程中不斷創造價值!