SVM in Python

by allenlu2007

本文主要參考 Eric Kim “Everything You Wanted to Know about the Kernel Trick“.

 

Code 可直接 download. Code 的部份會用到 sklearn, numpy, scipy.  可以直接 install Anaconda, or Enthought Canopy.

似乎大多人用 Anaconda (+spyder IDE).  

 

What is Kernel?

前文 SVM level 3 提到如何用 Kernel trick 在 SVM classification 可以在低維計算,但卻達到高維 (even infinite dimension) mapping and classification 的效果。本文就是 demo some examples.

不過 Kernel 並非只用於 SVM classification.  也可用於其他分類如 logistic regression or softmax classification. 只不過失去了以上計算的好處。

什麼是 Kernel?  Kernel Function  is a function  and obey some math properties.  (Semi-positive definite?)

 

Linear Separable Binary Classification Problem

首先看簡單的問題。一個 2 classes, 2D linear separable dataset 如下。

NewImage

依前文 SVM 所述,這種情況最單純的 linear SVM 就可解。同時是 maximum margin classifier.

結果如下圖。

單圈是 75% trained data.  雙圈是 25% test data.  實線是 decision boundary; 虛線是 hard/soft margin boundary. 

Accuracy 是 100% as expected.

NewImage

比較有趣是看其他 kernel 在這種簡單 case 的表現。下面依序是 Polynomial kernel, RBF (Gaussian) kernel, and Sigmoid kernel, 見前文。

NewImage

NewImage

Sigmoid 的表現意外的比較差。可能是參數設定問題。

NewImage

 

Linear Non-separable Binary Classification Problem

再來考慮如下的 dataset.  明顯 linear SVM 無法做有效的分類。

NewImage

 

先用 linear SVM 如下。Accuracy 只有 58.5%, 基本上和亂猜差不多 (50%). 

NewImage

 

下面依序是 Polynomial kernel, RBF (Gaussian) kernel, and Sigmoid kernel.

此時 polynomial 變為 4th order.  

NewImage

RBF 和 Polynomial 看來的結果都不錯。

NewImage

 

Sigmoid 看來的 margin 不是很好。

NewImage

 

How to find support vectors?  How to find all coefficients?

 

 

 

 

Advertisements