跳轉到

傳統機器學習 Baseline:SVM 手寫數字分類

範例程式:Open In Colab

在理解圖片如何變成數字陣列後,接下來我們使用傳統機器學習方法建立第一個分類模型。本章選擇 SVM(Support Vector Machine)作為 baseline,因為它在中小型資料集上常有穩定表現,也很適合作為深度學習前的比較基準。

1. 什麼是 baseline?

baseline 是一個基準模型,用來回答:「在不使用複雜方法之前,最基本的做法可以做到什麼程度?」

建立 baseline 的目的不是追求最高分,而是建立比較基準。後續若使用 DNN 或 CNN,模型表現必須和 baseline 比較,才知道新的方法是否真的帶來改善。

2. SVM 分類流程

本章的流程如下:

  1. 載入 load_digits 手寫數字資料。
  2. 將 8x8 圖片攤平成 64 維特徵向量。
  3. 切分訓練集與測試集。
  4. 使用 StandardScaler 標準化特徵。
  5. 使用 RBF kernel SVM 訓練分類模型。
  6. 比較訓練準確率與測試準確率。
  7. 觀察混淆矩陣與分類錯誤案例。
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. Cgamma 的意義

SVM 的兩個重要參數是 Cgamma

參數 直覺說明 數值變大可能造成
C 對錯誤分類的容忍程度 邊界更努力貼合訓練資料,可能過擬合
gamma 單一樣本影響範圍 決策邊界更彎曲,也可能過擬合

gamma='scale' 是 scikit-learn 的常用預設值,會根據特徵數量與資料變異自動設定 gamma:

gamma = 1 / (n_features * X.var())

這通常比手動猜一個固定數值更穩定,適合作為第一個 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 街景門牌數字資料集,觀察同樣是數字分類,當資料變得更真實、更複雜時,傳統機器學習會遇到什麼挑戰。