返回目錄
A
資料科學實務與方法:從理論到應用 - 第 7 章
第 7 章:模型評估、選擇與部署
發布於 2026-03-04 03:52
# 第 7 章:模型評估、選擇與部署
> **前言**
> 模型的好壞不僅取決於訓練過程,更在於其在真實環境中的表現。透過系統化的評估、嚴謹的選擇與可靠的部署,才能確保資料科學專案從實驗室到業務流程的無縫對接。
## 1. 模型評估基礎
| 評估指標 | 適用場景 | 公式範例 | 直觀解讀 |
|---|---|---|---|
| Accuracy | 分類、平衡樣本 | \(\frac{TP+TN}{N}\) | 正確預測比例,對不平衡數據易失真 |
| Precision | 分類、關注陽性預測 | \(\frac{TP}{TP+FP}\) | 預測為陽性時,真陽性的比例 |
| Recall (Sensitivity) | 分類、關注漏報 | \(\frac{TP}{TP+FN}\) | 觀測陽性樣本中被正確預測的比例 |
| F1‑score | 分類、平衡 precision & recall | \(2\cdot\frac{Precision\times Recall}{Precision+Recall}\) | 兩者折衷,常用於不平衡情況 |
| ROC & AUC | 二分類、決策閾值調整 | ROC 曲線下的面積 | 整體判別能力,閾值無關 |
| PR‑Curve | 大量陰性樣本 | Precision vs Recall | 在低召回率時更為資訊豐富 |
| MSE / RMSE | 回歸、連續值 | \(\frac{1}{N}\sum (y-ŷ)^2\) | 平均平方誤差,RMSE 更易解讀 |
| MAE | 回歸、對極端值不敏感 | \(\frac{1}{N}\sum |y-ŷ|\) | 平均絕對誤差 |
| R² | 回歸、解釋變異 | \(1-\frac{SS_{res}}{SS_{tot}}\) | 0-1 之間,越高越好 |
> **實務提醒**:在多任務、多模型的場景中,**同一指標不能全勝**,最好根據業務目標選擇「最符合」的評估指標。
## 2. 交叉驗證與參數調整
### 2.1 交叉驗證(Cross‑Validation)
- **k‑fold CV**:將資料拆成 k 份,輪流作驗證集。
- **Stratified k‑fold**:保持類別比例,常用於不平衡分類。
- **Time‑Series CV**:針對序列資料,前向滑動窗口,避免資料泄露。
python
from sklearn.model_selection import cross_val_score, StratifiedKFold
from sklearn.ensemble import RandomForestClassifier
X, y = load_data()
model = RandomForestClassifier(n_estimators=200)
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=cv, scoring='f1_macro')
print('F1‑macro CV mean:', scores.mean())
### 2.2 超參數搜索
- **Grid Search**:網格遍歷,耗時但全面。
- **Random Search**:隨機抽樣,搜索空間更廣。
- **Bayesian Optimization**:利用先前評估結果引導搜索。
python
from sklearn.model_selection import GridSearchCV
param_grid = {'n_estimators': [100, 200, 300],
'max_depth': [None, 10, 20, 30]}
grid = GridSearchCV(RandomForestClassifier(random_state=42),
param_grid, cv=5, scoring='f1_macro')
grid.fit(X, y)
print('Best params:', grid.best_params_)
## 3. 模型選擇策略
| 需求 | 推薦模型 | 參考指標 | 典型應用 |
|---|---|---|---|
| 低延遲、邊緣推論 | LightGBM, XGBoost (小規模)、MobileNet, Tiny YOLO | AUC, FPS | 物聯網預測、智能監控 |
| 大型語音/影像 | BERT, ResNet, GPT‑3 (轉換器) | F1, Perplexity | 語音辨識、自然語言生成 |
| 不確定性量化 | Bayesian Neural Network, Gaussian Process | Predictive Uncertainty | 醫療診斷、金融風險 |
| 可解釋性 | Decision Tree, SHAP + Linear Models | Feature Importance | 合規需求、決策審核 |
> **選擇原則**:先**量化需求**(latency, throughput, memory),再考慮**模型效能**(AUC, RMSE)。必要時可用多模型融合或混合推理。
## 4. 模型部署流程(CI/CD)
### 4.1 模型封裝
- **Pickle / joblib**:Python 原生,簡單但不跨語言。
- **ONNX**:跨框架通用格式,適合部署到多平台。
- **TorchScript / TensorFlow SavedModel**:原生框架部署。
bash
# 將 PyTorch 模型轉為 ONNX
python export_to_onnx.py --model checkpoint.pth --output model.onnx
### 4.2 容器化
Dockerfile
# 使用官方 PyTorch 基底
FROM pytorch/pytorch:1.12.0-cuda11.3-cudnn8-runtime
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "serve.py"]
### 4.3 持續整合(CI)
- **GitHub Actions**:自動測試、模型評估、容器構建。
- **GitLab CI**:更靈活的 CI/CD 管道。
yaml
# .github/workflows/deploy.yml
name: Deploy Model
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.9'
- name: Install dependencies
run: pip install -r requirements.txt
- name: Run tests & evaluation
run: pytest tests/
- name: Build Docker image
run: docker build -t mymodel:latest .
- name: Push to Docker Hub
run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
docker push mymodel:latest
### 4.4 部署目標
- **雲端(AWS SageMaker, Azure ML, GCP Vertex AI)**:可擴展、高可用。
- **Kubernetes(EKS, AKS, GKE)**:自動擴縮、服務發現。
- **Edge(Jetson, Raspberry Pi, MCU)**:輕量化 ONNX 或 TensorRT。
bash
# 在 Kubernetes 中部署
kubectl apply -f deployment.yaml
### 4.5 版本管理與灰度發布
- **MLflow / DVC**:儲存模型、參數、指標。
- **Argo Rollouts / Flagger**:實現金絲雀/灰度策略。
## 5. 模型監控與維護
| 監控指標 | 目的 | 工具 |
|---|---|---|
| Prediction Drift | 輸入特徵分佈變化 | Evidently AI, River |
| Performance Drift | 指標下降 | Prometheus + Grafana |
| Resource Utilization | CPU/Memory/Latency | Datadog, CloudWatch |
| Model Fairness | 公平性偏差 | Fairlearn, AI Fairness 360 |
> **最佳實務**:每 1–2 週檢查一次模型表現,若 AUC 落後 2% 以上即觸發 retrain pipeline。
## 6. 實戰案例:信用卡欺詐檢測
1. **資料**:10 萬筆交易紀錄,含 15 個特徵。
2. **預處理**:缺失值填補、標準化、特徵組合。
3. **模型**:XGBoost + LightGBM 集成。
4. **評估**:AUC = 0.982;F1‑macro = 0.876。
5. **部署**:Docker 化,部署到 Azure Container Instance,使用 Azure Monitor 追蹤 AUC 變化。
6. **監控**:設定警報,一旦 AUC 落後 1% 立即觸發 retrain pipeline。
## 7. 小結與最佳實踐
| 步驟 | 重點 | 常見陷阱 |
|---|---|---|
| 評估 | 選擇合適指標 | 只看 Accuracy 忽視不平衡 |
| CV | 合理切分 | 時間序列數據資料泄露 |
| 參數 | 先隨機再 Bayesian | 過度擬合 |
| 選擇 | 兼顧效能與資源 | 忽略實際部署限制 |
| 部署 | CI/CD 與容器化 | 只做一次性部署,缺乏監控 |
| 監控 | 持續追蹤 drift | 沒有預先設計回滾機制 |
> **結語**:模型評估、選擇與部署不是孤立的技術步驟,而是一個完整的**資料科學生命週期**。透過嚴謹的評估、靈活的選擇與自動化的部署,才能真正將資料科學的洞察轉化為可持續的商業價值。
## 7.10 練習題
1. **多指標評估**:對於二分類問題,實作並比較 Accuracy、F1‑score、ROC‑AUC、PR‑Curve 四個指標,說明各自適用時機。
2. **k‑fold vs Stratified**:使用 scikit‑learn 在一個不平衡資料集上分別執行 k‑fold 與 Stratified k‑fold,比較結果差異並解釋原因。
3. **模型容器化實作**:將一個訓練好的 `RandomForestClassifier` 封裝為 Docker 容器,並撰寫 `docker-compose.yml` 讓兩台機器共用同一服務。
4. **CI/CD pipeline**:使用 GitHub Actions 建立一個包含模型評估、Docker 構建、推送至 Docker Hub 的完整 pipeline,並在 `pull_request` 事件上自動執行測試。
5. **模型監控**:使用 Prometheus + Grafana 建立一個簡易 Dashboard,顯示模型推論延遲、吞吐量與 ROC‑AUC 指標,並設定 5% 以上下降時觸發 Slack 通知。