聊天視窗

數據科學的邏輯與實踐:從基礎到高階決策 - 第 3 章

第三章:模型選擇與評估——從機器學習到深度學習的橋樑

發布於 2026-03-06 14:09

# 第三章:模型選擇與評估 ## 1. 引言 在上一章中,我們已經掌握了資料前處理、描述統計與基礎假設檢定的工具。接下來,我們將步入機器學習的核心:**模型選擇**與**評估**。這一步驟不僅關乎算法的技術細節,更是決策品質與業務價值的關鍵。為了讓概念與實務相結合,本章將以 **零售銷售預測** 為案例,從特徵工程、模型訓練到性能指標,全面呈現模型選擇的全流程。 > *「好的模型像是一座橋,若建得不夠堅固,則無法載載企業的決策重量。」* — 墨羽行 ## 2. 模型選擇的策略 | 步驟 | 目的 | 典型工具 | 建議實踐 | |------|------|----------|-----------| | 2.1 特徵選擇 | 去除噪音、提升可解釋性 | Recursive Feature Elimination、L1 正則化 | 先從業務知識出發,再用模型幫助調整 | | 2.2 模型基準 | 先評估最簡單模型的表現 | 线性回归、决策树 | 建立「零模型」基準,衡量改進幅度 | | 2.3 高階模型 | 提升預測精度 | 隨機森林、Gradient Boosting、XGBoost、LightGBM | 針對資料特性選擇適當演算法 | | 2.4 深度學習 | 處理大規模非結構化資料 | LSTM、CNN、Transformer | 需大量資料與算力,並非所有情境都適用 | | 2.5 模型融合 | 結合多模型優勢 | Stacking、Blending、Ensemble Averaging | 兼顧精度與泛化風險 | > **關鍵提醒**:模型選擇不是一次性決策,而是**迭代**的過程。每次改動都要回到性能指標評估,確保沒有「過度擬合」或「過度簡化」。 ## 3. 評估指標的解讀 ### 3.1 回歸問題 | 指標 | 計算方式 | 解讀 | |------|----------|------| | RMSE (Root Mean Square Error) | √\frac{1}{n}\sum_{i=1}^n (y_i - \hat{y}_i)^2 | 反映預測誤差的標準差,單位與原始變數相同 | | MAE (Mean Absolute Error) | \frac{1}{n}\sum_{i=1}^n |y_i - \hat{y}_i| | 更不受極端值影響,易於解釋 | | R² | 1 - \frac{SS_{res}}{SS_{tot}} | 表示解釋變異比例,介於 0~1 之間 | ### 3.2 分類問題 | 指標 | 公式 | 解讀 | |------|------|------| | Accuracy | \frac{TP + TN}{TP + TN + FP + FN} | 總體正確率,對類別不平衡敏感 | | Precision | \frac{TP}{TP + FP} | 真正例比例,關注誤報 | | Recall | \frac{TP}{TP + FN} | 真正例召回率,關注漏報 | | F1-Score | 2 \times \frac{Precision \times Recall}{Precision + Recall} | 平衡 Precision 與 Recall | | AUC‑ROC | 曲線下的面積 | 評估分類閾值選擇的彈性 | > **實務提示**:在零售預測中,我們通常關注 **RMSE** 與 **MAE**,而不是單純的 **R²**,因為業務決策更關注實際金額差異。 ## 4. 案例實作:零售銷售預測 以下示例以 `sales_df` 為基礎,演示如何從特徵工程到模型評估。 ### 4.1 特徵工程 python import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline # 假設 sales_df 已載入並經過前處理 features = ['price', 'promo', 'day_of_week', 'holiday', 'month'] X = sales_df[features] y = sales_df['amount'] # 1. 切分資料 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42, shuffle=True ) # 2. 量化標準化(對數值特徵) numeric_features = ['price'] numeric_transformer = Pipeline(steps=[ ('scaler', StandardScaler()) ]) preprocess = ColumnTransformer( transformers=[ ('num', numeric_transformer, numeric_features) ] ) ### 4.2 建立模型管線 python from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error, mean_absolute_error # 隨機森林模型 rf = RandomForestRegressor( n_estimators=500, max_depth=None, random_state=42, n_jobs=-1 ) # 完整管線:預處理 + 模型 pipe = Pipeline(steps=[ ('preprocess', preprocess), ('model', rf) ]) # 訓練 pipe.fit(X_train, y_train) # 预测 pred = pipe.predict(X_test) # 評估 rmse = mean_squared_error(y_test, pred, squared=False) mae = mean_absolute_error(y_test, pred) print(f"RMSE: {rmse:.2f}") print(f"MAE: {mae:.2f}") ### 4.3 模型優化 | 參數 | 目的 | 常見範圍 | |------|------|-----------| | n_estimators | 樹木數量 | 100~1000 | | max_depth | 樹深 | 5~30 | | min_samples_split | 分裂內部節點的最小樣本數 | 2~10 | | min_samples_leaf | 叶子節點的最小樣本數 | 1~4 | > **技巧**:使用 `GridSearchCV` 或 `RandomizedSearchCV` 進行超參數搜尋,並結合交叉驗證確保泛化性能。 ## 5. 何時轉向深度學習? - **大規模時序資料**:如每日交易量、客流量,LSTM 或 Transformer 能捕捉長期依賴。 - **多維圖像/文本資料**:如產品圖片、評論,CNN 或 NLP 模型能直接從原始資料學習特徵。 - **複雜非線性關係**:如果傳統模型已達到 95% 以上精度,深度學習往往無法再提供顯著提升。 > **務實觀點**:深度學習需大量資料與算力,且模型不易解釋。若企業需要可追溯性與合規性,最好先嘗試可解釋模型。 ## 6. 模型部署的關鍵點 1. **容器化**:將模型打包進 Docker,確保環境一致。 2. **API 化**:使用 Flask、FastAPI 或 gRPC 將模型暴露為 RESTful 服務。 3. **監控**:實時監測輸入分布、預測偏差,並設定警報。 4. **版本控制**:使用 MLflow 或 DVC 管理模型版本與實驗記錄。 5. **倫理合規**:確保模型不違反隱私規範與公平性指標。 ## 7. 小結 本章我們從**特徵工程**、**模型選擇**、**評估指標**到**部署流程**,構築了一個完整的機器學習生命週期。記住,模型是工具,決策者是主人。選擇合適的模型並正確評估,才能讓數據洞察真正轉化為商業價值。 > *「在數據的浪潮中,模型是風帆;而正確的評估則是導航系統。兩者缺一,風浪終將吞噬船隻。」* — 墨羽行