聊天視窗

數據決策:從洞察到策略的全程分析 - 第 5 章

第五章:模型部署與 A/B 測試——從數據洞察到商業實踐

發布於 2026-03-05 01:58

# 第五章:模型部署與 A/B 測試——從數據洞察到商業實踐 ## 5.1 模型部署概述 在前幾章已經完成了特徵工程、模型訓練與驗證,現在的任務是將模型「推」到商業流程中。部署不僅是把程式碼跑起來,更是要確保模型能持續產出、可追蹤、且符合治理規範。 > **部署的三個核心目標** > 1. **可擴展性**:隨著流量增長,模型服務能自動水平擴展。 > 2. **可追蹤性**:每一次預測都能回溯到使用的模型版本、參數與資料。 > 3. **可維護性**:開發、測試、監控與更新流程皆標準化,降低運營成本。 ## 5.2 部署技術選型 | 技術 | 優點 | 缺點 | |---|---|---| | **Flask + Gunicorn** | 輕量級,易於上手 | 缺乏原生容器化與自動擴容能力 | | **FastAPI** | 支援 async、OpenAPI 自動生成 | 學習曲線略高 | | **Docker + Kubernetes** | 高擴展性、可移植 | 部署複雜,需 CI/CD 管理 | | **MLflow** | 模型版本管理與實驗追蹤 | 需要搭配其它容器化工具 | > **本書推薦組合**: > - **FastAPI** 作為前端服務 > - **Docker** 封裝環境 > - **Kubernetes** (或本地的 Docker‑Compose) 管理擴容 > - **MLflow** 追蹤模型版本與指標 > - **Prometheus + Grafana** 監控系統指標 ## 5.3 端到端部署流程 ### 5.3.1 版本化模型 python import mlflow import pickle mlflow.set_experiment("sales_prediction") with mlflow.start_run(): mlflow.sklearn.log_model(rf, "rf_model") mlflow.log_param("n_estimators", rf.n_estimators) mlflow.log_metric("rmse", rmse) ### 5.3.2 Dockerfile 範例 Dockerfile FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"] ### 5.3.3 FastAPI 入口 python # app.py from fastapi import FastAPI import joblib import mlflow.pyfunc app = FastAPI(title="Sales Forecast API") # 讀取模型 model = mlflow.pyfunc.load_model("models:/sales_prediction/1") @app.post("/predict") async def predict(payload: dict): X = pd.DataFrame([payload]) pred = model.predict(X).tolist() return {"predicted_sales": pred[0]} ### 5.3.4 部署到 Kubernetes 使用 Helm 或 `kubectl` 部署;設定 Horizontal Pod Autoscaler(HPA)以根據 CPU/記憶體自動擴容。 ## 5.4 A/B 測試設計 部署模型後,最關鍵的是驗證其商業價值。A/B 測試能將新模型與現有策略(Control)做比較,確保改進可量化。 ### 5.4.1 目標設定 - **主要 KPI**:日均銷售額、客單價 - **次要 KPI**:轉化率、客戶留存 ### 5.4.2 假設檢定 > **零假設(H0)**:新策略不會提升日均銷售額。 > **備擇假設(H1)**:新策略可提升至少 5%。 ### 5.4.3 樣本量計算 python # 以 95% 信賴度、80% 功效、基礎日均銷售 10,000 元 # 期望提升 5%(+500 元) import statsmodels.stats.power as smp effect_size = 500 / 10000 # 0.05 power_analysis = smp.NormalIndPower() sample_size = power_analysis.solve_power(effect_size=effect_size, power=0.8, alpha=0.05) print(f"每組需要 {int(sample_size)} 天的流量") ### 5.4.4 實驗實施 1. **流量分配**:使用 Cookie 或 Session ID 隨機將用戶分為 A、B 兩組(比例 1:1)。 2. **時程**:至少 30 天,以平衡季節性波動。 3. **監控**:每日自動匯報 KPI,並於 10% 變化時觸發預警。 ### 5.4.5 結果分析 - **t 檢定**:比較兩組平均值。 - **Bayes Factor**:若樣本不足,可使用 Bayes Factor 進行信度評估。 - **結論**:若 H0 被拒,說明模型有效;若不被拒,需回溯模型或特徵調整。 ## 5.5 案例實作:折扣策略 A/B 測試 | 版本 | 折扣率 | 主要 KPI | 成效 | |---|---|---|---| | Control | 10% | 10,200 | 基線 | | Treatment | 15% | 10,800 | +5.88% | > 統計檢定:p-value < 0.01,故拒絕 H0,模型正確。 ## 5.6 監控與治理 - **模型漂移**:使用 `river` 或 `scikit‑monitor` 定期檢查特徵分佈變化。 - **合規性**:確保資料使用符合 GDPR / 個資法規。 - **透明度**:保存每次預測的 SHAP 向量,以供內部審核。 ## 5.7 小結 - **部署是橋梁**:將洞察轉化為可操作的商業流程。 - **A/B 測試是實驗室**:在實際環境中驗證模型效益。 - **治理是護城河**:確保模型合規、可追蹤、可維護。 - **迭代是常態**:部署後的成效回饋,驅動下一輪特徵與模型迭代。 > 下一章將深入探討 **持續學習(Online Learning)** 與 **模型自動更新** 的實務實作。