libsvm使用心得
Libsvm使用心得
首先下載Libsvm、Python和Gnuplot:
l???????? libsvm的主頁http://www.csie.ntu.edu.tw/~cjlin/libsvm/上下載libsvm (我自己用2.86版本)
l???????? python的主頁http://www.python.org下載 python (我自己用2.5版本)
l???????? gnuplot的主頁http://www.gnuplot.info/下載gnuplot? (我用4.0版本)
LIBSVM 使用的一般步驟是:
1)按照LIBSVM軟件包所要求的格式準備數據集;????????????????????????????????????
2)對數據進行簡單的縮放操作;???????????????????????????????????
3)首要考慮選用RBF 核函數;
4)采用交叉驗證選擇最佳參數C與g ;
5)采用最佳參數C與g 對整個訓練集進行訓練獲取支持向量機模型;
6)利用獲取的模型進行測試與預測。
1)LIBSVM使用的數據格式
??? 該軟件使用的訓練數據和檢驗數據文件格式如下:
[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
這里(x,y)à((0.708,1,1, -0.320, -0.105, -1), +1)
label 或說是class, 就是你要分類的種類,通常是一些整數。
index 是有順序的索引,通常是連續的整數。
value 就是用來 train 的數據,通常是一堆實數。
?
2)對數據進行簡單的縮放操作
??? 掃描數據. 因為原始數據可能范圍過大或過小, svmscale可以先將數據重新scale (縮放) 到適當范圍使訓練與預測速度更快。
??? svmscale.exe的用法:svmscale.exe feature.txt feature.scaled
默認的歸一化范圍是[-1,1],可以用參數-l和-u分別調整上界和下屆,feature.txt是輸入特征文件名 輸出的歸一化特征名為feature.scaled
?
3) 考慮選用RBF 核函數
訓練數據形成模型(model),實質是算出了wx+b=0中的w,b.
?Svmtrain的用法:svmtrain [options] training_set_file [model_file]
?
其中options涵義如下:
-s svm類型:設置SVM 類型,默認值為0,可選類型有:
0 -- C- SVC
1 -- nu - SVC
2 -- one-class-SVM
3 -- e - SVR
4 -- nu-SVR
-t 核函數類型:設置核函數類型,默認值為2,可選類型有:
0 -- 線性核:u'*v
1 -- 多項式核:(g*u'*v+ coef0)degree
2 -- RBF 核:exp(-||u-v||*||u-v||/g*g)
3 -- sigmoid 核:tanh(g*u'*v+ coef 0)
-d degree:核函數中的degree設置,默認值為3;
-g r(gama):核函數中的函數設置(默認1/ k);
-r coef 0:設置核函數中的coef0,默認值為0;
-c cost:設置C- SVC、e - SVR、n - SVR中從懲罰系數C,默認值為1;
-n nu :設置nu - SVC、one-class-SVM 與nu - SVR 中參數nu ,默認值0.5;
-p e :核寬,設置e - 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-2.85/windows>svmtrain heart_scale
*
optimization finished, #iter = 162
nu = 0.431029
obj = -100.877288, rho = 0.424462
nSV = 132, nBSV = 107
Total nSV = 132
現簡單對屏幕回顯信息進行說明:
#iter為迭代次數,
nu 與前面的操作參數-n nu 相同,
obj為SVM文件轉換為的二次規劃求解得到的最小值,
rho 為判決函數的常數項b,
nSV 為支持向量個數,
nBSV為邊界上的支持向量個數,
Total 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
4)采用交叉驗證選擇最佳參數C與g
??? 通常而言,比較重要的參數是 gamma (-g) 跟 cost (-c) 。而 cross validation (-v)
的參數常用5。那么如何去選取最優的參數c和g呢?libsvm 的 python 子目錄下面的 grid.py 可以幫助我們。 此時。其中安裝python2.5需要(一般默認安裝到c:/python25
下),將gnuplot解壓。安裝解壓完畢后,進入/libsvm/tools目錄下,用文本編輯器(記事
本,edit都可以)修改grid.py文件,找到其中關于gnuplot路徑的那項(其默認路徑為
gnuplot_exe=r"c:/tmp/gnuplot/bin/pgnuplot.exe"),根據實際路徑進行修改,并保存。然
后,將grid.py和C:/Python25目錄下的python.exe文件拷貝到libsvm/windows目錄下,鍵入以下命令:$ python grid.py train.1.scale 執行后,即可得到最優參數c和g。
??? 另外,至于下libsvm和python的接口的問題,在libsvm2.86中林老師已經幫助我們解決,在/libsvm/windows/python目錄下自帶了svmc.pyd這個文件,將該文件文件復制到
libsvm/python目錄下,同時,也將python.exe文件復制到該目錄下,鍵入以下命令以檢驗效
果(注意:.Py文件中關于gnuplot路徑的那項路徑一定要根據實際路徑修改):
python svm_test.py
??? 如果能看到程序執行結果,說明libsvm和python之間的接口已經配置完成,以后就可以直接在python程序里調用libsvm的函數了!
5) 采用最佳參數C與g 對整個訓練集進行訓練獲取支持向量機模型
?? $ svmtrain –c x –g x –v x training_set_file [model_file]
?? x為上述得到的最優參數c和g的值,v的值一般取5。
6)利用獲取的模型進行測試與預測
使用Svmtrain訓練好的模型進行測試。輸入新的X值,給出SVM預測出的Y值
?$ Svmpredict? test_file? model_file? output_file
如:./svm-predict heart_scale heart_scale.model heart_scale.out
Accuracy = 86.6667% (234/270) (classification)
這里顯示的是結果
一個具體使用的例子。
?? ?以libsvm中的heart_scale作為訓練數據和測試數據,同時已經將python安裝至c盤,并將grid.py文件中關于gnuplot路徑的默認值修改為實際解壓縮后的路徑,將
heart_scale、grid.py和python.exe拷貝至/libsvm/windows文件夾下。
./svm-train heart_scale
optimization finished, #iter = 162
nu = 0.431029
obj = -100.877288, rho = 0.424462
nSV = 132, nBSV = 107
Total nSV = 132
此時,已經得到heart_scale.model,進行預測:
./svm-predict heart_scale? heart_scale.model ?heart_scale.out
Accuracy = 86.6667% (234/270) (classification)
正確率為Accuracy = 86.6667%。
./python grid.py heart_scale
得到最優參數c=2048,g=0.0001220703125.
./svm-train -c 2048 -g 0.0001220703125 heart_scale得到model后,由./svm-predict heart_scale? heart_scale.model heart_scale.out得到的正確
率為Accuracy = 85.1852%.這塊還有點迷惑?為什么正確率降低了?
當然也可以結合subset.py 和 easy.py 實現自動化過程。
如果要訓練多次,可以寫個批處理程序省好多事。
這里舉個例子:
::@ echo off
cls
:: split the data and output the results
for /L %%i in (1,1,1000) do python subset.py b59.txt 546 b59(%%i).in8 b59(%%i).out2
for /L %%i in (1,1,1000) do python easy.py b59(%%i).in8 b59(%%i).out2 >> result89.txt
這段批處理代碼首先調用subset.py對文件b59.txt執行1000次分層隨機抽樣(對數據進行80-20%分割)然后調用easy.py 進行1000次參數尋優,把記錄結果寫到result89.txt中
(包括1000次訓練的分類準確率和參數對)。
還可以調用fselect.py進行特征選擇,調用plotroc.py進行roc曲線繪制。
先寫到這里吧,希望能和大家一起學習libsvm,進一步學好svm。
?
總結
以上是生活随笔為你收集整理的libsvm使用心得的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mathtype中批量修改公式的字号和大
- 下一篇: 15个学习习惯,受益一生(强烈推荐)