傳統機器學習 Baseline:SVM 手寫數字分類
在理解圖片如何變成數字陣列後,接下來我們使用傳統機器學習方法建立第一個分類模型。本章選擇 SVM(Support Vector Machine)作為 baseline,因為它在中小型資料集上常有穩定表現,也很適合作為深度學習前的比較基準。
1. 什麼是 baseline?
baseline 是一個基準模型,用來回答:「在不使用複雜方法之前,最基本的做法可以做到什麼程度?」
建立 baseline 的目的不是追求最高分,而是建立比較基準。後續若使用 DNN 或 CNN,模型表現必須和 baseline 比較,才知道新的方法是否真的帶來改善。
2. SVM 分類流程
本章的流程如下:
- 載入
load_digits手寫數字資料。 - 將 8x8 圖片攤平成 64 維特徵向量。
- 切分訓練集與測試集。
- 使用
StandardScaler標準化特徵。 - 使用 RBF kernel SVM 訓練分類模型。
- 比較訓練準確率與測試準確率。
- 觀察混淆矩陣與分類錯誤案例。
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
model = Pipeline([
('scaler', StandardScaler()),
('svm', SVC(kernel='rbf', C=10, gamma='scale'))
])
3. 為什麼 SVM 前面要接 StandardScaler?
SVM 是一種與距離、邊界有關的模型。如果某些特徵的數值範圍特別大,它們會在距離計算中占比較高,導致模型過度重視那些特徵。
StandardScaler 會針對每個像素位置,根據訓練資料計算平均值與標準差,將特徵轉換成平均接近 0、標準差接近 1 的尺度。
Note
/255 或 /16 是把整張圖片的像素壓到 0 到 1;StandardScaler 是針對每一個像素位置,讓它在所有樣本中的平均與變異變得一致。神經網路通常先用 /255 或 /16 就足夠;SVM 這類吃距離或 margin 的模型,仍建議加上 StandardScaler。
4. C 與 gamma 的意義
SVM 的兩個重要參數是 C 與 gamma。
| 參數 | 直覺說明 | 數值變大可能造成 |
|---|---|---|
C |
對錯誤分類的容忍程度 | 邊界更努力貼合訓練資料,可能過擬合 |
gamma |
單一樣本影響範圍 | 決策邊界更彎曲,也可能過擬合 |
gamma='scale' 是 scikit-learn 的常用預設值,會根據特徵數量與資料變異自動設定 gamma:
這通常比手動猜一個固定數值更穩定,適合作為第一個 baseline。
5. 訓練與測試分數
模型訓練完成後,建議同時列出訓練集與測試集準確率。
train_acc = model.score(x_train, y_train)
test_acc = model.score(x_test, y_test)
print(f'Train accuracy: {train_acc:.4f}')
print(f'Test accuracy: {test_acc:.4f}')
若訓練分數很高、測試分數也很高,代表模型在目前資料集上泛化良好。若訓練分數明顯高於測試分數,則可能出現過擬合。
6. 2D 決策邊界示範
在 notebook 中,我們也會使用降維後的二維資料示範 SVM 決策邊界。這個示範的目的,是讓讀者看見模型如何在平面上切分不同類別。
Info
若目標是畫出二維決策邊界,PCA 會比 t-SNE 更適合,因為 PCA 可以穩定地將新資料投影到同一個座標系。t-SNE 很適合做群集視覺化,但不適合作為一般分類流程中的特徵轉換器。
7. 小結
在簡單的手寫數字資料上,SVM 可以有很好的表現。這代表傳統機器學習在資料乾淨、特徵清楚、任務規模適中的情況下仍然非常實用。
但真實世界的圖片通常不是 8x8 灰階小圖。下一章我們會切換到 SVHN 街景門牌數字資料集,觀察同樣是數字分類,當資料變得更真實、更複雜時,傳統機器學習會遇到什麼挑戰。