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 為偏置
w ᵀx + b = 0
// 最佳化目標:最大化間隔 Margin = 2/||w||
min ½ ||w ||² // s.t. yᵢ(wᵀxᵢ+b) ≥ 1
// 核技巧:RBF Kernel — 隱式映射至高維空間
K (xᵢ ,xⱼ ) = exp (−γ ||xᵢ −xⱼ ||²)
線性核(Linear)
RBF 核
隱藏 Margin
🖱 拖曳旋轉視角 · 藍=正類 · 粉=負類 · 橙色菱形=支援向量 · 黃色平面=最大間隔超平面
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ᵢ
🔄 重置
▶ 執行一步
⚡ 自動收斂
K −
K = 3
K +
點擊「執行一步」逐步觀察聚類中心(菱形)如何向資料均值收斂 · 拖曳旋轉 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 · X ᵀX
3. 特徵值分解:Σ v = λ v
4. 取前 k 個最大特徵值的特徵向量組成矩陣 W
5. 投影降維:Z = X · W
// 解釋變異比率(Explained Variance Ratio)
EVR_i = λᵢ / Σλⱼ
原始 2D 資料
主成分方向
投影到 PC1
降維結果: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)
左鍵 +5 · 右鍵 -5
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 // 良好模型
完美 (1.0)
良好 (0.85)
一般 (0.70)
隨機 (0.50)
當前模型 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 開根號,與目標同單位
R² 解釋變異比例,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 題)