聊天視窗

數據驅動決策:現代分析師的實戰手冊 - 第 4 章

四、模型建構與驗證

發布於 2026-02-22 02:27

# 四、模型建構與驗證 > 在「數據驅動決策」的整體流程中,模型構建與驗證是關鍵的一環。透過嚴謹的機器學習實踐,分析師能將資料洞察升級為可執行的預測與決策支持。 ## 4.1 概念回顧 | 項目 | 說明 | |------|------| | **Supervised Learning** | 目標變數已知,根據特徵預測值。 | | **Unsupervised Learning** | 無目標變數,探索資料結構。 | | **Model Evaluation** | 用評估指標量化模型效能。 | | **Overfitting / Underfitting** | 過度擬合與欠擬合的平衡。 | ## 4.2 資料分割與交叉驗證 1. **訓練 / 測試切分** - `train_test_split(X, y, test_size=0.2, random_state=42)` 2. **交叉驗證** - `KFold(n_splits=5, shuffle=True, random_state=42)` - 針對時間序列:`TimeSeriesSplit()` 3. **評估流程** - 先在訓練集做交叉驗證,最後在測試集確認最終效能。 ## 4.3 特徵工程 | 步驟 | 目的 | |------|------| | **標準化** | `StandardScaler()` 讓特徵均值 0,方差 1,避免尺度差異影響梯度下降。 | | **編碼** | `OneHotEncoder()` 或 `TargetEncoder()` 將類別轉為數值。 | | **特徵選擇** | `SelectKBest`, `RecursiveFeatureElimination` 或基於模型的重要度。 | | **特徵構造** | 組合原始特徵(如時間戳拆分、日月週計算)提升信息量。 | ## 4.4 模型選擇 | 類型 | 代表算法 | 典型場景 | |------|----------|----------| | 線性模型 | `LinearRegression`, `LogisticRegression` | 連續/二元分類,特徵線性可解。 | | 決策樹 | `DecisionTreeClassifier/Regressor` | 非線性關係,易解釋。 | | 集成方法 | `RandomForest`, `GradientBoosting`, `XGBoost`, `LightGBM` | 高效、能處理缺失值與異常值。 | | 深度學習 | `MLPRegressor`, `Keras` | 大量特徵、高維度。 | > **建議**:先從簡單模型開始,確定基準,再加入複雜模型;若特徵維度較低,線性模型往往能取得競爭力。 ## 4.5 評估指標 - **回歸**:RMSE, MAE, R² - **分類**:Accuracy, Precision, Recall, F1‑score, ROC‑AUC - **時間序列**:MAPE, MSPE > 針對業務需求選擇最能映射實際價值的指標,例如對於訂單預測,MAE 可能比 RMSE 更貼近成本。 ## 4.6 超參數調整 | 方法 | 參考範例 | |------|-----------| | **網格搜尋** | `GridSearchCV(estimator, param_grid, cv=5)` | | **隨機搜尋** | `RandomizedSearchCV`(速度快) | | **貝葉斯優化** | `scikit-optimize`、`hyperopt` | | **AutoML** | `AutoGluon`, `TPOT` | > 進行調參時,先確定評估指標,並設定合理的參數範圍。過度調參容易導致過擬合。 ## 4.7 模型解釋 | 工具 | 功能 | |------|------| | **SHAP** | 全局/局部特徵重要度,兼容任何模型 | | **LIME** | 解釋單一預測 | | **Feature Importance** | 內建於決策樹、GBM | | **Partial Dependence Plot** | 觀察特徵對預測的影響 | > 在高風險業務(金融、醫療)中,模型可解釋性是合規與信任的基石。 ## 4.8 實務流程示例 python import pandas as pd from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error # 讀取資料 X = pd.read_csv('data/features.csv') y = pd.read_csv('data/target.csv')['sales'] # 分割 X_train, X_val, y_train, y_val = train_test_split( X, y, test_size=0.2, random_state=42 ) # 前處理 numeric_features = X.select_dtypes(include=['int64', 'float64']).columns categorical_features = X.select_dtypes(include=['object']).columns numeric_transformer = Pipeline(steps=[ ('scaler', StandardScaler()) ]) categorical_transformer = Pipeline(steps=[ ('onehot', OneHotEncoder(handle_unknown='ignore')) ]) preprocessor = ColumnTransformer( transformers=[ ('num', numeric_transformer, numeric_features), ('cat', categorical_transformer, categorical_features) ] ) # 模型 + 前處理 model = Pipeline(steps=[ ('preprocessor', preprocessor), ('regressor', RandomForestRegressor(random_state=42)) ]) # 超參數調整 param_grid = { 'regressor__n_estimators': [200, 400], 'regressor__max_depth': [10, 20, None], 'regressor__min_samples_leaf': [1, 2, 4] } grid_search = GridSearchCV(model, param_grid, cv=5, scoring='neg_mean_absolute_error') grid_search.fit(X_train, y_train) # 評估 best_model = grid_search.best_estimator_ pred = best_model.predict(X_val) print('MAE:', mean_absolute_error(y_val, pred)) > **備註**:上述流程已整合資料前處理與模型訓練於一個 `Pipeline`,可直接保存 (`joblib.dump`) 以供部署。 ## 4.9 倫理與可重現性 1. **資料偏差**:檢查樣本分佈、時間漂移;若發現偏差,需調整抽樣或使用樣本重權重。 2. **隱私**:使用 `dp`(差分隱私)或 `k‑anonymity` 以保護個人資料。 3. **可重現性**: - 固定 `random_state`。 - 版本控制所有資料與程式碼。 - 使用 `requirements.txt` 或 `Pipfile` 指定依賴。 4. **解釋性與透明度**:提供模型解釋,協助決策者理解預測邏輯。 > **結語**:模型不僅是數學運算,更是決策工具。透過嚴謹的流程與倫理審視,分析師能夠在複雜商業環境中,將預測結果轉化為可落實、可驗證的決策。