聊天視窗

洞見數據:用分析思維駕馭數據科學 - 第 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/