AI時代系列(1) 機器學習三部曲: 🔹 第一部:《機器學習 —— AI 智慧的啟航》
34/100 第四週:監督學習(分類)
34. 支援向量機(SVM) 🏗 用超平面來分割數據,適合高維度資料分類!
🏗 支援向量機(SVM, Support Vector Machine)
用超平面來分割數據,適合高維度資料分類!
________________________________________
📌 1️⃣ 什麼是支援向量機(SVM)?
支援向量機(Support Vector Machine, SVM)是一種 強大的分類演算法,其核心概念是:
• 尋找「最佳超平面」來分隔數據
• 最大化類別之間的間隔(Margin)
• 適合高維度數據,對異常值較不敏感
📌 SVM 的應用場景
• 垃圾郵件分類(Spam vs. Non-Spam 📩)
• 影像識別(手寫數字識別 🖊️)
• 癌症檢測(腫瘤是良性或惡性 🏥)
• 股票趨勢分析(上漲 or 下跌 📈)
________________________________________
📌 2️⃣ SVM 的運作方式
🎯 (1) 找到最佳超平面
超平面(Hyperplane) 是一條線(2D)、一個平面(3D)或更高維度的區隔面,它能將不同類別的數據點分開。
📌 SVM 目標:
• 找到距離兩類數據「最遠」的超平面
• 這條最佳超平面稱為「最大邊界超平面(Maximal Margin Hyperplane)」
• 確保模型有更好的泛化能力(避免過擬合)
🎯 (2) 支援向量(Support Vectors)
• 離決策邊界最近的數據點,稱為「支援向量」
• 支援向量決定了分類邊界的位置
• 只需少量數據點即可定義超平面,減少過擬合
🎯 (3) 硬邊界 vs. 軟邊界
• 硬邊界 SVM(Hard Margin SVM):嚴格分類,要求所有數據點都被完美分隔(適合線性可分數據)
• 軟邊界 SVM(Soft Margin SVM):允許少量數據點錯誤分類,提高模型的泛化能力(適合帶有噪音的數據)
📌 軟邊界的調整參數:
• C 值(正則化參數)
o C 小 → 允許更多錯誤,邊界更寬,泛化能力更強
o C 大 → 限制錯誤,邊界更窄,可能過擬合
________________________________________
📌 3️⃣ SVM 的核函數(Kernel Functions)
SVM 可透過**核函數(Kernel Function)**將資料從低維空間映射至高維空間,進而處理非線性分類問題。**線性核(Linear Kernel)**適用於資料線性可分時,模型訓練快速;**多項式核(Polynomial Kernel)**能捕捉較複雜的多項式關係,適合有曲線邊界的資料;**高斯 RBF 核(Radial Basis Function)**為最常用的非線性核,能處理多數實際應用中的非線性分布;Sigmoid 核模仿神經網路中的啟動函數,在某些特定應用中可提供類似於 MLP 的效果。選擇合適的核函數是影響 SVM 效能的關鍵之一。
📌 常見選擇
• 線性數據 → 線性核
• 非線性數據 → RBF(最常用)
• 當特徵空間較小時,多項式核也是不錯的選擇
________________________________________
📌 4️⃣ Python 實作:SVM 分類
我們來實作 SVM 進行二元分類,並繪製決策邊界。
________________________________________
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
# ✅ 中文字體支援(避免警告)
plt.rcParams["font.sans-serif"] = ["Microsoft JhengHei"] # or PMingLiU
plt.rcParams["axes.unicode_minus"] = False
# 1 建立模擬資料
X, y = make_classification(n_samples=200, n_features=2,
n_informative=2, n_redundant=0,
n_classes=2, random_state=1)
# 2 分割訓練/測試集
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.2,
random_state=1)
# 3 建立 SVM 模型(線性核函數)
svm_clf = SVC(kernel='linear', C=1.0)
svm_clf.fit(X_train, y_train)
# 4 預測與評估
y_pred = svm_clf.predict(X_test)
print("✅ 準確率:", accuracy_score(y_test, y_pred))
# 5 視覺化資料與決策邊界
def plot_decision_boundary(model, X, y, title="SVM 決策邊界"):
# 建立網格點
h = 0.02
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
# 網格點預測分類
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# 畫出決策邊界
plt.contourf(xx, yy, Z, cmap=plt.cm.coolwarm, alpha=0.3)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm, edgecolors="k")
plt.xlabel("特徵 1")
plt.ylabel("特徵 2")
plt.title(title)
plt.show()
plot_decision_boundary(svm_clf, X, y)
________________________________________
📌 5️⃣ SVM 的優缺點
✅ 優點
• 適合高維度數據
• 對異常值較不敏感
• 適用於小樣本數據
• 使用核函數可處理非線性數據
⚠ 缺點
• 計算成本較高(尤其是大數據)
• 參數(C, gamma)需要調整
• 對類別不平衡的數據較敏感
📌 解決方案
• 使用 Grid Search 或 Random Search 調參
• 對類別不平衡數據調整權重
• 採用線性核來加速計算
________________________________________
📌 6️⃣ SVM vs. 其他分類方法
各種分類模型各有適用場景:邏輯回歸適用於線性關係明確的問題,模型簡單且易於解釋;**KNN(K 近鄰分類)**適合少量資料與非線性結構,實作容易但對資料量與維度敏感;決策樹與隨機森林具有良好的可解釋性,能處理非線性與複雜特徵間的交互作用;SVM(支持向量機)適合小樣本、高維空間的分類任務,對邊界敏感問題效果佳;而XGBoost則是目前主流的強大集成方法,特別適合用於大數據場景,具有高準確率與良好的泛化能力。
________________________________________
📌 7️⃣ 總結
✅ SVM 透過超平面來分類數據,適合高維度數據
✅ 使用支援向量來決定最佳分類邊界
✅ 可透過核函數(如 RBF)來處理非線性問題
✅ 適合小型數據集,但對大數據計算成本較高
🚀 下一步:探索「隨機森林分類(Random Forest)」來進一步提升分類能力!🌲