返回目錄
A
數據驅動決策:現代分析師的實戰手冊 - 第 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. **解釋性與透明度**:提供模型解釋,協助決策者理解預測邏輯。
> **結語**:模型不僅是數學運算,更是決策工具。透過嚴謹的流程與倫理審視,分析師能夠在複雜商業環境中,將預測結果轉化為可落實、可驗證的決策。