聊天視窗

從資料到決策:系統化資料科學實踐手冊 - 第 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. **解釋性與公平性不容忽視**:模型的可解釋性是部署的前提,而公平性是社會責任。 > **一句話提醒**:在資料科學的道路上,模型選擇不是最後的終點,而是持續迭代與驗證的起點。透過嚴謹的評估與透明的解釋,才能真正把資料的洞察轉化為可持續的商業價值。