返回目錄
A
數據洞察:從基礎到實踐的資料科學全書 - 第 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 章將聚焦模型部署與監控,將模型從實驗室搬到真實生產環境,並確保其長期表現不衰。