聊天視窗

資料科學實務與方法:從理論到應用 - 第 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 通知。