返回目錄
A
數據決策:從洞察到策略的全程分析 - 第 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)** 與 **模型自動更新** 的實務實作。