返回目錄
A
從資料到決策:系統化資料科學實踐手冊 - 第 3 章
第3章 模型選擇與評估:從基礎到先進的策略
發布於 2026-03-05 16:02
# 第3章 模型選擇與評估:從基礎到先進的策略
## 3.1 模型選擇的哲學
在資料科學的世界裡,**模型選擇**往往被誤解為「拿著好看或熱門的算法直接上手」的行為。實際上,這是一個充滿假設、偏差與成本考量的決策過程。當我們把一個問題拆解成「特徵集 + 目標變量 + 業務約束」後,模型的選擇就不再是隨機抽樣,而是關於 **可解釋性、可擴充性、計算成本** 的平衡。
> **思考題**:在你上一個專案中,選擇哪一個模型最初是基於什麼假設?這個假設是否被後續實驗所證實?
## 3.2 評估指標的選擇
### 3.2.1 回歸問題
| 指標 | 定義 | 適用場景 |
|------|------|-----------|
| MSE | 平均平方誤差 | 需要懲罰大誤差的情況 |
| MAE | 平均絕對誤差 | 數據分佈非對稱時較穩健 |
| RMSE | 係數根均方誤差 | 直觀理解,與單位一致 |
| R² | 决定係数 | 衡量解釋變異比例 |
python
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
mse = mean_squared_error(y_true, y_pred)
rmse = np.sqrt(mse)
mae = mean_absolute_error(y_true, y_pred)
print(f"RMSE: {rmse:.3f}, MAE: {mae:.3f}, R²: {r2_score(y_true, y_pred):.3f}")
### 3.2.2 分類問題
| 指標 | 定義 | 何時使用 |
|------|------|----------|
| Accuracy | 正確率 | 標籤平衡 |
| Precision / Recall | 正確陽性率/召回率 | 需要區分錯誤成本時 |
| F1‑score | 調和平均 | 權衡 Precision 與 Recall |
| ROC‑AUC | 曲線下積 | 需要評估判別能力 |
python
from sklearn.metrics import classification_report, roc_auc_score
print(classification_report(y_true, y_pred))
print(f"ROC‑AUC: {roc_auc_score(y_true, y_prob):.3f}")
## 3.3 超參數調優:從穩健到創新
### 3.3.1 GridSearchCV
python
from sklearn.model_selection import GridSearchCV
param_grid = {
'n_estimators': [100, 200, 300],
'max_depth': [None, 10, 20],
'min_samples_split': [2, 5]
}
grid = GridSearchCV(RandomForestRegressor(random_state=42), param_grid, cv=5, scoring='neg_mean_absolute_error')
grid.fit(X_train, y_train)
print("Best params:", grid.best_params_)
### 3.3.2 RandomizedSearchCV
> 在高維參數空間,完整遍歷成本過高。RandomizedSearchCV 以隨機抽樣方式提供更高效的搜尋。
python
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint
param_distributions = {
'n_estimators': randint(50, 500),
'max_depth': randint(5, 50),
'min_samples_split': randint(2, 10)
}
rand_search = RandomizedSearchCV(RandomForestRegressor(random_state=42), param_distributions, n_iter=50, cv=5, scoring='neg_mean_absolute_error', random_state=42)
rand_search.fit(X_train, y_train)
print("Best params:", rand_search.best_params_)
### 3.3.3 Bayesian Optimization (Optuna)
> 針對「黑盒」模型或昂貴的訓練時間,Bayesian 方法能在較少試驗次數內逼近最優。Optuna 以 TPE(Tree‑structured Parzen Estimator)實現。
python
import optuna
from optuna.samplers import TPESampler
def objective(trial):
n_estimators = trial.suggest_int('n_estimators', 50, 500)
max_depth = trial.suggest_int('max_depth', 5, 50)
min_samples_split = trial.suggest_int('min_samples_split', 2, 10)
model = RandomForestRegressor(
n_estimators=n_estimators,
max_depth=max_depth,
min_samples_split=min_samples_split,
random_state=42
)
score = cross_val_score(model, X_train, y_train, cv=5, scoring='neg_mean_absolute_error').mean()
return -score # Optuna minimises the objective
study = optuna.create_study(direction='minimize', sampler=TPESampler(seed=42))
study.optimize(objective, n_trials=100)
print("Best trial:", study.best_trial.params)
## 3.4 交叉驗證的細節與陷阱
1. **時間序列**:使用 `TimeSeriesSplit`,避免未來資訊洩漏。
2. **分層抽樣**:對於不平衡分類問題,確保每折中各類比例相近。
3. **資料漂移**:若特徵分佈隨時間變化,需定期重新評估。
python
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)
for train_idx, val_idx in tscv.split(X):
X_train_fold, X_val_fold = X.iloc[train_idx], X.iloc[val_idx]
y_train_fold, y_val_fold = y.iloc[train_idx], y.iloc[val_idx]
# ... train and evaluate
## 3.5 模型解釋與公平性
### 3.5.1 SHAP
> SHAP(SHapley Additive exPlanations)提供局部與全局解釋,兼具理論與實務。
python
import shap
explainer = shap.TreeExplainer(rf_best)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test)
### 3.5.2 公平性指標
| 指標 | 目的 |
|------|------|
| Equal Opportunity | 確保陽性類別的召回率在不同族群間一致 |
| Demographic Parity | 目標預測比例在不同族群相同 |
python
from aif360.metrics import BinaryLabelDatasetMetric
metric = BinaryLabelDatasetMetric(dataset, unprivileged_groups=[{'race': 'Black'}], privileged_groups=[{'race': 'White'}])
print("Equal Opportunity Difference:", metric.equal_opportunity_difference())
## 3.6 失敗案例分析:超參數調優失敗的教訓
> 在一家線上零售商的季節性促銷模型中,工程師使用 GridSearchCV 對 `learning_rate` 進行了 1000 次搜尋,卻發現模型在測試集上表現更差。原因:
>
> 1. **資料不平衡**:高頻顧客被過度擬合。
> 2. **過度擬合**:使用了 1000 種參數組合,訓練資料過度記憶。
> 3. **評估指標不一致**:GridSearch 使用 `roc_auc`,實際業務關注的是 `F1`。
>
> **對策**:改用 `RandomizedSearchCV`,限制試驗次數,並改用 `f1` 為評估指標。
## 3.7 小結
1. **模型選擇是一門科學,也是藝術**:結合業務洞察、數學理論與實務經驗。
2. **評估指標須與業務目標對齊**:不要因為指標方便就盲目追求。
3. **超參數搜尋需節制**:過度搜尋往往帶來過擬合與浪費。
4. **解釋性與公平性不容忽視**:模型的可解釋性是部署的前提,而公平性是社會責任。
> **一句話提醒**:在資料科學的道路上,模型選擇不是最後的終點,而是持續迭代與驗證的起點。透過嚴謹的評估與透明的解釋,才能真正把資料的洞察轉化為可持續的商業價值。