模型部署:將 ML 模型整合到應用中

訓練出一個高準確率的模型很棒,但這只是開始。真正的價值來自於把模型整合到真實的應用中,讓它實際產生商業價值。

模型儲存與載入

訓練一個模型可能需要數分鐘甚至數小時,你絕對不可能每次啟動網站時都重新訓練一次。正確的做法是:將訓練好的模型儲存到磁碟,需要時直接載入。

使用 Joblib 儲存模型

import joblib

# 訓練好模型後
rf_model.fit(X_train, y_train)

# 儲存模型到檔案
joblib.dump(rf_model, 'churn_model.pkl')

# 也儲存標準化器(之後預測時也需要它!)
joblib.dump(scaler, 'churn_scaler.pkl')

print("模型已儲存為 churn_model.pkl")

載入模型

# 載入模型與標準化器
loaded_model = joblib.load('churn_model.pkl')
loaded_scaler = joblib.load('churn_scaler.pkl')

# 直接用載入的模型預測
new_customer = [[12, 89.5, 1074, 2, 0, 45.2, 1]]  # 特徵值
new_customer_scaled = loaded_scaler.transform(new_customer)
prediction = loaded_model.predict(new_customer_scaled)
probability = loaded_model.predict_proba(new_customer_scaled)[:, 1]

print(f"預測結果: {'會流失' if prediction[0] == 1 else '不會流失'}")
print(f"流失機率: {probability[0]:.2%}")

建立預測 API (FastAPI)

接下來,我們將使用 FastAPI 建立一個預測 API,讓前端網站可以呼叫它來預測客戶流失。

安裝 FastAPI

pip install fastapi uvicorn

建立 API 伺服器

建立一個 predict_api.py

from fastapi import FastAPI
from pydantic import BaseModel
import joblib
import numpy as np

# 載入模型與標準化器
model = joblib.load('churn_model.pkl')
scaler = joblib.load('churn_scaler.pkl')

# 建立 FastAPI 應用
app = FastAPI(title="客戶流失預測 API")

# 定義請求資料格式
class CustomerData(BaseModel):
    tenure_months: int           # 使用月數
    monthly_charges: float       # 月費
    total_charges: float         # 總消費
    num_support_tickets: int     # 客服次數
    has_contract: int            # 是否綁約 (0/1)
    avg_order_value: float       # 平均訂單金額
    num_complaints: int          # 投訴次數

# 定義回應格式
class PredictionResult(BaseModel):
    will_churn: bool
    churn_probability: float
    churn_risk_level: str

@app.get("/health")
def health_check():
    return {"status": "ok", "model": "churn_prediction"}

@app.post("/predict", response_model=PredictionResult)
def predict_churn(customer: CustomerData):
    # 將資料轉換為模型輸入格式
    features = np.array([[
        customer.tenure_months,
        customer.monthly_charges,
        customer.total_charges,
        customer.num_support_tickets,
        customer.has_contract,
        customer.avg_order_value,
        customer.num_complaints
    ]])
    
    # 標準化
    features_scaled = scaler.transform(features)
    
    # 預測
    prediction = model.predict(features_scaled)[0]
    probability = model.predict_proba(features_scaled)[0, 1]
    
    # 判斷風險等級
    if probability >= 0.7:
        risk_level = "高風險"
    elif probability >= 0.4:
        risk_level = "中風險"
    else:
        risk_level = "低風險"
    
    return PredictionResult(
        will_churn=bool(prediction),
        churn_probability=round(float(probability), 4),
        churn_risk_level=risk_level
    )

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

啟動 API 伺服器

python predict_api.py
# 或
uvicorn predict_api:app --host 0.0.0.0 --port 8000 --reload

測試 API

打開瀏覽器前往 http://localhost:8000/docs,你會看到 Swagger 互動式 API 文件!

你也可以用 curl 測試:

curl -X POST "http://localhost:8000/predict" \
  -H "Content-Type: application/json" \
  -d '{
    "tenure_months": 3,
    "monthly_charges": 89.5,
    "total_charges": 268.5,
    "num_support_tickets": 5,
    "has_contract": 0,
    "avg_order_value": 35.0,
    "num_complaints": 3
  }'

回應範例:

{
  "will_churn": true,
  "churn_probability": 0.8732,
  "churn_risk_level": "高風險"
}

整合到前端應用

在前端(Next.js / React)中,你可以用 fetch 呼叫這個 API:

// React / Next.js 前端呼叫 ML API
async function predictChurn(customerData) {
  const response = await fetch('http://localhost:8000/predict', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(customerData)
  });
  const result = await response.json();
  
  if (result.will_churn) {
    showAlert(`⚠️ 高風險客戶!流失機率: ${(result.churn_probability * 100).toFixed(0)}%`);
    sendCoupon(customerData.userId); // 自動發送優惠券
  }
  
  return result;
}

Docker 容器化 ML API

最後,讓我們把 ML API Docker 化,方便部署到雲端:

FROM python:3.11-slim

WORKDIR /app

# 複製必要檔案
COPY requirements.txt .
COPY predict_api.py .
COPY churn_model.pkl .
COPY churn_scaler.pkl .

# 安裝套件
RUN pip install --no-cache-dir -r requirements.txt

# 暴露埠號
EXPOSE 8000

# 啟動 API
CMD ["uvicorn", "predict_api:app", "--host", "0.0.0.0", "--port", "8000"]

requirements.txt

fastapi
uvicorn
joblib
numpy
pydantic
scikit-learn

本日總結

在本章中,你學到了:

  1. 模型儲存:使用 Joblib 儲存與載入訓練好的模型
  2. FastAPI:建立機器學習預測 API
  3. 前端整合:從 React/Next.js 呼叫 ML API
  4. Docker 化部署:將 ML API 容器化
  5. 完整流程:從訓練 → 儲存 → API → 前端整合的完整鏈路

下一章,我們將學習如何用 Prophet 進行時間序列預測!

解鎖完整教學內容

本章為付費內容。加入專案即可解鎖超過 5000 字的深度解析,包含 10 個以上神級 Prompt 與真實 Source Code 範例!