返回目錄
A
數據科學的邏輯與實踐:從基礎到高階決策 - 第 3 章
第三章:模型選擇與評估——從機器學習到深度學習的橋樑
發布於 2026-03-06 14:09
# 第三章:模型選擇與評估
## 1. 引言
在上一章中,我們已經掌握了資料前處理、描述統計與基礎假設檢定的工具。接下來,我們將步入機器學習的核心:**模型選擇**與**評估**。這一步驟不僅關乎算法的技術細節,更是決策品質與業務價值的關鍵。為了讓概念與實務相結合,本章將以 **零售銷售預測** 為案例,從特徵工程、模型訓練到性能指標,全面呈現模型選擇的全流程。
> *「好的模型像是一座橋,若建得不夠堅固,則無法載載企業的決策重量。」* — 墨羽行
## 2. 模型選擇的策略
| 步驟 | 目的 | 典型工具 | 建議實踐 |
|------|------|----------|-----------|
| 2.1 特徵選擇 | 去除噪音、提升可解釋性 | Recursive Feature Elimination、L1 正則化 | 先從業務知識出發,再用模型幫助調整 |
| 2.2 模型基準 | 先評估最簡單模型的表現 | 线性回归、决策树 | 建立「零模型」基準,衡量改進幅度 |
| 2.3 高階模型 | 提升預測精度 | 隨機森林、Gradient Boosting、XGBoost、LightGBM | 針對資料特性選擇適當演算法 |
| 2.4 深度學習 | 處理大規模非結構化資料 | LSTM、CNN、Transformer | 需大量資料與算力,並非所有情境都適用 |
| 2.5 模型融合 | 結合多模型優勢 | Stacking、Blending、Ensemble Averaging | 兼顧精度與泛化風險 |
> **關鍵提醒**:模型選擇不是一次性決策,而是**迭代**的過程。每次改動都要回到性能指標評估,確保沒有「過度擬合」或「過度簡化」。
## 3. 評估指標的解讀
### 3.1 回歸問題
| 指標 | 計算方式 | 解讀 |
|------|----------|------|
| RMSE (Root Mean Square Error) | √\frac{1}{n}\sum_{i=1}^n (y_i - \hat{y}_i)^2 | 反映預測誤差的標準差,單位與原始變數相同 |
| MAE (Mean Absolute Error) | \frac{1}{n}\sum_{i=1}^n |y_i - \hat{y}_i| | 更不受極端值影響,易於解釋 |
| R² | 1 - \frac{SS_{res}}{SS_{tot}} | 表示解釋變異比例,介於 0~1 之間 |
### 3.2 分類問題
| 指標 | 公式 | 解讀 |
|------|------|------|
| Accuracy | \frac{TP + TN}{TP + TN + FP + FN} | 總體正確率,對類別不平衡敏感 |
| Precision | \frac{TP}{TP + FP} | 真正例比例,關注誤報 |
| Recall | \frac{TP}{TP + FN} | 真正例召回率,關注漏報 |
| F1-Score | 2 \times \frac{Precision \times Recall}{Precision + Recall} | 平衡 Precision 與 Recall |
| AUC‑ROC | 曲線下的面積 | 評估分類閾值選擇的彈性 |
> **實務提示**:在零售預測中,我們通常關注 **RMSE** 與 **MAE**,而不是單純的 **R²**,因為業務決策更關注實際金額差異。
## 4. 案例實作:零售銷售預測
以下示例以 `sales_df` 為基礎,演示如何從特徵工程到模型評估。
### 4.1 特徵工程
python
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
# 假設 sales_df 已載入並經過前處理
features = ['price', 'promo', 'day_of_week', 'holiday', 'month']
X = sales_df[features]
y = sales_df['amount']
# 1. 切分資料
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, shuffle=True
)
# 2. 量化標準化(對數值特徵)
numeric_features = ['price']
numeric_transformer = Pipeline(steps=[
('scaler', StandardScaler())
])
preprocess = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features)
]
)
### 4.2 建立模型管線
python
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error
# 隨機森林模型
rf = RandomForestRegressor(
n_estimators=500,
max_depth=None,
random_state=42,
n_jobs=-1
)
# 完整管線:預處理 + 模型
pipe = Pipeline(steps=[
('preprocess', preprocess),
('model', rf)
])
# 訓練
pipe.fit(X_train, y_train)
# 预测
pred = pipe.predict(X_test)
# 評估
rmse = mean_squared_error(y_test, pred, squared=False)
mae = mean_absolute_error(y_test, pred)
print(f"RMSE: {rmse:.2f}")
print(f"MAE: {mae:.2f}")
### 4.3 模型優化
| 參數 | 目的 | 常見範圍 |
|------|------|-----------|
| n_estimators | 樹木數量 | 100~1000 |
| max_depth | 樹深 | 5~30 |
| min_samples_split | 分裂內部節點的最小樣本數 | 2~10 |
| min_samples_leaf | 叶子節點的最小樣本數 | 1~4 |
> **技巧**:使用 `GridSearchCV` 或 `RandomizedSearchCV` 進行超參數搜尋,並結合交叉驗證確保泛化性能。
## 5. 何時轉向深度學習?
- **大規模時序資料**:如每日交易量、客流量,LSTM 或 Transformer 能捕捉長期依賴。
- **多維圖像/文本資料**:如產品圖片、評論,CNN 或 NLP 模型能直接從原始資料學習特徵。
- **複雜非線性關係**:如果傳統模型已達到 95% 以上精度,深度學習往往無法再提供顯著提升。
> **務實觀點**:深度學習需大量資料與算力,且模型不易解釋。若企業需要可追溯性與合規性,最好先嘗試可解釋模型。
## 6. 模型部署的關鍵點
1. **容器化**:將模型打包進 Docker,確保環境一致。
2. **API 化**:使用 Flask、FastAPI 或 gRPC 將模型暴露為 RESTful 服務。
3. **監控**:實時監測輸入分布、預測偏差,並設定警報。
4. **版本控制**:使用 MLflow 或 DVC 管理模型版本與實驗記錄。
5. **倫理合規**:確保模型不違反隱私規範與公平性指標。
## 7. 小結
本章我們從**特徵工程**、**模型選擇**、**評估指標**到**部署流程**,構築了一個完整的機器學習生命週期。記住,模型是工具,決策者是主人。選擇合適的模型並正確評估,才能讓數據洞察真正轉化為商業價值。
> *「在數據的浪潮中,模型是風帆;而正確的評估則是導航系統。兩者缺一,風浪終將吞噬船隻。」* — 墨羽行