模型部署:將 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
本日總結
在本章中,你學到了:
- ✅ 模型儲存:使用 Joblib 儲存與載入訓練好的模型
- ✅ FastAPI:建立機器學習預測 API
- ✅ 前端整合:從 React/Next.js 呼叫 ML API
- ✅ Docker 化部署:將 ML API 容器化
- ✅ 完整流程:從訓練 → 儲存 → API → 前端整合的完整鏈路
下一章,我們將學習如何用 Prophet 進行時間序列預測!