聊天視窗

數據洞察:從基礎到實踐的資料科學全書 - 第 4 章

第 4 章:機器學習模型實戰 — 從線性到樹模型

發布於 2026-02-28 05:14

# 第 4 章:機器學習模型實戰 — 從線性到樹模型 > **前章回顧**:我們已經完成了資料前處理、缺失值填補、特徵標準化與編碼,並將 Pipeline 包裝為可重複使用的模組。本章將帶領你踏入模型的核心,從簡單的線性模型到複雜的樹模型,並學會如何評估與調參。 ## 4.1 為什麼選擇線性模型作起點 - **可解釋性**:係數直接告訴你特徵的重要程度,對業務洞察非常友好。 - **訓練速度**:對於大部分實務情境,線性模型足以快速迭代,讓你先抓住「趨勢」再進行更複雜建模。 - **基準**:任何模型的好壞,都需要和線性基準做對照,才能看出真正的提升。 > 下面的程式碼演示如何用 **scikit‑learn** 的 `LinearRegression` 進行基礎回歸: python import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score # 讀取預處理好的 DataFrame X = df.drop('target', axis=1) y = df['target'] X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42) # 標準化 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # 模型訓練 lr = LinearRegression() lr.fit(X_train_scaled, y_train) # 預測與評估 pred = lr.predict(X_test_scaled) print('RMSE:', mean_squared_error(y_test, pred, squared=False)) print('R² :', r2_score(y_test, pred)) > 觀察結果:如果 `R²` 僅為 0.2,表明單一線性關係不足以解釋大部分變異,需進一步探索非線性特徵或更強模型。 ## 4.2 引入樹模型:隨機森林與梯度提升 ### 4.2.1 隨機森林(Random Forest) - **多樣性**:通過 bagging 讓多棵樹彼此獨立,降低過擬合。 - **特徵重要度**:內建 `feature_importances_` 可直接評估各特徵貢獻。 python from sklearn.ensemble import RandomForestRegressor rf = RandomForestRegressor( n_estimators=200, max_depth=8, min_samples_split=4, random_state=42, n_jobs=-1 ) rf.fit(X_train, y_train) rf_pred = rf.predict(X_test) print('RF RMSE:', mean_squared_error(y_test, rf_pred, squared=False)) print('RF R² :', r2_score(y_test, rf_pred)) print('Feature importance:', rf.feature_importances_) ### 4.2.2 梯度提升(XGBoost / LightGBM) - **加速訓練**:針對大資料量設計,使用 GPU、稀疏矩陣加速。 - **正則化**:通過 `lambda`, `alpha` 控制模型複雜度。 python import xgboost as xgb xgb_model = xgb.XGBRegressor( n_estimators=400, learning_rate=0.05, max_depth=6, subsample=0.8, colsample_bytree=0.8, objective='reg:squarederror', reg_lambda=1, reg_alpha=0, random_state=42, n_jobs=-1 ) xgb_model.fit(X_train, y_train) xgb_pred = xgb_model.predict(X_test) print('XGB RMSE:', mean_squared_error(y_test, xgb_pred, squared=False)) print('XGB R² :', r2_score(y_test, xgb_pred)) > **小提示**:XGBoost 的 `eval_metric` 可視化學習曲線,幫助你判斷是否過擬合。 ## 4.3 模型評估:從指標到可視化 | 指標 | 適用場景 | 計算方式 | |------|----------|-----------| | RMSE | 回歸精度 | `sqrt(mean((y_true - y_pred)^2))` | | MAE | 對異常值較寬容 | `mean(|y_true - y_pred|)` | | R² | 解釋度 | `1 - SS_res / SS_tot` | | LogLoss | 分類正確度 | `-mean(y_true * log(p) + (1-y_true)*log(1-p))` | > **可視化**: > - **殘差圖**:檢查殘差是否隨預測值變化。 > - **特徵重要度條形圖**:直觀展示模型關注焦點。 > - **學習曲線**:訓練/驗證分離,觀察過擬合。 python import matplotlib.pyplot as plt import seaborn as sns # 殘差圖 residuals = y_test - rf_pred plt.figure(figsize=(6,4)) sns.scatterplot(x=rf_pred, y=residuals) plt.axhline(0, color='red', ls='--') plt.title('Residual Plot - Random Forest') plt.xlabel('Predicted') plt.ylabel('Residual') plt.show() ## 4.4 超參數調優策略 | 方法 | 優點 | 缺點 | |------|------|------| | **網格搜尋 (Grid Search)** | 全面探索 | 計算量大 | | **隨機搜尋 (Random Search)** | 覆蓋更廣 | 可能漏掉最佳組合 | | **貝葉斯優化 (Bayesian Optimization)** | 高效 | 實作較複雜 | | **遺傳演算法 (Genetic Algorithm)** | 全局搜尋 | 需要大量計算 | > **實務建議**:對於大多數商業問題,先用 `RandomizedSearchCV` 快速定位大致區間,再用 `GridSearchCV` 精細調整。 python from sklearn.model_selection import RandomizedSearchCV from scipy.stats import uniform, randint param_grid = { 'n_estimators': randint(100, 500), 'max_depth': [None, 4, 6, 8, 10], 'min_samples_split': randint(2, 10), 'min_samples_leaf': randint(1, 5) } rs = RandomizedSearchCV( estimator=rf, param_distributions=param_grid, n_iter=50, scoring='neg_root_mean_squared_error', cv=5, verbose=1, random_state=42, n_jobs=-1 ) rs.fit(X_train, y_train) print('Best params:', rs.best_params_) print('Best CV RMSE:', -rs.best_score_) ## 4.5 實戰案例:預測電商訂單價值 > **背景**:某電商平台希望預測下一個月每筆訂單的實際支付金額,以便進行動態折扣與庫存管理。 > > **特徵**: > - 顧客歷史購買頻次 > - 商品類別熱度 > - 訂單時間(季節、節假日) > - 支付方式(信用卡、支付寶) > > **流程**: > 1. 進行缺失值處理與 OneHot 編碼。 > 2. 用 `StandardScaler` 標準化數值特徵。 > 3. 建立 `RandomForestRegressor` 與 `XGBRegressor` 兩套模型。 > 4. 使用 10 折交叉驗證確保模型穩定。 > 5. 選擇 RMSE < 2000 的模型作為生產模型。 > > **結果**: > - XGB 模型在測試集上的 RMSE 為 1,650,R² 為 0.82。 > - 模型部署後,實際折扣策略精準度提升 5% 以上。 ## 4.6 小結 - **線性模型**:快速、可解釋,是建立基線的首選。 - **樹模型**:能捕捉複雜非線性關係,特別適合大規模特徵。 - **評估**:指標與可視化同等重要,確保模型在實務中穩定。 - **調參**:合理選擇搜尋策略,既節省時間又能發掘最佳參數。 - **實戰**:將理論落地到真實業務,能最大化資料科學的價值。 > **下一步**:第 5 章將聚焦模型部署與監控,將模型從實驗室搬到真實生產環境,並確保其長期表現不衰。