聊天視窗

從資料到決策:系統化資料科學實踐手冊 - 第 5 章

5. 模型評估與選擇:從指標到信心

發布於 2026-03-05 17:09

## 5. 模型評估與選擇:從指標到信心 資料科學的核心不只是模型本身,更在於如何正確衡量模型的表現、選擇合適的模型以及持續監控其效能。以下將以一個信用卡欺詐偵測的實務案例為線索,拆解模型評估與選擇的完整流程。 ### 5.1 評估指標的哲學 - **準確率**:適用於類別平衡的情況。 - **召回率(Recall)**:對於漏判成本高的領域(如欺詐、疾病診斷)尤為重要。 - **F1 分數**:平衡 Precision 與 Recall,常見於業務場景。 - **ROC‑AUC / PR‑AUC**:評估模型的分離能力,對不平衡資料更為敏感。 > **小技巧**:在不平衡資料集,Precision‑Recall 曲線往往比 ROC 曲線更能反映實際效能。 ### 5.2 交叉驗證與分層抽樣 ```python from sklearn.model_selection import StratifiedKFold X = df.drop(columns='target') y = df['target'] skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42) for fold, (train_idx, val_idx) in enumerate(skf.split(X, y)): X_train, X_val = X.iloc[train_idx], X.iloc[val_idx] y_train, y_val = y.iloc[train_idx], y.iloc[val_idx] # 訓練模型... ``` > **注意**:分層抽樣能確保每個 fold 的類別比例與整體相近,避免評估偏差。 ### 5.3 參數調整策略 1. **網格搜尋 (Grid Search)**:穩定但計算成本高。 2. **隨機搜尋 (Random Search)**:在大參數空間快速定位。 3. **貝葉斯優化**:利用前一次的結果更新搜尋方向。 ```python from sklearn.model_selection import RandomizedSearchCV from scipy.stats import uniform, randint param_dist = { 'n_estimators': randint(100, 1000), 'max_depth': randint(3, 15), 'learning_rate': uniform(0.01, 0.3) } clf = XGBClassifier(objective='binary:logistic', eval_metric='logloss', seed=42) search = RandomizedSearchCV(clf, param_distributions=param_dist, n_iter=50, scoring='f1', cv=skf, random_state=42, n_jobs=-1) search.fit(X_train, y_train) ``` > **小心**:過度調參可能導致過擬合,必須搭配驗證集監控。 ### 5.4 監測與再訓練 模型部署後,實務上往往需要 - **特徵漂移偵測**:利用 KS 測試或漂移指標。 - **預測失效追蹤**:設定閾值自動觸發再訓練。 - **版本管理**:透過 MLflow 或 DVC 保存模型與資料。 ### 5.5 案例研究:信用卡欺詐偵測 - **資料**:30 萬筆交易,類別比例 99.5% 正常 / 0.5% 欺詐。 - **特徵**:交易金額、時間、商戶類別、客戶歷史等。 - **模型**:XGBoost、LightGBM、隨機森林混合。 - **評估**:F1 = 0.72,PR‑AUC = 0.68。 - **迭代**:每月重新訓練,並加入新交易類別特徵。 > **經驗談**:在此案例中,模型的召回率比精確率高,因為對於欺詐交易,漏判的成本遠高於誤判。設計 KPI 時務必考量業務邊際。 ### 5.6 小結 - **評估指標選擇要對症下藥**:不只是數字,更是業務價值。 - **交叉驗證能提供穩健的性能估計**,尤其在樣本有限時。 - **參數調整需平衡成本與效能**,避免過度擬合。 - **持續監測是模型可用性的關鍵**,漂移與失效必須即時回饋。 > **一句話提醒**:模型的真正價值不在於複雜度,而在於能在實際場景中持續提供正確決策。