返回目錄
A
資料科學在社會創新中的實戰指南 - 第 3 章
3. 機器學習模型:監督式、非監督式與強化學習
發布於 2026-03-07 15:19
# 3. 機器學習模型:監督式、非監督式與強化學習
本章將帶領讀者深入了解三大類機器學習模型的原理、適用場景與實作技巧,並以社會創新案例為例說明其落地效益。
---
## 3.1 監督式學習(Supervised Learning)
### 3.1.1 基本概念
監督式學習以「標籤(Label)」為指導,透過已知輸入-輸出對進行模型訓練,目的是預測或分類未知樣本。
| 典型任務 | 例子 | 常用演算法 |
|---|---|---|
| 分類 | 判斷社區是否屬於高風險群 | Logistic Regression、Random Forest、SVM、深度學習(CNN、LSTM) |
| 回歸 | 預測疾病發生率 | Linear Regression、Gradient Boosting、Neural Networks |
### 3.1.2 適用場景
1. **公共衛生**:根據患者歷史病歷預測疾病風險。
2. **教育**:預測學生學習成效、輔導需求。
3. **環境**:預測空氣品質、降雨量。
### 3.1.3 實作技巧
| 步驟 | 重點 |
|---|---|
| 資料準備 | - 標籤正確、平衡;- 交叉驗證 (k-fold)。 |
| 特徵工程 | - 交叉特徵;- 標準化/正則化;- 選擇重要特徵(L1/L2、Tree-based importance)。 |
| 模型選擇 | - 從簡單模型開始;- 對比多模型;- 超參數優化(Grid Search、Random Search、Bayesian Optimization)。 |
| 評估指標 | - 分類:Accuracy、Precision、Recall、F1、ROC‑AUC;- 回歸:MAE、RMSE、R²。 |
| 模型解釋 | - SHAP、LIME;- 重要特徵可視化。 |
### 3.1.4 範例:預測低收入區域的高血壓患病率
```python
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
# 1. 資料讀取
X = pd.read_csv('social_data.csv').drop('has_hypertension', axis=1)
y = pd.read_csv('social_data.csv')['has_hypertension']
# 2. 分割訓練/測試
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)
# 3. 標準化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 4. 建模
rf = RandomForestClassifier(random_state=42)
params = {'n_estimators':[100, 200], 'max_depth':[5,10, None]}
clf = GridSearchCV(rf, params, cv=5, scoring='f1')
clf.fit(X_train_scaled, y_train)
# 5. 評估
pred = clf.predict(X_test_scaled)
print(classification_report(y_test, pred))
```
---
## 3.2 非監督式學習(Unsupervised Learning)
### 3.2.1 基本概念
非監督式學習不依賴標籤,主要用於探索資料結構、分群、降維或異常偵測。
| 典型任務 | 例子 | 常用演算法 |
|---|---|---|
| 分群 | 辨識社區的相似程度 | K‑Means、DBSCAN、Hierarchical Clustering |
| 降維 | 簡化多變量資料以便視覺化 | PCA、t‑SNE、UMAP |
| 異常偵測 | 辨識突發公共衛生事件 | Isolation Forest、One‑Class SVM |
### 3.2.2 適用場景
1. **公共衛生**:分群社區以針對性干預。
2. **教育**:學生學習行為分群,提供個別化資源。
3. **環境**:辨識污染源類型、聚類氣象站。 |
### 3.2.3 實作技巧
| 步驟 | 重點 |
|---|---|
| 資料準備 | - 標準化(重要,特別是距離度量) |
| 參數選擇 | - K‑Means:選擇 k 值(Elbow、Silhouette)。 |
| 評估指標 | - 內部指標(Silhouette、Calinski‑Harabasz) |
| 可視化 | - 2D/3D 投影(PCA、t‑SNE) |
### 3.2.4 範例:基於社區指標的分群分析
```python
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
# 1. 資料讀取
data = pd.read_csv('community_metrics.csv')
features = data[['income', 'education_level', 'health_score', 'environment_index']]
# 2. 標準化
scaler = StandardScaler()
X = scaler.fit_transform(features)
# 3. K‑Means 分群
best_k = None
best_score = -1
for k in range(2, 10):
kmeans = KMeans(n_clusters=k, random_state=42)
labels = kmeans.fit_predict(X)
score = silhouette_score(X, labels)
if score > best_score:
best_score = score
best_k = k
print(f'最佳 k 值: {best_k}, Silhouette score: {best_score:.3f}')
# 4. 可視化 (PCA 2D)
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
plt.scatter(X_pca[:,0], X_pca[:,1], c=labels, cmap='viridis')
plt.title('社區分群(PCA 投影)')
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.show()
```
---
## 3.3 強化學習(Reinforcement Learning)
### 3.3.1 基本概念
強化學習(RL)透過「智能體(Agent)」在「環境(Environment)」中採取動作,並收到「獎勵(Reward)」回饋,最終學習策略以最大化累積獎勵。
| 典型任務 | 例子 | 常用框架 |
|---|---|---|
| 策略優化 | 智能資源分配、健康行為誘導 | Q‑Learning、Deep Q‑Network (DQN)、Actor‑Critic |
| 決策支援 | 公共交通路徑優化、能源調度 | PPO、A3C、DDPG |
| 自適應政策 | 動態社區教育課程安排 | REINFORCE、AlphaZero 框架 |
### 3.3.2 適用場景
1. **公共衛生**:制定動態接種策略,最小化疫苗浪費。
2. **教育**:根據學生即時反饋調整教學節奏與內容。
3. **環境**:智慧型能源管理,根據需求即時分配。 |
### 3.3.3 實作技巧
| 步驟 | 重點 |
|---|---|
| 定義環境 | - 狀態空間(State)應完整描述問題;- 行動空間(Action)可行且易於實現。 |
| 設計獎勵 | - 明確、可衡量;- 防止逆向激勵。 |
| 選擇演算法 | - 簡單問題:Q‑Learning;- 高維狀態:Deep RL(DQN、PPO)。 |
| 參數調整 | - 探索-利用平衡;- 学习率、折扣因子。 |
| 模型驗證 | - 在仿真環境中測試;- 可視化策略改變。 |
### 3.3.4 範例:動態接種優化(簡化版)
```python
import gym
import numpy as np
from stable_baselines3 import PPO
# 1. 定義自訂環境
class VaccinationEnv(gym.Env):
def __init__(self):
super().__init__()
self.observation_space = gym.spaces.Box(low=0, high=1, shape=(3,)) # 例:人口比例、感染率、疫苗庫存
self.action_space = gym.spaces.Discrete(3) # 0:不接種, 1:小規模, 2:大規模
self.state = None
def reset(self):
self.state = np.array([0.5, 0.1, 1.0]) # 初始狀態
return self.state
def step(self, action):
# 簡化的獎勵函數:減少感染率 + 考慮疫苗成本
infection_rate = self.state[1]
vaccine_stock = self.state[2]
if action == 0:
reward = -infection_rate * 10
elif action == 1 and vaccine_stock >= 0.2:
reward = -infection_rate * 8 + 1
vaccine_stock -= 0.2
elif action == 2 and vaccine_stock >= 0.5:
reward = -infection_rate * 5 + 2
vaccine_stock -= 0.5
else:
reward = -infection_rate * 10
# 更新狀態(簡化遷移)
infection_rate = max(0, infection_rate - 0.01 * action)
self.state = np.array([self.state[0], infection_rate, vaccine_stock])
done = False
return self.state, reward, done, {}
# 2. 建立環境
env = VaccinationEnv()
# 3. 训练模型
model = PPO('MlpPolicy', env, verbose=1)
model.learn(total_timesteps=5000)
# 4. 測試策略
obs = env.reset()
for _ in range(10):
action, _states = model.predict(obs, deterministic=True)
obs, reward, done, info = env.step(action)
print(f'Action: {action}, Reward: {reward:.2f}')
```
---
## 3.4 小結
| 類型 | 主要用途 | 典型演算法 | 適用社會創新領域 |
|---|---|---|---|
| 監督式 | 預測、分類 | Random Forest、XGBoost、Deep Learning | 疾病風險評估、學業成就預測、空氣質量預測 |
| 非監督式 | 分群、異常偵測 | K‑Means、DBSCAN、Isolation Forest | 社區分群、突發事件偵測、資料降維 |
| 強化學習 | 動態決策、策略優化 | PPO、DQN、A3C | 疫苗接種策略、教育資源分配、能源管理 |
> **實務提醒**:在社會創新專案中,模型選型不僅要考慮技術效能,還必須兼顧數據可得性、可解釋性與法律合規。跨域合作、持續迭代與利益相關者溝通,是成功落地的關鍵。