聊天視窗

數據科學實戰:從問題到洞見 - 第 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 本章為下一步 **模型評估** 與 **可解釋性**(第七章)鋪陳了堅實基礎,請在實務中練習每一步,將理論轉化為可落地的預測系統。