— Posted in 電腦資訊

[轉錄] LibSVM 簡易入門

來源:https://puremonkey2010.blogspot.tw/2012/09/libsvm-piaip-libsvm.html

SVM, Support Vector Machine , 簡而言之它是個起源跟類神經網路有點像的東西, 不過現今最常拿來就是做分類 (classification)。 也就是說,如果我有一堆已經分好類的東西 (可是分類的依據是未知的!) ,那當收到新的東西時, SVM 可以預測 (predict) 新的資料要分到哪一堆去. 

Using SVM :
libsvm 有很多種用法, 這篇 tutorial 只打算講簡單的部分. 先來解釋一下幾個主要執行檔的作用: (UNIX/Windows 下檔名稍有不同, 請用常識理解我在講哪個) :

svmtrain
Train (訓練) data. 跑 SVM 被戲稱為 “開火車” 也是由於這個程式名而來. train 會接受特定格式的輸入, 產生一個 “Model” 檔. 這個 model 你可以想像成 SVM 的內部資料, 因為 predict 要 model 才能 predict, 不能直接吃原始資料. 想想也很合理, 假定 train 本身是很耗時的動作, 而 train 好可以以某種形式存起內部資料, 那下次要 predict 時直接把那些內部資料 load 進來就快多了.

svmpredict
依照已經 train 好的 model, 再加上給定的輸入 (新值), 輸出 predict (預測) 新值所對應的類別 (class).

svmscale
Rescale data. 因為原始資料可能範圍過大或過小, svmscale 可以先將資料重新 scale (縮放) 到適當範圍.

 

至於輸入檔案的格式, 可以參考 libsvm 裡面附的 “heart_scale”:
[label] [index1]:[value1] [index2]:[value2] …
[label] [index1]:[value1] [index2]:[value2] …

一行一筆資料,如 :
+1 1:0.708 2:1 3:1 4:-0.320 5:-0.105 6:-1

而接著來說每一個欄位的意義 :
– label
或說是 class, 就是你要分類的種類,通常是一些整數.

– index
是有順序的索引,通常是放連續的整數.

– value
就是用來 train 的資料,通常是一堆實數.

– Cross Validation
一般而言, SVM 使用的方式(在決定參數時)常是這樣 :
1. 先有已分好類的一堆資料
2. 亂數拆成好幾組 training set
3. 用某組參數去 train 並 predict 別組看正確率
4. 正確率不夠的話,換參數再重複 train/predict

等找到一組不錯的參數後,就拿這組參數來建 model 並用來做最後對未知資料的 predict。 這整個過程叫 cross validation , 也就是交叉比對. 在我們找參數的過程中,可以利用 svmtrain 的內建 cross validation 功能來幫忙 :
-v n: n-fold cross validation

n 就是要拆成幾組,像 n=3 就會拆成三組,然後先拿 1跟2來 train model 並 predict 3 以得到正確率; 再來拿 2跟 3 train 並 predict 1,最後 1,3 train 並 predict 2。其它以此類推.

如果沒有交叉比對的話,很容易找到只在特定輸入時好的 參數。像前面我們 c=10 得到 92.2%,不過拿 -v 5 來看看 :
>svm-train.exe -v 5 -c 10 heart_scale

Cross Validation Accuracy = 76.6667%

平均之後才只有 76.6667%,比一開始的 86 還差!

– What arguments rules?
通常而言,比較重要的參數是 gamma (-g) 跟 cost (-c) 。而 cross validation (-v) 的參數常用 5; cost 預設值是 1, gamma 預設值是 1/k ,k 等於輸入 資料筆數。 那我們怎麼知道要用多少來當參數呢?
用 試 的!
是的,別懷疑,就是 Try 參數找比較好的值.