跳轉到

Géron《Hands-On ML》Ch1–9 重點整理

本文整併自《Hands-On Machine Learning with Scikit-Learn, Keras & TensorFlow》(Aurélien Géron)第 1–9 章的學習筆記,聚焦核心觀念 + 最小可跑的 scikit-learn 範例 + DS 面試常考點。每章末附「面試口答範本」,是用來練習把觀念講清楚的,而不是背稿。

全書心智圖

第 1–9 章其實是一條完整的路:先建立 ML 的世界觀(Ch1),走一遍端到端專案(Ch2),再逐一深入分類與評估(Ch3)、線性模型與訓練原理(Ch4)、三大經典模型家族(Ch5 SVM、Ch6 樹、Ch7 集成),最後進入非監督的兩支主力——降維(Ch8)與分群(Ch9)。

主題 一句話重點
Ch1 ML 全景 ML 是「從資料學規則」,規則太複雜或會變就用它
Ch2 端到端專案 測試集最後才碰,用 Pipeline 防 leakage
Ch3 分類 & 評估 imbalanced 不能看 accuracy,看 P/R/F1/AUC
Ch4 訓練模型 梯度下降是訓練核心,正則化是抗過擬合主力
Ch5 SVM 最大化 margin,kernel 把非線性丟到高維變線性
Ch6 決策樹 白盒、不需縮放,但易過擬合、不穩定
Ch7 集成學習 三個臭皮匠:Bagging 降變異、Boosting 降偏差
Ch8 降維 PCA 抓最大變異方向;t-SNE/UMAP 只拿來視覺化
Ch9 非監督 K-Means 要先定 k,DBSCAN 找任意形狀+抓離群

Ch1|The Machine Learning Landscape(ML 全景)

核心定義

  • Arthur Samuel (1959):讓電腦不需明確程式設計就能學習的研究領域。
  • Tom Mitchell (1997):程式在任務 T 上、用評估指標 P 衡量的表現,隨經驗 E 提升,就稱為「學習」。

什麼時候 ML 比傳統程式設計好?

  • 規則太複雜或根本不知道(垃圾郵件、語音辨識)
  • 環境會變、需要持續適應(詐欺偵測)
  • 資料量大到人工規則無法維護
  • 想反過來用模型幫人理解問題(Data Mining)

ML 系統的三條分類軸

  1. 是否有監督:Supervised/Unsupervised/Semi-supervised/Self-supervised/Reinforcement。
  2. 能否增量學習
  3. Batch(離線):一次訓練好,定期整批重訓。
  4. Online(線上):持續吃新資料即時更新;learning_rate 太高會「忘掉」舊資料。
  5. 如何泛化
  6. Instance-based:記住樣本、用相似度預測(KNN)。
  7. Model-based:從資料建模型再預測(線性回歸)。

完整 ML 專案流程(全書主軸)

定義問題(商業目標)→ 收集資料 → EDA → 資料準備(特徵工程)→ 選模型訓練 → 調超參數 → 部署監控。

常見陷阱

  • 資料面:資料不足、不具代表性(Sampling Bias)、品質差(異常/缺失)、無關特徵(garbage in, garbage out)。
  • 模型面:Overfitting(記住雜訊)、Underfitting(太簡單抓不到結構)。

No Free Lunch 定理

沒有任何模型在所有問題上都最好。必須依資料與問題選模型,並用交叉驗證比較。

🎤 面試口答重點

  • ML vs 傳統程式:傳統是人把規則寫死(資料+規則→答案);ML 是給資料+答案,讓機器自己找規則。規則太複雜或會變就用 ML。
  • Batch vs Online:資料可控、變化慢用 Batch(如月底重訓);資料流不斷、環境變化快用 Online(如詐欺偵測),但要小心 learning_rate。
  • Sampling Bias:訓練資料分佈與真實世界不一致。經典案例是 1936 美國大選電話民調——只有有錢人有電話,樣本不代表全體。
  • No Free Lunch:沒有萬用模型,所以要試多種、用 CV 比較,讓資料說話。

Ch2|End-to-End ML Project(端到端專案)

以加州房價預測為例走完整流程。這章是全書的骨架。

Step 1:定義問題

從商業目標 → 技術問題 → 評估指標。輸出連續 → 回歸;釐清可接受誤差、上下游 pipeline 的資料格式。

Step 2:載入與快速瀏覽

import pandas as pd
df = pd.read_csv('housing.csv')
df.head(); df.info(); df.describe()
df['ocean_proximity'].value_counts()

Step 3:先切測試集(最關鍵)

必須在 EDA 之前切,否則你的眼睛「看過」測試集就等於 leakage。imbalanced 時用分層抽樣:

from sklearn.model_selection import train_test_split, StratifiedShuffleSplit
import numpy as np

df['income_cat'] = pd.cut(df['median_income'],
                          bins=[0, 1.5, 3.0, 4.5, 6., np.inf], labels=[1,2,3,4,5])
split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
for tr, te in split.split(df, df['income_cat']):
    strat_train, strat_test = df.loc[tr], df.loc[te]

Step 4:EDA(只在訓練集上做)

分佈圖 df.hist()、地理散佈圖、相關係數 df.corr()['median_house_value']scatter_matrix

Step 5:資料準備用 Pipeline 包起來

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.compose import ColumnTransformer

num_pipeline = Pipeline([
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler',  StandardScaler()),
])
full_pipeline = ColumnTransformer([
    ('num', num_pipeline, num_attribs),
    ('cat', OneHotEncoder(), ['ocean_proximity']),
])
housing_prepared = full_pipeline.fit_transform(strat_train)

Step 6–7:多模型比較 → 調參

先用 cross_val_score 比較 LinearRegression/DecisionTree/RandomForest,再對最佳者用 GridSearchCVRandomizedSearchCV 調參。CV 分數比 training score 可信。

本章四個觀念

  1. 測試集最後才碰,提前看 = leakage。
  2. 用 Pipeline 包前處理+模型,防 leakage 又方便部署。
  3. 先多模型快速比較,再選最好的調參。
  4. CV 分數 > training score。

🎤 面試口答重點

  • 為何 EDA 前先切測試集:先看過測試集分佈,會在特徵選擇/填補/設計上不自覺針對它做決策,測試分數過度樂觀,部署後變差。
  • Pipeline 好處:① 防 leakage(fit 只看訓練集,transform 用同參數套用驗證/測試);② 方便部署(前處理+模型包成一個物件)。
  • Grid vs Randomized:超參數少、範圍明確用 Grid;多/廣/首次探索用 Randomized。實務先 Randomized 縮範圍,再 Grid 精調。
  • Stratified vs 一般切分:一般隨機切可能讓類別分佈不一致;imbalanced 一定要分層,否則測試集可能完全沒有少數類別。

Ch3|Classification(分類與評估指標)

主軸是 MNIST 手寫數字辨識,從二元分類「是不是 5」切入。

不要相信 Accuracy

imbalanced 時,模型只要永遠猜多數類就有高 accuracy。用 DummyClassifier(永遠猜「不是 5」)也能拿到 ~90%。imbalanced 一定要看 F1 或 AUC。

Confusion Matrix → Precision / Recall

from sklearn.model_selection import cross_val_predict
from sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_score

y_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)
confusion_matrix(y_train_5, y_pred)
precision_score(...)  # 預測為正的,多少真的是正
recall_score(...)     # 所有真正的正,抓到多少
f1_score(...)         # 兩者調和平均

混淆矩陣示意 圖:混淆矩陣。對角(TP/TN)為答對;FN=漏報、FP=誤報。Precision=TP/(TP+FP)、Recall=TP/(TP+FN)。

Threshold 調整與業務情境

decision_function 取分數,畫 precision-recall 曲線後依情境定 threshold: - 癌症篩檢 → 調低 threshold → 拉高 Recall(寧可誤報) - 垃圾郵件 → 調高 threshold → 拉高 Precision(不誤判重要信)

ROC / AUC 與曲線選擇

roc_curve + roc_auc_scorePositive 樣本很少(imbalanced)用 PR curve,因為 ROC 的 FPR 會被大量 Negative 稀釋,看起來漂亮卻不真。

ROC 曲線與 AUC 圖:ROC 曲線越往左上、AUC(曲線下面積)越大;對角虛線=隨機猜測(AUC=0.5)。

多元分類:OvR vs OvO

  • OvR:訓 N 個「是不是這類」,選分數最高。快。
  • OvO:訓 N×(N−1)/2 個,每對一個,投票。SVM 因訓練時間對資料量敏感而偏好 OvO。

🎤 面試口答重點

  • imbalanced 不能只看 accuracy:全猜多數類就能騙高分(99% 正常/1% 詐騙 → 全猜正常也 99%),詐騙全漏。要看 P/R/F1 或 PR curve。
  • Precision vs Recall 怎麼選:看哪種錯誤代價大。癌症漏診嚴重 → 最大化 Recall;誤判重要信嚴重 → 最大化 Precision;都重要看 F1。
  • PR vs ROC:Positive 很少時用 PR curve(ROC 會被 Negative 稀釋而虛高)。
  • OvR vs OvO:OvR N 個分類器、快;OvO N×(N−1)/2 個、每個訓練資料少,SVM 偏好。

Ch4|Training Models(訓練模型:梯度下降與正則化)

線性回歸的兩種解法

  • 解析解 Normal Equationθ = (XᵀX)⁻¹Xᵀy。要求逆矩陣,複雜度 O(n³),特徵數大就很慢(~10 萬就不可行)。
  • 梯度下降:對特徵數是線性複雜度,高維時改用它。
    # Batch Gradient Descent
    theta = np.random.randn(2, 1)
    for _ in range(n_epochs):
        gradients = (2/m) * X_b.T @ (X_b @ theta - y)
        theta -= eta * gradients      # eta = learning rate
    

Polynomial Regression

線性模型也能學非線性——加入次方項即可(PolynomialFeatures(degree=2)[x][x, x²])。degree 太高會 overfit。

Learning Curve(診斷 bias/variance 的工具)

learning_curve 畫訓練/驗證誤差對資料量的曲線: - 兩條線都高且靠近 → Underfitting(high bias):加特徵、換更強模型。 - 訓練低、驗證高、兩線分很開 → Overfitting(high variance):加正則化、加資料、刪特徵。

正則化線性模型

模型 懲罰 效果 何時用
Ridge (L2) Σθ² 係數均勻縮小、不歸零 預設、不確定時
Lasso (L1) Σ|θ| 不重要係數直接歸零(自動特徵選擇) 特徵多、疑多數無用
Elastic Net L1+L2(l1_ratio 兩者折衷 特徵數 > 樣本數

注意參數方向:Ridge/Lassoalpha 越大正則化越強;LogisticRegressionC = 1/λ越小正則化越強(方向相反)。

Early Stopping

驗證誤差開始回升就停止訓練——本質上是一種正則化(防止模型把訓練越久越記住雜訊)。

🎤 面試口答重點

  • Normal Equation 何時不適用:O(n³) 要求逆矩陣,特徵數大就很慢,改用梯度下降(對特徵數線性)。
  • Learning curve 怎麼讀:兩線都高=underfitting(加特徵/換模型);兩線分很開=overfitting(加正則化/加資料/刪特徵)。
  • Ridge/Lasso/Elastic Net:不確定用 Ridge;特徵多疑多數無用用 Lasso(自動特徵選擇);特徵數>樣本數用 Elastic Net。
  • Early stopping 是正則化嗎:是。在驗證誤差回升時停,防死記訓練集,效果類似 L2。

Ch5|Support Vector Machines(SVM 與 Kernel Trick)

核心直覺

目標是找最大化 margin的決策邊界;落在邊界上的點叫 Support Vectors(移掉其他點不影響邊界)。

Hard vs Soft Margin

  • Hard:所有點必須在正確側,對 outlier 零容忍,現實幾乎不用。
  • Soft:允許少數越界,用 C 控制:C 大 → margin 小、不容違規 → 易 overfit;C 小 → margin 大、較簡單。
# SVM 必須先標準化!
svm_clf = Pipeline([('scaler', StandardScaler()),
                    ('svm', SVC(kernel='rbf', C=1.0, gamma='scale'))])

Kernel Trick

線性不可分時,映射到高維變線性可分;kernel 的妙處是不真的算高維座標,直接算高維內積。常用核:Linear、Polynomial、RBF(預設最常用,參數 γ)、Sigmoid。 - γ 大 → 單點影響範圍小 → 易 overfit;γ 小 → 範圍大 → 較平滑。

兩大缺點

  1. 樣本數大時很慢(O(m²)~O(m³))。
  2. 對特徵尺度非常敏感——新手最常忘記標準化。

🎤 面試口答重點

  • C 與 γ:C 控制容許違規程度(大→margin 小易 overfit);γ(RBF 專屬)控制單點影響範圍(大→範圍小易 overfit)。
  • Kernel Trick:低維線性不可分 → 高維可分;不需真的映射,直接算高維內積,省計算。
  • 為何必須標準化:margin 用歐氏距離,若一特徵 10000、另一 0.1,距離被大數值主導,margin 偏斜。
  • SVM vs Random Forest:資料少且高維(文字 TF-IDF)用 SVM;資料大、要可解釋、特徵多雜用 RF(快、免標準化、有 importance)。

Ch6|Decision Trees(決策樹)

運作原理(CART)

逐步找「特徵 k + 閾值 t」把資料切成最「純」的兩組。不純度指標: - Gini 1 − Σpᵢ²(sklearn 預設、較快) - Entropy −Σpᵢlog pᵢ(結果相近、稍慢)

抗 overfitting 的超參數

max_depthmin_samples_splitmin_samples_leafmax_featuresmax_leaf_nodes——決策樹極易 overfit,一定要限制

回歸樹:對新點預測其所屬葉節點內訓練樣本的平均值。

優缺點

  • :可解釋(可視覺化)、不需標準化、數值/類別皆可、訓練快。
  • :極易 overfit、不穩定(資料小變動 → 樹差很多)→ 這正是要用 Random Forest 的原因。

🎤 面試口答重點

  • Gini vs Entropy:都是不純度指標,Gini 較快、結果相近,實務用預設 Gini。
  • 為何不需標準化:CART 分裂只看大小順序(閾值切兩邊),與絕對數值無關,縮放不改變分裂——樹模型全家都免標準化。
  • CART 為何 greedy:全局最佳分裂是 NP-hard,只能每層貪心;代價是不保證全樹最佳、結果不穩 → 用 RF 從外部建立穩定性。
  • feature importance:看每個特徵在所有分裂節點降低多少不純度的加權平均;樹模型家族共通(RF 同法)。

Ch7|Ensemble Learning & Random Forests(集成學習)

核心思想

多個較弱的學習器組合可能勝過單一強模型——前提是各模型彼此獨立、具多樣性

Voting

  • Hard voting:多數決。
  • Soft voting:平均預測機率(通常更好,但成員需能輸出機率,SVC(probability=True))。

Bagging / Pasting 與 OOB

  • Bagging=有放回抽樣分給各模型;Pasting=無放回。bootstrap=True/False 切換。
  • OOB 評估:Bagging 每棵樹平均用到約 63% 樣本,剩 ~37% 沒參與,天然當驗證集(oob_score=True 免費拿到 validation score)。

Random Forest

比「Bagging + 決策樹」更好的關鍵:每次分裂只看隨機子集特徵,降低樹間相關性、增加多樣性。Extra-Trees 連分裂閾值也隨機選,更快但 bias 略高。

Boosting

  • AdaBoost:每輪提高上一輪被分錯樣本的權重,最後加權投票。
  • Gradient Boosting(業界主力):每棵新樹去擬合前面的殘差。learning_raten_estimators 要一起調(學習率小→需要更多樹);subsample<1 變 Stochastic GB 可防 overfit;可用 staged_predict 做 early stopping。

Stacking

對各基模型的預測再訓練一個 blender;blender 必須用 hold-out(模型沒見過的資料)訓練,否則學到過度樂觀的權重。

🎤 面試口答重點

  • Bagging vs Boosting:Bagging 並行、各自從子集訓練後投票/平均,降 variance;Boosting 序列、後者專攻前者的錯誤,降 bias
  • RF 為何優於 Bagging+樹:多了「分裂只看隨機特徵子集」,否則各樹都先選同一最強特徵 → 高度相關,投票失去意義。
  • OOB 為何約 37%:有放回抽樣下每樣本被選中機率約 63%,剩 ~37% 形成天然驗證集。
  • Stacking blender 為何用沒見過的資料:用訓練集預測來訓 blender 會過度樂觀;hold-out 才能學到「新資料上各層怎麼整合最好」。

Ch8|Dimensionality Reduction(降維)

為什麼降維

對抗維度詛咒(高維下資料稀疏、距離失義)、加速訓練、去雜訊,以及最重要的視覺化(壓到 2D/3D)。

PCA

找資料變異最大的方向(對共變異矩陣做 SVD,特徵向量=主成分,彼此正交、變異依次遞減)投影。

from sklearn.decomposition import PCA
pca = PCA(n_components=0.95)          # 直接保留 95% 變異
X_reduced = pca.fit_transform(X_train)
pca.explained_variance_ratio_         # 每個主成分解釋的變異比
資料大到記憶體裝不下用 IncrementalPCA;極高維 sparse(文字)可用 Random Projection。

視覺化專用:t-SNE / UMAP

擅長呈現集群結構(UMAP 比 t-SNE 快、更保留全局結構)。只能用於視覺化,不可當特徵前處理——它們是 transductive,新資料沒有固定函數可 transform。

🎤 面試口答重點

  • 主成分是什麼/怎麼找:資料變異最大的方向,對共變異矩陣 SVD 求特徵向量;兩兩正交、變異遞減。
  • 降維後新資料怎麼預測:用訓練集 fit 的同一 PCA 物件 transform 再進模型;包進 Pipeline 就不會忘。
  • t-SNE/UMAP 為何不能做特徵工程:transductive,新點無固定 transform;且計算貴。PCA 有明確 fit/transform 分離才適合前處理。
  • 變異解釋比:各主成分佔總變異的百分比;累積到門檻(如 0.95)即可決定取幾個。

Ch9|Unsupervised Learning(K-Means / DBSCAN / GMM)

K-Means

隨機初始化 K 個質心 → 分配最近 → 更新質心 → 反覆至收斂。KMeans++(預設)讓初始質心彼此遠離。選 K:Inertia 手肘圖Silhouette Score(−1~1,越高越好)。 限制:假設球形、尺度相近、必須先給 K、對 outlier 敏感

DBSCAN

密度定群(eps 半徑內鄰居數 ≥ min_samples 即核心點),不需指定 K、能找任意形狀、自動標 outlier(label = −1);缺點是高維表現差。

GMM

輸出機率(軟分配,處理群組重疊更自然)、假設橢圓形(比球形靈活),低機率密度樣本可做異常檢測

K-Means DBSCAN GMM
需指定 K
群組形狀 球形 任意 橢圓
處理 outlier
輸出 硬分群 分群+outlier 機率

🎤 面試口答重點

  • K-Means 是全局最佳嗎:否,greedy 只收斂到局部最佳;故 n_init 多次取 inertia 最小。
  • 為何對狹長群組差:用歐氏距離、假設球形;狹長群邊緣點離自群質心反而更遠 → 分錯。改用 DBSCAN/GMM。
  • DBSCAN 為何免指定 K:用密度定群,群數自然浮現;不屬任何群的標 −1 即 outlier。
  • GMM vs K-Means:GMM 軟分配輸出機率、橢圓形假設更靈活、可做異常檢測;K-Means 是硬分配、球形。

一頁總複習(面試前掃這個)

  • 評估:imbalanced 看 P/R/F1/AUC,不看 accuracy;Positive 少用 PR curve。
  • 訓練:梯度下降是核心;learning curve 診斷 bias/variance。
  • 正則化:Ridge 縮小不歸零、Lasso 歸零(選特徵)、Elastic Net 折衷;early stopping 也是正則化。
  • 模型抉擇:高維小資料→SVM(要標準化);要可解釋/免標準化/有 importance→樹家族。
  • 集成:Bagging 降 variance(RF)、Boosting 降 bias(GBDT/XGBoost)。
  • 降維:PCA 抓最大變異;t-SNE/UMAP 只視覺化。
  • 分群:要先給 K 且球形→K-Means;任意形狀+抓 outlier→DBSCAN;要機率+異常檢測→GMM。

📌 延伸:樹模型家族(RF/XGBoost/LightGBM)、特徵工程、評估指標等主題另見〈ML 面試核心觀念〉與〈特徵工程心法〉。