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 使用的資料格式
LIBSVM 使用的訓練資料和測試資料檔案格式如下:
: : < value2> …
其中 是訓練資料集的目标值,對于分類,它是辨別某類的整數 ( 支援
多個類 ) ;對于回歸,是任意實數。
是以 1 開始的整數,表示特征的序号;
為實數,也就是我們常說的特征值或自變量。當特征值為 0 時,特征序号與特征值 value 都可以同時省略,即 index 可以是不連續的自然數。
與第一個特征序号、前一個特征值與後一個特征序号之間用空格隔開。測試資料檔案中的 label 隻用于計算準确度或誤差,如果它是未知的,隻需用任意一個數填寫這一欄,也可以空着不填。例如:
+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 沒有
其它的選項。