返回目錄
A
數據科學實戰:從問題到洞見 - 第 6 章
第6章:機器學習與模型建構
發布於 2026-03-05 11:40
# 第6章:機器學習與模型建構
本章將把前五章的資料洞察轉化為可執行的預測邏輯。\n我們會從三大學習類型:監督式、非監督式與強化學習,進行系統化說明,並說明模型選擇、交叉驗證、參數調優及模型部署的完整流程。\n所有範例以 **Python / scikit‑learn** 為主;若資料量較大,亦會展示 **Spark MLlib** 的對應實作。\n
---
## 6.1 監督式學習(Supervised Learning)
| 類型 | 典型問題 | 主要評估指標 |
|------|----------|--------------|
| 回歸 | 價格預測、需求量預測 | RMSE、MAE、R² |
| 分類 | 信用卡欺詐、垃圾郵件檢測 | Accuracy、Precision、Recall、F1、AUC |
### 6.1.1 回歸(Regression)
回歸的目標是預測連續變量。常用模型包括:
1. **線性回歸** (Linear Regression) – 基礎、易解釋。
2. **Lasso / Ridge** – 正則化處理多重共線性。
3. **決策樹回歸**、**隨機森林**、**梯度提升樹**(GBDT)– 非線性特徵捕捉。
4. **XGBoost / LightGBM / CatBoost** – 速度快、性能高。
python
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error
X, y = df.drop('target', axis=1), df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
pipe = Pipeline([
('scaler', StandardScaler()),
('reg', Ridge(alpha=1.0))
])
pipe.fit(X_train, y_train)
pred = pipe.predict(X_test)
print('RMSE:', mean_squared_error(y_test, pred, squared=False))
### 6.1.2 分類(Classification)
分類的目標是預測離散標籤。常見模型:
1. **邏輯迴歸** – 基礎、可解釋。
2. **支持向量機**(SVM)– 針對高維資料。
3. **k‑近鄰**(k‑NN)– 非參數、簡易實作。
4. **決策樹 / 隨機森林 / GBDT** – 高效且可處理非線性。
5. **深度學習**(CNN、RNN)– 需要大量資料。
python
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
clf = RandomForestClassifier(random_state=42)
param_grid = {'n_estimators': [100, 200], 'max_depth': [None, 10, 20]}
search = GridSearchCV(clf, param_grid, cv=5, scoring='f1')
search.fit(X_train, y_train)
print('Best params:', search.best_params_)
print(classification_report(y_test, search.predict(X_test)))
## 6.2 非監督式學習(Unsupervised Learning)
| 目標 | 方法 | 用例 |
|------|------|------|
| 群聚 | K‑means、DBSCAN、HDBSCAN | 客戶細分、異常偵測 |
| 降維 | PCA、t‑SNE、UMAP | 可視化、特徵壓縮 |
| 相關性 | 奇異值分解(SVD) | 主成分分析、協同過濾 |
python
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=5, random_state=42)
kmeans.fit(X)
print('Cluster centers shape:', kmeans.cluster_centers_.shape)
## 6.3 強化學習(Reinforcement Learning)
強化學習將決策問題視為智能體(Agent)在環境(Environment)中採取行動,獲取回饋(Reward)並調整策略。常見框架:
- **OpenAI Gym** – 環境庫。
- **Stable Baselines 3** – 高效實作。
- **RLlib** – 分散式強化學習。
python
import gym
from stable_baselines3 import PPO
env = gym.make('CartPole-v1')
model = PPO('MlpPolicy', env, verbose=1)
model.learn(total_timesteps=100_000)
## 6.4 模型選擇與比較
### 6.4.1 需求導向選擇
| 需求 | 推薦模型 |
|------|----------|
| 需要可解釋性 | 迴歸、邏輯迴歸、決策樹 |
| 高精度、非線性 | XGBoost、LightGBM |
| 大規模資料 | Spark MLlib、CatBoost |
| 異常偵測 | Isolation Forest、Auto‑Encoder |
### 6.4.2 多模型比較
- **交叉驗證**(K‑fold): 估計泛化能力。
- **性能指標**: 選擇對應業務需求。
- **統計檢定**: 例如 **paired t-test** 或 **McNemar** 以判斷差異顯著性。
python
from sklearn.model_selection import cross_val_score
scores = cross_val_score(rf, X, y, cv=5, scoring='f1')
print('CV F1 mean:', scores.mean())
## 6.5 交叉驗證(Cross‑Validation)
交叉驗證將資料分為 *k* 份,逐份驗證,避免過度擬合。
- **K‑Fold**:最常用;k=5 或 10。
- **StratifiedKFold**:保持類別比例,適用於分類。
- **TimeSeriesSplit**:時間序列資料的留一法。
### 6.5.1 交叉驗證實作範例
python
from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
for train_idx, val_idx in skf.split(X, y):
X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]
y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]
model.fit(X_train, y_train)
pred = model.predict(X_val)
# 評估指標
## 6.6 參數調優(Hyper‑parameter Tuning)
| 方法 | 優點 | 缺點 |
|------|------|------|
| **網格搜尋(Grid Search)** | 全面搜索 | 計算成本高 |
| **隨機搜尋(Random Search)** | 節省時間 | 可能漏掉最佳組合 |
| **Bayesian 優化** | 低樣本有效 | 需要額外套件 |
| **Optuna** | 動態剪枝、易整合 | 需要學習曲線 |
python
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform
param_dist = {'n_estimators': [100, 200, 500],
'max_depth': [None, 10, 20, 30],
'learning_rate': uniform(0.01, 0.2)}
rs = RandomizedSearchCV(xgb.XGBClassifier(), param_distributions=param_dist,
n_iter=20, scoring='f1', cv=5, random_state=42)
rs.fit(X_train, y_train)
print('Best score:', rs.best_score_)
print('Best params:', rs.best_params_)
## 6.7 模型部署前的準備
1. **特徵工程重現**:使用 **Pipeline** 或 **MLflow** 將前處理、模型訓練封裝。
2. **模型序列化**:pickle、joblib、ONNX、TorchScript。
3. **環境隔離**:Docker、Conda。
4. **版本管理**:Git + DVC(Data Version Control)。
5. **監控指標**:AUC、精度、延遲、資源使用。
python
import mlflow
mlflow.sklearn.log_model(pipe, artifact_path='model')
## 6.8 版本管理與實驗追蹤(MLflow 之實務)
| 步驟 | 內容 |
|------|------|
| **實驗記錄** | `mlflow.start_run()`、`mlflow.log_params()`、`mlflow.log_metrics()` |
| **模型封裝** | `mlflow.sklearn.log_model()`、`mlflow.pyfunc.log_model()` |
| **模型復原** | `mlflow.pyfunc.load_model()` |
| **組件整合** | 在 CI/CD 中自動執行、單元測試、部署腳本 |
python
with mlflow.start_run(run_name='rf_classification'):
mlflow.log_params(param_grid)
mlflow.log_metric('f1', f1_score(y_test, pred))
mlflow.sklearn.log_model(rf, 'model')
---
## 小結
1. **從業務問題到數學模型**:先確定問題類型,再選擇適合的學習方法。\n2. **交叉驗證與參數調優**:是提升模型泛化能力的關鍵。\n3. **Pipeline 與 MLflow**:確保每一次實驗可重現,並能順利進入部署環境。\n4. **版本控制**:資料、模型、程式碼三者同時管理,避免「實驗即失效」。\n5. **部署後的監控**:模型漂移、性能退化必須即時偵測並回滾。\n
本章為下一步 **模型評估** 與 **可解釋性**(第七章)鋪陳了堅實基礎,請在實務中練習每一步,將理論轉化為可落地的預測系統。