返回目錄
A
數據科學的決策力:從原理到實踐 - 第 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**:機器學習的核心在於「模型能夠把**可量化的**特徵映射到正確的預測」;不管是簡單的線性模型還是複雜的集成模型,最終目標仍是提供可靠、可重現、可解釋的預測結果。透過交叉驗證、適當的評估指標與過擬合防護措施,能有效提升模型的泛化表現,並減少在實務環境中產生的「黑盒」風險。