1. LIBSVM 軟件包簡介
LIBSVM 是臺灣大學林智仁 (Chih-Jen Lin) 博士等開發設計的一個操作簡單、
易於使用、快速有效的通用 SVM 軟件包,可以解決分類問題(包括 C- SVC 、
n - SVC )、迴歸問題(包括 e - SVR 、 n - SVR )以及分佈估計( one-class-SVM )
等問題,提供了線性、多項式、徑向基和 S 形函數四種常用的核函數供選擇,可
以有效地解決多類問題、交叉驗證選擇參數、對不平衡樣本加權、多類問題的概
率估計等。 LIBSVM 是一個開源的軟件包,需要者都可以免費的從作者的個人主頁 http://www.csie.ntu.edu.tw/~cjlin/ 處獲得。他不僅提供了 LIBSVM 的 C++ 語言的算法源代碼,還提供了 Python 、 Java 、 R 、 MATLAB 、 Perl 、 Ruby 、 LabVIEW
以及 C#.net 等各種語言的接口,可以方便的在 Windows 或 UNIX 平臺下使用,
也便於科研工作者根據自己的需要進行改進(譬如設計使用符合自己特定問題需
要的核函數等)。另外還提供了 WINDOWS 平臺下的可視化操作工具 SVM-toy ,
並且在進行模型參數選擇時可以繪製出交叉驗證精度的等高線圖。
2. LIBSVM 使用方法簡介
LIBSVM 在給出源代碼的同時還提供了 Windows 操作系統下的可執行文件,
包括:進行支持向量機訓練的 svmtrain.exe ;根據已獲得的支持向量機模型對數
據集進行預測的 svmpredict.exe ;以及對訓練數據與測試數據進行簡單縮放操作
的 svmscale.exe 。它們都可以直接在 DOS 環境中使用。如果下載的包中只有 C++
的源代碼,則也可以自己在 VC 等軟件上編譯生成可執行文件。
LIBSVM 使用的一般步驟是:
1 ) 按照 LIBSVM 軟件包所要求的格式準備數據集;
2 ) 對數據進行簡單的縮放操作;
3 ) 考慮選用 RBF 核函數 2 K(x,y) e x y = -g - ;
4 ) 採用交叉驗證選擇最佳參數 C 與 g ;
5 ) 採用最佳參數 C 與 g 對整個訓練集進行訓練獲取支持向量機模型;
6 ) 利用獲取的模型進行測試與預測。
一 . LIBSVM 使用的數據格式
<label> <index1>:<value1> <index2>:<value2> ...
其中<label> 是訓練數據集的目標值,對於分類,它是標識某類的整數(支持多個類);對於迴歸,是任意實數。<index> 是以1開始的整數,可以是不連續的;<value>爲實數,也就是我們常說的自變量。檢驗數據文件中的label只用於計算準確度或誤差,如果它是未知的,只需用一個數填寫這一欄,也可以空着不填。
在程序包中,還包括有一個訓練數據實例:heart_scale,方便參考數據文件格式以及練習使用軟件。可以編寫小程序,將自己常用的數據格式轉換成這種格式
例如:
+1 1:0.708 2:1 3:1 4:-0.320 5:-0.105 6:-1 8:1.21
二 . svmscale 的用法
對數據集進行縮放的目的在於:
1 )避免一些特徵值範圍過大而另一些特徵值範圍過小;
2 )避免在訓練時爲了計算核函數而計算內積的時候引起數值計算的困難。因此,通常將數據縮放到 [ -1,1] 或者是 [0,1] 之間。
用法: svmscale [-l lower] [-u upper] [-y y_lower y_upper]
[-s save_filename] [-r restore_filename] filename
(缺省值: lower = -1 , upper = 1 ,沒有對 y 進行縮放)
其中,
-l :數據下限標記; lower :縮放後數據下限;
-u :數據上限標記; upper :縮放後數據上限;
-y :是否對目標值同時進行縮放; y_lower 爲下限值, y_upper 爲上限值;
-s save_filename :表示將縮放的規則保存爲文件 save_filename ;
-r restore_filename :表示將縮放規則文件 restore_filename 載入後按此縮放;
filename :待縮放的數據文件(要求滿足前面所述的格式)。
縮放規則文件可以用文本瀏覽器打開,看到其格式爲:
lower upper
lval1 uval1
lval2 uval2
其中的 lower 與 upper 與使用時所設置的 lower 與 upper 含義相同; index 表
示特徵序號; lval 爲該特徵對應轉換後下限 lower 的特徵值; uval 爲對應於轉換後上限 upper 的特徵值。
數據集的縮放結果在此情況下通過 DOS 窗口輸出,當然也可以通過 DOS 的
文件重定向符號“ > ”將結果另存爲指定的文件。
使用實例:
1) svmscale – s train3.range train3>train3.scale
表示採用缺省值(即對屬性值縮放到 [ -1,1] 的範圍,對目標值不進行縮放)
對數據集 train3 進行縮放操作,其結果縮放規則文件保存爲 train3.range ,縮放集的縮放結果保存爲 train3.scale 。
2 ) svmscale – r train3.range test3>test3.scale
表示載入縮放規則 train3.range 後按照其上下限對應的特徵值和上下限值線
性的地對數據集 test3 進行縮放,結果保存爲 test3.scale 。
三 . svmtrain 的用法
svmtrain 實現對訓練數據集的訓練,獲得 SVM 模型。
用法: svmtrain [options] training_set_file [model_file]
其中,
options (操作參數):可用的選項即表示的涵義如下所示
-s svm 類型:設置 SVM 類型,默認值爲 0 ,可選類型有:
0 -- C- SVC
1 -- n - SVC
2 -- one-class-SVM
3 -- e - SVR
4 -- n - SVR
-t 核函數類型:設置核函數類型,默認值爲 2 ,可選類型有:
0 -- 線性核: u'*v
1 -- 多項式核: (g*u'*v+ coef 0)deg ree
2 -- RBF 核: e( u v 2) g -
3 -- sigmoid 核: tanh(g*u'*v+ coef 0)
-d degree :核函數中的 degree 設置,默認值爲 3 ;
-g g :設置核函數中的 g ,默認值爲 1/ k ;
-r coef 0 :設置核函數中的 coef 0 ,默認值爲 0 ;
-c cost :設置 C- SVC 、 e - SVR 、 n - SVR 中從懲罰係數 C ,默認值爲 1 ;
-n n :設置 n - SVC 、 one-class-SVM 與 n - SVR 中參數 n ,默認值 0.5 ;
-p e :設置 n - SVR 的損失函數中的 e ,默認值爲 0.1 ;
-m cachesize :設置 cache 內存大小,以 MB 爲單位,默認值爲 40 ;
-e e :設置終止準則中的可容忍偏差,默認值爲 0.001 ;
-h shrinking :是否使用啓發式,可選值爲 0 或 1 ,默認值爲 1 ;
-b 概率估計:是否計算 SVC 或 SVR 的概率估計,可選值 0 或 1 ,默認 0 ;
-wi weight :對各類樣本的懲罰係數 C 加權,默認值爲 1 ;
-v n : n 折交叉驗證模式。
其中 -g 選項中的 k 是指輸入數據中的屬性數。操作參數 -v 隨機地將數據剖分爲 n 部分並計算交叉檢驗準確度和均方根誤差。以上這些參數設置可以按照 SVM 的類型和核函數所支持的參數進行任意組合,如果設置的參數在函數或 SVM 類型中沒有也不會產生影響,程序不會接受該參數;如果應有的參數設置不正確,參數將採用默認值。 training_set_file 是要進行訓練的數據集; model_file 是訓練結束後產生的模型文件,該參數如果不設置將採用默認的文件名,也可以設置成自己慣用的文件名。
使用實例:
1 ) svmtrain train3.scale train3.model
訓練 train3.scale ,將模型保存於文件 train3.model ,並在 dos 窗口中輸出如下
結果:
optimization finished, #iter = 1756
nu = 0.464223
obj = -551.002342, rho = -0.337784
nSV = 604, nBSV = 557
Total nSV = 604
其中, #iter 爲迭代次數, nu 與前面的操作參數 -n n 相同, obj 爲 SVM 文件
轉換爲的二次規劃求解得到的最小值, rho 爲判決函數的常數項 b , nSV 爲支持
向量個數, nBSV 爲邊界上的支持向量個數, Total nSV 爲支持向量總個數。
訓練後的模型保存爲文件 train3.model ,用記事本等文本瀏覽器打開可以看到其內容如下(其後“ % ”後內容爲筆者所加註釋):
svm_type c_svc % 訓練所採用的 svm 類型,此處爲 C- SVC
kernel_type rbf % 訓練採用的核函數類型,此處爲 RBF 核
gamma 0.047619 % 與操作參數設置中的 g 含義相同
nr_class 2 % 分類時的類別數,此處爲兩分類問題
total_sv 604 % 總共的支持向量個數
rho -0.337784 % 決策函數中的常數項 b
label 0 1 % 類別標籤
nr_sv 314 290 % 各類別標籤對應的支持向量個數
SV % 以下爲支持向量
1 1:-0.963808 2:0.906788 ... 19:-0.197706 20:-0.928853 21:-1
1 1:-0.885128 2:0.768219 ... 19:-0.452573 20:-0.980591 21:-1
... ... ...
1 1:-0.847359 2:0.485921 ... 19:-0.541457 20:-0.989077 21:-1
% 對於分類問題,上面的支持向量的各列含義與訓練數據集相同;對於迴歸問題,略有不同,與訓練數據中的標籤 label (即 y 值)所對應的位置在模型文件的支持向量中現在存放的是 Lagrange 係數 a 值,即爲下面決策函數公式中的 a 值:
* *
1
() ( )( ( ) ( )) ( ) ( , )
( , )
k
i i i i i i
i i sv
i i
i sv
fx a a x x b a a k x x b
ak x x b
=
= - F F + = - +
= +
g
四 . svmpredict 的用法
svmpredict 是根據訓練獲得的模型,對數據集合進行預測。
用法: svmpredict [options] test_file model_file output_file
options (操作參數):
-b probability_estimates :是否需要進行概率估計預測,可選值爲 0 或者 1 ,
默認值爲 0 。
model_file 是由 svmtrain 產生的模型文件; test_file 是要進行預測的數據文
件; output_file 是 svmpredict 的輸出文件,表示預測的結果值。 svmpredict 沒有
其它的選項。
下面是具體的使用例子
svmtrain -s 0 -c 1000 -t 1 -g 1 -r 1 -d 3 data_file
訓練一個由多項式核(u'v+1)^3和C=1000組成的分類器。
svmtrain -s 1 -n 0.1 -t 2 -g 0.5 -e 0.00001 data_file =?-SVM (?在RBF核函數exp(-0.5|u-v|^2)和終止允許限0.00001的條件下,訓練一個 0.1)分類器。
svmtrain -s 3 -p 0.1 -t 0 -c 10 data_file =?以線性核函數u'v和C=10及損失函數 0.1求解SVM迴歸。