返回目錄
A
洞見數據:用分析思維駕馭數據科學 - 第 6 章
第六章 機器學習基礎
發布於 2026-02-27 02:26
# 第六章 機器學習基礎
在前面章節,我們已經掌握了數據收集、清洗與探索分析的完整流程。本章將把重點放在「機器學習」—將清洗好的資料轉化為可操作模型的關鍵技術。章節將分為三大類型的學習(監督式、非監督式、強化學習),並說明模型選擇、特徵工程以及實際落地時的注意事項。
---
## 6.1 監督式學習
監督式學習(Supervised Learning)是最常見的機器學習類型。它以「有標籤」的樣本作為訓練資料,學習輸入特徵與輸出標籤之間的映射關係。
### 6.1.1 常見任務
| 任務 | 描述 | 典型演算法 |
|------|------|------------|
| 分類 | 目標是預測離散類別 | Logistic Regression、Decision Tree、Random Forest、SVM、XGBoost |
| 回歸 | 目標是預測連續數值 | Linear Regression、Ridge/Lasso、SVR、Gradient Boosting |
| 目標檢測 | 圖像/視頻中的物件定位 | Faster R‑CNN、YOLO、SSD |
### 6.1.2 基本流程
1. **資料拆分**:將資料分成訓練集、驗證集、測試集(典型比例 60/20/20)。
2. **特徵工程**:離散化、標準化、編碼等。
3. **模型選擇**:根據問題性質與可解釋性需求選擇演算法。
4. **訓練與驗證**:利用交叉驗證或早停(Early Stopping)控制過擬合。
5. **評估**:使用適合任務的指標(Accuracy、F1、RMSE 等)。
6. **部署**:將模型序列化(如 `pickle`、`joblib`)並放入 API 或微服務。
#### 範例:使用 XGBoost 進行二元分類
python
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
X, y = load_data() # 假設已經載入特徵矩陣與標籤
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)
# 轉為 DMatrix,XGBoost 的原生資料格式
train_dmatrix = xgb.DMatrix(X_train, label=y_train)
val_dmatrix = xgb.DMatrix(X_val, label=y_val)
params = {
'objective': 'binary:logistic',
'eval_metric': 'auc',
'max_depth': 6,
'eta': 0.1
}
evals = [(train_dmatrix, 'train'), (val_dmatrix, 'eval')]
model = xgb.train(params, train_dmatrix, num_boost_round=500, evals=evals, early_stopping_rounds=20)
preds = model.predict(val_dmatrix)
print('AUC:', roc_auc_score(y_val, preds))
## 6.2 非監督式學習
非監督式學習(Unsupervised Learning)處理無標籤資料,旨在挖掘資料內在結構與模式。
### 6.2.1 常見任務
| 任務 | 描述 | 典型演算法 |
|------|------|------------|
| 聚類 | 將資料分成相似群組 | K‑Means、Hierarchical Clustering、DBSCAN |
| 降維 | 將高維資料投影至低維空間 | PCA、t‑SNE、UMAP |
| 異常偵測 | 找出與大多數資料差異巨大的樣本 | Isolation Forest、One‑Class SVM |
### 6.2.2 典型工作流程
1. **特徵標準化**:許多非監督演算法對尺度敏感。
2. **參數選擇**:例如 K‑Means 的 `k` 值,可透過肘部法則(Elbow Method)或輪廓係數(Silhouette)判斷。
3. **模型評估**:使用内部指標(如 Davies–Bouldin 指數)或外部指標(若有部分標籤)。
4. **可視化**:使用散點圖、熱力圖、t‑SNE 散佈圖呈現結果。
#### 範例:K‑Means 聚類並可視化
python
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
X = load_features()
X_scaled = StandardScaler().fit_transform(X)
kmeans = KMeans(n_clusters=4, random_state=0)
labels = kmeans.fit_predict(X_scaled)
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=labels, cmap='viridis')
plt.title('K‑Means 聚類結果')
plt.xlabel('特徵 1')
plt.ylabel('特徵 2')
plt.show()
## 6.3 強化學習
強化學習(Reinforcement Learning, RL)是一種透過與環境互動、獲取回饋(Reward)來學習最適策略的框架。它適合需要動態決策、長期效益最大化的場景,例如遊戲 AI、推薦系統、機器人控制。
### 6.3.1 核心概念
| 概念 | 說明 |
|------|------|
| Agent | 學習者,做出行動的實體 |
| Environment | Agent 所處的世界,返回狀態與回饋 |
| State | 環境在某時間點的描述 |
| Action | Agent 可採取的行為 |
| Reward | Agent 針對 Action 所獲得的回饋 |
| Policy | 將 State 映射至 Action 的策略 |
| Value Function | 估算 State 或 State‑Action 的長期回報 |
### 6.3.2 典型演算法
- **基於值的**:Q‑Learning、Deep Q‑Network (DQN)。
- **基於策略的**:REINFORCE、Actor‑Critic、Proximal Policy Optimization (PPO)。
- **離散 vs. 連續**:離散環境常用 Q‑Learning,連續環境則多用 Policy Gradient 或 Actor‑Critic。
### 6.3.3 實務示範:使用 OpenAI Gym 進行 CartPole DQN
python
import gym
import numpy as np
import tensorflow as tf
from tensorflow.keras import layers
env = gym.make('CartPole-v1')
# Q‑網路定義
inputs = layers.Input(shape=(env.observation_space.shape[0],))
hidden = layers.Dense(64, activation='relu')(inputs)
q_values = layers.Dense(env.action_space.n)(hidden)
model = tf.keras.Model(inputs, q_values)
optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
# 基本 DQN 迴圈
for episode in range(300):
state = env.reset()
done = False
total_reward = 0
while not done:
state_np = np.expand_dims(state, axis=0)
q_vals = model(state_np)
action = np.argmax(q_vals.numpy()) # epsilon‑greedy 可加入
next_state, reward, done, _ = env.step(action)
total_reward += reward
# 簡化版的更新(不含 replay buffer)
with tf.GradientTape() as tape:
q_val = model(state_np)[0, action]
target = reward + 0.99 * tf.reduce_max(model(np.expand_dims(next_state, 0)))
loss = tf.keras.losses.mean_squared_error(target, q_val)
grads = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
state = next_state
print(f"Episode {episode+1}: 總回報 {total_reward}")
> **注意**:強化學習需要大量互動、穩定的回饋設計,並且往往伴隨較高的計算成本與對安全性的嚴格要求。
## 6.4 模型選擇與評估
### 6.4.1 何時選擇哪種演算法?
| 情境 | 推薦演算法 |
|------|-----------|
| 需要高可解釋性 | 線性模型、Logistic Regression、Decision Tree |
| 追求極致預測精度 | Boosting 系列、Neural Network |
| 資料標籤稀缺 | 半監督式學習、堆疊 (Stacking) |
| 高維資料 | SVM + Kernel、Neural Network |
| 強調資料分佈結構 | 聚類、降維前置,進行特徵分群 |
### 6.4.2 評估指標比較
| 任務 | 指標 | 什麼時候優先使用 |
|------|------|------------------|
| 分類 | Accuracy、Precision、Recall、F1‑Score、AUC‑ROC | 標籤平衡時可用 Accuracy,非平衡時更偏向 F1 或 AUC |
| 回歸 | RMSE、MAE、R² | 想衡量預測誤差的平方或平均值 |
| 聚類 | Silhouette Coefficient、Davies–Bouldin | 無標籤資料中,衡量群集質量 |
| 強化學習 | Total Reward、Average Episode Length | 目標是長期回報最大化 |
## 6.5 特徵工程:從原始數據到模型輸入
特徵工程是機器學習成功的關鍵。以下列出最常用的技巧,並以 Python 範例說明其實作。
### 6.5.1 標準化與正則化
| 方法 | 目的 |
|------|------|
| StandardScaler | 將特徵縮放到均值 0、標準差 1 |
| MinMaxScaler | 將特徵壓縮至 [0, 1] 範圍 |
| RobustScaler | 對離群點不敏感,使用中位數與 IQR |
python
from sklearn.preprocessing import StandardScaler, OneHotEncoder
# 數值型特徵標準化
X_num = StandardScaler().fit_transform(X_num)
# 分類特徵 one‑hot 編碼
X_cat = OneHotEncoder(sparse=False).fit_transform(X_cat)
X_processed = np.hstack([X_num, X_cat])
### 6.5.2 變量轉換
- **對數變換**:處理右偏分布。
- **平方根/Box‑Cox**:改善正態性。
- **時間特徵**:提取「星期幾」「季節」「日誌」等。
### 6.5.3 特徵選擇
- **統計檢驗**:ANOVA、Chi‑Square 用於評估特徵與標籤的相關性。
- **樹模型的重要性**:`feature_importances_` 或 `XGBoost` 的 `feature_importance`。
- **L1 正則化**:自動消除不重要特徵。
---
## 6.6 小結
| 監督式 | 非監督式 | 強化學習 |
|--------|----------|----------|
| 透過標籤學習輸入‑輸出映射 | 挖掘資料內在結構 | 透過互動學習長期策略 |
| 常見演算法:XGBoost、SVM 等 | 常見演算法:K‑Means、PCA 等 | 常見演算法:DQN、PPO 等 |
| 評估指標:Accuracy、RMSE 等 | 評估指標:Silhouette、DB‑Score 等 | 評估指標:累積回報、Episode 時間 |
> **實務提示**:在選擇演算法前,先確認「可解釋性」「計算成本」「模型更新頻率」等商業需求,避免因追求「最佳」指標而忽略部署與監控成本。
---
> **引用**:本章內容與第二章(資料探索與特徵工程)以及第四章(模型選擇與調參)高度相關,讀者可參照以建立完整的機器學習工作流。
---
### 章節練習
1. 在 Kaggle 上挑選一個「二元分類」或「回歸」題目,完成資料拆分、特徵工程、模型訓練、評估與部署。
2. 使用 `scikit‑learn` 的 `Pipeline` 將特徵工程與模型訓練整合,並寫一段自動化測試腳本。
3. 在 `OpenAI Gym` 選擇一個離散環境,實作簡易 Q‑Learning,並觀察訓練過程中的收斂行為。
---
### 參考文獻
- Bishop, C. M. *Pattern Recognition and Machine Learning*. Springer, 2006.
- Goodfellow, I., Bengio, Y., Courville, A. *Deep Learning*. MIT Press, 2016.
- Sutton, R. S., Barto, A. G. *Reinforcement Learning: An Introduction*. MIT Press, 2018.
- OpenAI Gym: https://gym.openai.com/