下載的libsvm包里面已經為我們編譯好了(windows)。進入libsvm\windows,可以看到這幾個exe文件:
a.svm-toy.exe:圖形界面,可以自己畫點,產生數據等。
b.svm-scale.exe:對特征值進行縮放。
c.svm-train.exe:接收特定格式的輸入,產生一個model文件。
d.svm-predict.exe:依照已經train好的model,輸入新的數據,並輸出預測新數據的類別。
svm-toy.exe
可以自己生成數據,雙擊svm-toy,點擊change可以在畫布上畫點:
點擊run,其實就是train的過程。它是個toy(玩具),是為了人們更形象地了解svm,其具體玩法就不做介紹了。
svm-scale.exe
因為原始數據可能范圍過大或過小,svmscale可以先將數據重新scale(縮放)到適當范圍使訓練與預測速度更快。
使用方法:
svm-scale.exe [-l lower] [-u upper] [-y y_lower y_upper] [-s save_name] [-r store_name] filename
其中:
-l lower : x scaling lower limit (default -1) 特征值縮放下限,默認為-1
-u upper : x scaling upper limit (default +1) 特征值縮放上限,默認為+1
-y y_lower y_upper : y scaling limits (default: no y scaling) 是否對目標值進行縮放及縮放的上下限,默認不縮放 注意:(回歸需要對目標進行縮放,因此該參數可以設定為 -y -1 1)
-s save_filename : save scaling parameters to save_filename 表示將縮放的規則保存為文件save_filename
-r restore_filename : restore scaling parameters from restore_filename 表示將縮放規則文件restore_filename載入后按此規則縮放
若要了解更具體的縮放規則,請參考:http://blog.csdn.net/dxy_1110/article/details/43851955
svm-train.exe
用於訓練數據,生成模型;
使用方法:
svm-train.exe [options] training_set_file [model_file]
其中:
options(操作參數):可用的選項即表示的含義如下所示:
-s svm類型:設置SVM類型,默認值為0,可選類型有(對於回歸只能選3或4):
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 coef0:設置核函數中的coef0,默認值為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:是訓練結束后產生的模型文件,該參數如果不設置將采用默認的文件名,也可以設置成自己慣用的文件名。
舉個例子如下:
C:\libsvm-3.18\windows>svm-train.exe heart_scale
輸出:
簡單對屏幕回顯信息進行說明:
#iter為迭代次數,
nu 與前面的操作參數-n nu 相同,
obj為SVM文件轉換為的二次規划求解得到的最小值,
rho 為判決函數的常數項b,
nSV 為支持向量個數,
nBSV為邊界上的支持向量個數,
Total nSV為支持向量總個數(對於兩類來說,因為只有一個分類模型 Total nSV = nSV ,但是對於多類,這個是各個分類模型的 nSV 之和)。
訓練后的模型保存為文件*.model,用記事本打開其內容如下:
svm_type c_svc % 訓練所采用的svm類型,此處為C- SVC
kernel_type rbf %訓練采用的核函數類型,此處為RBF核
gamma 0.0769231 %設置核函數中的g ,默認值為1/ k
nr_class 2 %分類時的類別數,此處為兩分類問題
total_sv 132 %總共的支持向量個數
rho 0.424462 %決策函數中的常數項b
label 1 -1%類別標簽
nr_sv 64 68 %各類別標簽對應的支持向量個數
SV %以下為支持向量
1 1:0.166667 2:1 3:-0.333333 4:-0.433962 5:-0.383562 6:-1 7:-1 8:0.0687023 9:-1 10:-0.903226 11:-1 12:-1 13:1
0.5104832128985164 1:0.125 2:1 3:0.333333 4:-0.320755 5:-0.406393 6:1 7:1 8:0.0839695 9:1 10:-0.806452 12:-0.333333 13:0.5
1 1:0.333333 2:1 3:-1 4:-0.245283 5:-0.506849 6:-1 7:-1 8:0.129771 9:-1 10:-0.16129 12:0.333333 13:-1
1 1:0.208333 2:1 3:0.333333 4:-0.660377 5:-0.525114 6:-1 7:1 8:0.435115 9:-1 10:-0.193548 12:-0.333333 13:1
補充:采用交叉驗證選擇最佳參數C與g
通常而言,比較重要的參數是 gamma (-g) 跟 cost (-c) 。而 cross validation (-v)的參數常用5。那么如何去選取最優的參數c和g呢?上篇博文提到可以使用libsvm子目錄下面的grid.py。
grid.py是一種用於RBF核函數的C-SVM分類的參數選擇程序。用戶只需給定參數的一個范圍,grid.py采用交叉驗證的方法計算每種參數組合的准確度來找到最好的參數。
Usage: grid.py [-log2c begin,end,step] [-log2g begin,end,step] [-v fold] [-svmtrain pathname] [-gnuplot pathname] [-out pathname] [-png pathname] [additional parameters for svm-train] dataset The program conducts v-fold cross validation using parameter C (and gamma)= 2^begin, 2^(begin+step), ..., 2^end.
示例:
python grid.py -log2c -10,10,1 -log2g 10,-10,-1 trainset.txt
這是給參數C和g設定了一個范圍,且給定了變化步長,程序會在給定范圍內尋找最優參數C和g。
當然也可以直接這樣:
python grid.py trainset.txt
讓程序自動獲取最佳的C和g。常會出現的情況是:對不同的C和g,交叉驗證的精度(Accuracy)常會相同。這會導致當不指定范圍時,得到的C過大或過小,過大時,表示對錯誤例懲罰程度越大,可能到導致模型過擬合,使得在對測試集進行測試時,准確率較低。C過小時,容易欠擬合。
svm-predict.exe
用來測試訓練結果的准確率。
使用方法:
svm-predict.exe[options] test_file model_file output_file
options(操作參數):
-b probability_estimates:是否需要進行概率估計預測,可選值為0或1,默認值為0。
test_file:是要進行預測的數據文件;
model_file:是由svm-train.exe產生的模型文件;
output_file:是svmpredict的輸出文件,表示預測的結果值。
(注:輸出結果包括均方誤差(Mean squared error)和相關系數(Squared corralation coefficient)。)
例如:
./svm-predict heart_scale heart_scale.model heart_scale.out
這里顯示的是結果:
Accuracy = 86.6667% (234/270) (classification)
以上。