⭐ 答題得分:0 / 0
SUPERVISED / UNSUPERVISED · L23 · 機器學習技術與應用
監督式 / 非監督式學習完全攻略
決策樹、SVM、K-Means 3D動態聚類、PCA降維、F1/Precision/Recall/ROC/AUC,對應 iPAS 中級科目三核心考點
決策樹 SVM K-Means 3D PCA ROC / AUC
🎯 監督式 vs 非監督式學習
兩大學習典範對照表
特徵監督式(Supervised)非監督式(Unsupervised)
訓練資料有標籤(labeled)無標籤(unlabeled)
目標學習輸入→輸出映射發現資料內在結構
代表算法決策樹、SVM、邏輯迴歸、隨機森林K-Means、PCA、DBSCAN、階層聚類
任務類型分類、迴歸聚類、降維、異常偵測
評估方式Accuracy、F1、AUC-ROC輪廓係數(Silhouette)、Elbow Method
典型應用垃圾郵件分類、房價預測客戶分群、特徵壓縮
📌 考試重點:「K-Means、PCA 屬於監督式還是非監督式?」→ 答案:非監督式(不需標籤);SVM、決策樹→監督式
🌳 決策樹(Decision Tree)
基於資訊增益遞迴分割的白箱分類算法

決策樹用基尼不純度(Gini Impurity)資訊增益(Information Gain)選擇最佳分割特徵,每個節點代表一個條件判斷,葉節點代表類別預測。

// 基尼不純度 (Gini Impurity) — 考試高頻公式
Gini(D) = 1 − Σ pᵢ²   // pᵢ = 第i類的比例,範圍 [0, 0.5]

// 資訊熵 (Entropy)
H(D) = − Σ pᵢ · log₂(pᵢ)

// 資訊增益 = 父節點熵 − 加權子節點熵
IG = H(D) − Σ (|Dᵥ|/|D|) · H(Dᵥ)
年齡 < 30? Gini = 0.48 是 (52%) 否 (48%) 收入 > 5萬? Gini = 0.32 工作年資 > 5? Gini = 0.41 ✓ 購買 P = 75% ✗ 不購買 P = 68% ✓ 購買 P = 82% ✗ 不購買 P = 71% 深度 0 深度 1 葉節點
優點
可解釋性高(白箱模型)、不需特徵縮放、可處理類別特徵、決策路徑可視化
WHITE BOX
缺點
容易過擬合(需剪枝 Pruning)、對雜訊敏感、不穩定(微小資料變化影響大)
OVERFITTING RISK
隨機森林(改進)
Bagging + 多棵決策樹多數投票,降低方差、提高泛化能力,犧牲部分可解釋性
ENSEMBLE
⚡ 支援向量機(SVM)— 3D 超平面互動
尋找最大間隔超平面,3D 視覺化(可拖曳旋轉)

SVM 的核心目標是找到能最大化間隔(Margin)的分離超平面。最靠近超平面的樣本點稱為支援向量(Support Vectors),以橙色菱形標示。

// 超平面方程式:w 為法向量,b 為偏置
wx + b = 0

// 最佳化目標:最大化間隔 Margin = 2/||w||
min  ½||w||²  // s.t. yᵢ(wᵀxᵢ+b) ≥ 1

// 核技巧:RBF Kernel — 隱式映射至高維空間
K(xᵢ,xⱼ) = exp(−γ||xᵢxⱼ||²)
🖱 拖曳旋轉視角 · 藍=正類 · 粉=負類 · 橙色菱形=支援向量 · 黃色平面=最大間隔超平面
C 參數(正則化)
C 大 → 間隔窄、誤分類懲罰高(易過擬合)
C 小 → 間隔寬、容許更多錯誤(易欠擬合)
REGULARIZATION
γ 參數(RBF 核)
γ 大 → 每個支援向量影響範圍小(過擬合)
γ 小 → 影響範圍大(欠擬合)
KERNEL WIDTH
核技巧優勢
無需顯式計算高維映射,直接用內積 K(xᵢ,xⱼ) 代替,實現非線性分類,計算高效
KERNEL TRICK
🔵 K-Means 聚類(3D 動態展示)
迭代指派-更新的無監督聚類算法 — Three.js 互動

K-Means 反覆執行指派(Assignment)更新(Update),直到聚類中心不再移動。3D 空間中可觀察到點被分配給最近的中心後,中心向各組均值收斂。

// 目標:最小化組內平方和 WCSS(Inertia)
J = Σₖ Σᵢ∈Cₖ ||xᵢμₖ||²

// Step 1 指派:每個點分配給最近的中心
cᵢ = argminₖ ||xᵢμₖ||²

// Step 2 更新:重新計算各組均值
μₖ = 1/|Cₖ| · Σᵢ∈Cₖ xᵢ
點擊「執行一步」逐步觀察聚類中心(菱形)如何向資料均值收斂 · 拖曳旋轉 3D 視角
Elbow Method
繪製 K vs WCSS 折線圖,在「手肘彎折處」選最佳 K 值——該點後下降幅度明顯減緩
CHOOSE K
K-Means 限制
①需預設 K 值 ②對初始中心敏感(K-Means++ 改善)③僅適合球形群組 ④對離群值敏感
LIMITATIONS
K-Means vs DBSCAN
DBSCAN 不需預設 K,能偵測任意形狀群組,自動標記離群點為雜訊(Noise)
DENSITY-BASED
📐 主成分分析(PCA)
無監督降維:保留最大變異量的正交方向

PCA 尋找資料方差最大的正交方向(主成分)。PC1 解釋最多變異,PC2 次之,且 PC1⊥PC2。常用於特徵壓縮、噪音去除、高維視覺化。注意:PCA 前需先做 Standardization。

// PCA 五步流程
1. 標準化資料(均值=0,標準差=1
2. 計算協方差矩陣:Σ = 1/n · XX
3. 特徵值分解:Σv = λv
4. 取前 k 個最大特徵值的特徵向量組成矩陣 W
5. 投影降維:Z = X · W

// 解釋變異比率(Explained Variance Ratio)
EVR_i = λᵢ / Σλⱼ
降維結果:2D→1D,PC1 保留 82% 資訊 · 藍點=原始 · 亮點=投影後位置
考試重點
①PCA 前必須 Standardization ②主成分互相正交 ③按解釋變異量由大到小排列
EXAM KEY
PCA vs LDA
PCA 無監督,最大化總體方差;LDA 有監督,最大化類間/類內距離比,用於分類前處理
COMPARISON
應用場景
人臉辨識(Eigenfaces)、基因組資料、NLP 詞向量壓縮、影像雜訊過濾
USE CASES
📊 模型評估指標(混淆矩陣互動)
點擊格子 +5,右鍵 -5,即時計算 Precision / Recall / F1

混淆矩陣(Confusion Matrix)

預測 正例
預測 負例
實際正例
TP 真正例
50
FN 假負例
10
實際負例
FP 假正例
5
TN 真負例
35

左鍵 +5 · 右鍵 -5

85.0%
Accuracy
(TP+TN)/N
90.9%
Precision 精確率
TP/(TP+FP)
83.3%
Recall 召回率
TP/(TP+FN)
87.0%
F1 Score
2·P·R/(P+R)
// Precision vs Recall 的權衡(考試情境題)
// 癌症篩檢 → 最大化 Recall(寧可誤報,不能漏診)→ FN 代價高
// 垃圾郵件 → 最大化 Precision(寧可漏掉垃圾,不誤判正常信)→ FP 代價高
// 兩者均衡 → 使用 F1 Score(調和平均,不受多數類影響)
📌 不平衡資料集(如詐欺偵測、罕見疾病)應使用 F1 Score 或 AUC-ROC,而非 Accuracy——因為全猜多數類即可獲得高 Accuracy
📈 ROC 曲線 與 AUC
不同決策閾值下分類效能的全貌視覺化

ROC 曲線的 X 軸是假正例率(FPR),Y 軸是真正例率(TPR = Recall)。曲線越靠近左上角、AUC 越接近 1.0,模型越好。

// 兩軸定義
TPR = Recall = TP/(TP+FN)  // Y 軸
FPR = FP/(FP+TN)          // X 軸

// AUC 解讀(Area Under Curve)
AUC = 1.0  // 完美分類器
AUC = 0.5  // 隨機猜測(對角線)
AUC ≥ 0.8  // 良好模型
當前模型 AUC = 0.85 · 陰影面積即為 AUC · 越靠近左上角越好
💻 程式碼考點(scikit-learn · pandas · seaborn)
📦 資料讀取與前處理(pandas)
# 讀取資料
import pandas as pd
df = pd.read_csv('data.csv')

# 缺失值處理
df.dropna()                        # 刪除含 NaN 的列
df.fillna(df.mean())            # 均值填補
df['col'].fillna(df['col'].median())# 中位數填補

# 分組與合併
df.groupby('類別')['銷售額'].mean()
pd.merge(df1, df2, on='id', how='inner')
dropna()
刪除含空值的列/行
fillna(df.mean())
以均值填補空值
groupby().mean()
分組聚合計算
🤖 模型建立與訓練(scikit-learn)
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC

# 切分資料集(考點:test_size=0.2 → 80%訓練/20%測試)
X_train, X_test, y_train, y_test = train_test_split(
  X, y, test_size=0.2, random_state=42
)

# 建立並訓練模型
model = LogisticRegression()       # 或 KNeighborsClassifier(n_neighbors=5)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
# 交叉驗證(k-fold,k=5)
scores = cross_val_score(model, X, y, cv=5)
print(scores.mean())                 # 平均準確率
📊 模型評估(scikit-learn metrics)
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.metrics import mean_squared_error, r2_score

# 分類評估
print(accuracy_score(y_test, y_pred))     # 準確率
print(classification_report(y_test, y_pred))# Precision/Recall/F1

# 回歸評估
print(mean_squared_error(y_test, y_pred)) # MSE(越小越好)
print(r2_score(y_test, y_pred))         # R²(越接近1越好)
Accuracy
正確預測數 / 總樣本數
Precision
TP / (TP + FP),查準率
Recall
TP / (TP + FN),查全率
F1 Score
2×P×R/(P+R),調和平均
RMSE
MSE 開根號,與目標同單位

解釋變異比例,1=完美
🎨 資料視覺化(seaborn)
import seaborn as sns
import matplotlib.pyplot as plt

sns.scatterplot(data=df, x='特徵1', y='特徵2', hue='類別') # 散點圖
sns.histplot(data=df, x='數值', bins=30)                    # 直方圖
sns.boxplot(data=df, x='類別', y='數值')                   # 箱型圖
sns.heatmap(df.corr(), annot=True, cmap='coolwarm')           # 相關矩陣
plt.show()
scatterplot
探索特徵間關係與分布
boxplot
偵測離群值與四分位數
heatmap(corr())
特徵相關性熱力圖
🧪 歷屆考題程式題型(選擇題)
Q: 下列哪一個 pandas 函式用來以均值填補缺失值?
(A) df.dropna()
(B) df.fillna(df.mean()) ✓
(C) df.replace(0)
(D) df.groupby()
Q: train_test_split(X, y, test_size=0.2) 表示訓練集佔比為?
(A) 20%
(B) 25%
(C) 80% ✓
(D) 75%
Q: 在三元分類問題中,若 Precision=0.8、Recall=0.6,F1 Score 約為?
(A) 0.50
(B) 0.60
(C) 0.67
(D) 0.75 ✓
解析:F1 = 2×0.8×0.6/(0.8+0.6) = 0.96/1.4 ≈ 0.686 → 最接近 0.67(實際答案 C)
🎯 仿真考題(8 題)