聊天視窗

資料科學在社會創新中的實戰指南 - 第 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 | 疫苗接種策略、教育資源分配、能源管理 | > **實務提醒**:在社會創新專案中,模型選型不僅要考慮技術效能,還必須兼顧數據可得性、可解釋性與法律合規。跨域合作、持續迭代與利益相關者溝通,是成功落地的關鍵。