聊天視窗

數據科學的決策力:從原理到實踐 - 第 4 章

第4章 機器學習基礎

發布於 2026-02-26 20:59

# 第4章 機器學習基礎 本章將帶領讀者從最基礎的監督式與無監督式學習演算法講起,逐步深入模型評估、交叉驗證與過擬合防護等核心概念。章末提供實際範例與最佳實踐,讓讀者能在實務專案中即時套用。 ## 4.1 監督式學習 監督式學習核心思想是利用標註資料(特徵 + 目標)來學習映射函數,進而對未見資料做預測。常見演算法可分為 **線性模型**、**樹模型** 及 **集成模型** 三大類。 ### 4.1.1 線性回歸 | 目標 | 數學表示 | 特點 | |------|----------|------| | 連續預測 | \(\hat{y}=\mathbf{w}^{\top}\mathbf{x}+b\) | 解析解易求、可微、易解釋 | | 訓練方式 | 最小平方法(OLS) | 需要數據正規化 | | 評估指標 | MSE / MAE / R² | - | #### 代碼範例 python import numpy as np from sklearn.linear_model import LinearRegression # 假設 X: 100 個樣本, 3 個特徵;y: 連續目標 X = np.random.randn(100, 3) y = X @ np.array([2.5, -1.3, 0.8]) + 0.5 + np.random.randn(100)*0.2 model = LinearRegression() model.fit(X, y) print("係數:", model.coef_) print("截距:", model.intercept_) ### 4.1.2 決策樹 決策樹透過「若/則」分裂特徵空間,適合處理非線性、離散特徵。 | 參數 | 說明 | |------|------| | `max_depth` | 樹深限制,防止過擬合 | | `min_samples_split` | 內部節點最小樣本數 | | `criterion` | 損失函數(`gini` / `entropy`) | #### 代碼範例 python from sklearn.tree import DecisionTreeClassifier from sklearn.datasets import load_iris iris = load_iris() X, y = iris.data, iris.target clf = DecisionTreeClassifier(max_depth=3, random_state=42) clf.fit(X, y) print("節點數量:", clf.tree_.node_count) ### 4.1.3 集成方法 集成方法透過結合多個弱模型得到強模型。常見類型有 **Bagging**、**Boosting** 與 **Stacking**。 | 方法 | 代表演算法 | 主要優點 | |------|------------|----------| | Bagging | Random Forest | 抗噪、降低方差 | | Boosting | Gradient Boosting, XGBoost | 逐步提升偏差、易處理非線性 | | Stacking | 多模型融合 | 可以結合不同演算法的長處 | #### 代碼範例(XGBoost) python import xgboost as xgb from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) model = xgb.XGBClassifier(n_estimators=300, learning_rate=0.05, max_depth=6, subsample=0.8) model.fit(X_train, y_train) pred = model.predict(X_test) print("Accuracy:", accuracy_score(y_test, pred)) ## 4.2 無監督式學習 無監督式學習不依賴目標變數,主要用途為資料結構探索與特徵降維。 ### 4.2.1 聚類 | 演算法 | 特點 | |--------|------| | K-Means | 基於距離的分群,收斂速度快 | | 層次聚類 | 不需要預先設定 K,易視覺化 | | DBSCAN | 能偵測噪聲、形狀任意 | #### 代碼範例(K-Means) python from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=3, random_state=42) kmeans.fit(X) print("Centroids:", kmeans.cluster_centers_) ### 4.2.2 降維 | 技術 | 目的 | |------|------| | PCA | 以方差最大化投影,保留線性結構 | | t-SNE | 非線性降維,適合視覺化高維資料 | | UMAP | 快速、保留全局結構 | #### 代碼範例(PCA) python from sklearn.decomposition import PCA pca = PCA(n_components=2) X_pca = pca.fit_transform(X) print("Explained variance ratio:", pca.explained_variance_ratio_) ## 4.3 模型評估與交叉驗證 ### 4.3.1 評估指標 | 任務 | 典型指標 | |------|----------| | 分類 | Accuracy, Precision, Recall, F1, ROC‑AUC | | 回歸 | MSE, RMSE, MAE, R² | | 聚類 | Silhouette, Davies‑Bouldin | ### 4.3.2 交叉驗證(Cross‑Validation) 交叉驗證能在有限資料上更可靠地評估模型。常見方法有 **K‑Fold**、**Stratified K‑Fold**、**Leave‑One‑Out (LOO)**。 python from sklearn.model_selection import cross_val_score from sklearn.metrics import make_scorer, roc_auc_score # 以 XGBoost 為例 model = xgb.XGBClassifier(n_estimators=200, learning_rate=0.1, random_state=42) cv_scores = cross_val_score(model, X, y, cv=5, scoring=make_scorer(roc_auc_score)) print("5‑Fold ROC‑AUC:", cv_scores.mean()) ## 4.4 過擬合防護與偏差‑變異折衷 | 觀念 | 說明 | |------|------| | **過擬合 (Over‑fitting)** | 模型在訓練集表現極佳,但泛化能力差 | | **偏差 (Bias)** | 模型假設過簡單,導致欠擬合 | | **變異 (Variance)** | 模型過於複雜,對訓練資料過度擬合 | | **Bias‑Variance Trade‑off** | 需要在兩者之間取得平衡 | ### 4.4.1 正則化與剪枝 * **L1 / L2 正則化**:在線性模型中加入懲罰項,減少係數大小。 * **剪枝 (Pruning)**:決策樹使用 `max_depth`、`min_samples_split` 等參數控制,或在 Random Forest、XGBoost 中使用 `subsample` / `colsample_bytree`。 ### 4.4.2 早停(Early Stopping) 對於 Boosting 演算法,可透過驗證集的性能監控並提前停止,減少過擬合。 python model = xgb.XGBClassifier(n_estimators=1000, learning_rate=0.01, early_stopping_rounds=20, eval_metric='logloss', eval_set=[(X_test, y_test)]) model.fit(X_train, y_train) print("最佳迭代次數:", model.best_iteration) ## 4.5 實務建議與最佳實踐 | 场景 | 建議 | |------|------| | **小樣本** | 使用簡單模型(線性回歸 / 朴素贝叶斯)或 `k-fold` 交叉驗證;避免高維稀疏資料。 | | **高維** | 先做 PCA / LDA 降維,減少特徵數目;若使用樹模型,留意 `max_features`。 | | **不平衡分類** | 采用 `class_weight='balanced'` 或 `SMOTE`;評估時優先使用 Precision‑Recall 或 ROC‑AUC。 | | **模型部署** | 優先考慮可解釋性(線性模型)或可擴充性(Random Forest);對於 XGBoost,將模型序列化為 `model.json` 或使用 `ONNX` 轉換。 | > **Takeaway**:機器學習的核心在於「模型能夠把**可量化的**特徵映射到正確的預測」;不管是簡單的線性模型還是複雜的集成模型,最終目標仍是提供可靠、可重現、可解釋的預測結果。透過交叉驗證、適當的評估指標與過擬合防護措施,能有效提升模型的泛化表現,並減少在實務環境中產生的「黑盒」風險。