libsvm使用心得
Libsvm使用心得
首先下載Libsvm、Python和Gnuplot:
l???????? libsvm的主頁(yè)http://www.csie.ntu.edu.tw/~cjlin/libsvm/上下載libsvm (我自己用2.86版本)
l???????? python的主頁(yè)http://www.python.org下載 python (我自己用2.5版本)
l???????? gnuplot的主頁(yè)http://www.gnuplot.info/下載gnuplot? (我用4.0版本)
LIBSVM 使用的一般步驟是:
1)按照LIBSVM軟件包所要求的格式準(zhǔn)備數(shù)據(jù)集;????????????????????????????????????
2)對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單的縮放操作;???????????????????????????????????
3)首要考慮選用RBF 核函數(shù);
4)采用交叉驗(yàn)證選擇最佳參數(shù)C與g ;
5)采用最佳參數(shù)C與g 對(duì)整個(gè)訓(xùn)練集進(jìn)行訓(xùn)練獲取支持向量機(jī)模型;
6)利用獲取的模型進(jìn)行測(cè)試與預(yù)測(cè)。
1)LIBSVM使用的數(shù)據(jù)格式
??? 該軟件使用的訓(xùn)練數(shù)據(jù)和檢驗(yàn)數(shù)據(jù)文件格式如下:
[label] [index1]:[value1] [index2]:[value2] ...
[label] [index1]:[value1] [index2]:[value2] ...
一行一條記錄數(shù)據(jù),如:
+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, 就是你要分類的種類,通常是一些整數(shù)。
index 是有順序的索引,通常是連續(xù)的整數(shù)。
value 就是用來 train 的數(shù)據(jù),通常是一堆實(shí)數(shù)。
?
2)對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單的縮放操作
??? 掃描數(shù)據(jù). 因?yàn)樵紨?shù)據(jù)可能范圍過大或過小, svmscale可以先將數(shù)據(jù)重新scale (縮放) 到適當(dāng)范圍使訓(xùn)練與預(yù)測(cè)速度更快。
??? svmscale.exe的用法:svmscale.exe feature.txt feature.scaled
默認(rèn)的歸一化范圍是[-1,1],可以用參數(shù)-l和-u分別調(diào)整上界和下屆,feature.txt是輸入特征文件名 輸出的歸一化特征名為feature.scaled
?
3) 考慮選用RBF 核函數(shù)
訓(xùn)練數(shù)據(jù)形成模型(model),實(shí)質(zhì)是算出了wx+b=0中的w,b.
?Svmtrain的用法:svmtrain [options] training_set_file [model_file]
?
其中options涵義如下:
-s svm類型:設(shè)置SVM 類型,默認(rèn)值為0,可選類型有:
0 -- C- SVC
1 -- nu - SVC
2 -- one-class-SVM
3 -- e - SVR
4 -- nu-SVR
-t 核函數(shù)類型:設(shè)置核函數(shù)類型,默認(rèn)值為2,可選類型有:
0 -- 線性核:u'*v
1 -- 多項(xiàng)式核:(g*u'*v+ coef0)degree
2 -- RBF 核:exp(-||u-v||*||u-v||/g*g)
3 -- sigmoid 核:tanh(g*u'*v+ coef 0)
-d degree:核函數(shù)中的degree設(shè)置,默認(rèn)值為3;
-g r(gama):核函數(shù)中的函數(shù)設(shè)置(默認(rèn)1/ k);
-r coef 0:設(shè)置核函數(shù)中的coef0,默認(rèn)值為0;
-c cost:設(shè)置C- SVC、e - SVR、n - SVR中從懲罰系數(shù)C,默認(rèn)值為1;
-n nu :設(shè)置nu - SVC、one-class-SVM 與nu - SVR 中參數(shù)nu ,默認(rèn)值0.5;
-p e :核寬,設(shè)置e - SVR的損失函數(shù)中的e ,默認(rèn)值為0.1;
-m cachesize:設(shè)置cache內(nèi)存大小,以MB為單位(默認(rèn)40):
-e e :設(shè)置終止準(zhǔn)則中的可容忍偏差,默認(rèn)值為0.001;
-h shrinking:是否使用啟發(fā)式,可選值為0 或1,默認(rèn)值為1;
-b 概率估計(jì):是否計(jì)算SVC或SVR的概率估計(jì),可選值0 或1,默認(rèn)0;
-wi weight:對(duì)各類樣本的懲罰系數(shù)C加權(quán),默認(rèn)值為1;
-v n:n折交叉驗(yàn)證模式。
?
其中-g選項(xiàng)中的k是指輸入數(shù)據(jù)中的屬性數(shù)。操作參數(shù) -v 隨機(jī)地將數(shù)據(jù)剖分為n 部分并計(jì)算交叉檢驗(yàn)準(zhǔn)確度和均方根誤差。以上這些參數(shù)設(shè)置可以按照SVM 的類型和核函數(shù)所支持的參數(shù)進(jìn)行任意組合,如果設(shè)置的參數(shù)在函數(shù)或SVM 類型中沒有也不會(huì)產(chǎn)生影響,程序不會(huì)接受該參數(shù);如果應(yīng)有的參數(shù)設(shè)置不正確,參數(shù)將采用默認(rèn)值。training_set_file是要進(jìn)行訓(xùn)練的數(shù)據(jù)集;model_file是訓(xùn)練結(jié)束后產(chǎn)生的模型文件,該參數(shù)如果不設(shè)置將采用默認(rèn)的文件名,也可以設(shè)置成自己慣用的文件名。舉個(gè)例子如下:
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
現(xiàn)簡(jiǎn)單對(duì)屏幕回顯信息進(jìn)行說明:
#iter為迭代次數(shù),
nu 與前面的操作參數(shù)-n nu 相同,
obj為SVM文件轉(zhuǎn)換為的二次規(guī)劃求解得到的最小值,
rho 為判決函數(shù)的常數(shù)項(xiàng)b,
nSV 為支持向量個(gè)數(shù),
nBSV為邊界上的支持向量個(gè)數(shù),
Total nSV為支持向量總個(gè)數(shù)。
訓(xùn)練后的模型保存為文件*.model,用記事本打開其內(nèi)容如下:
svm_type c_svc % 訓(xùn)練所采用的svm類型,此處為C- SVC
kernel_type rbf %訓(xùn)練采用的核函數(shù)類型,此處為RBF核
gamma 0.0769231 %設(shè)置核函數(shù)中的g ,默認(rèn)值為1/ k
nr_class 2 %分類時(shí)的類別數(shù),此處為兩分類問題
total_sv 132 %總共的支持向量個(gè)數(shù)
rho 0.424462 %決策函數(shù)中的常數(shù)項(xiàng)b
label 1 -1%類別標(biāo)簽
nr_sv 64 68 %各類別標(biāo)簽對(duì)應(yīng)的支持向量個(gè)數(shù)
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)采用交叉驗(yàn)證選擇最佳參數(shù)C與g
??? 通常而言,比較重要的參數(shù)是 gamma (-g) 跟 cost (-c) 。而 cross validation (-v)
的參數(shù)常用5。那么如何去選取最優(yōu)的參數(shù)c和g呢?libsvm 的 python 子目錄下面的 grid.py 可以幫助我們。 此時(shí)。其中安裝python2.5需要(一般默認(rèn)安裝到c:/python25
下),將gnuplot解壓。安裝解壓完畢后,進(jìn)入/libsvm/tools目錄下,用文本編輯器(記事
本,edit都可以)修改grid.py文件,找到其中關(guān)于gnuplot路徑的那項(xiàng)(其默認(rèn)路徑為
gnuplot_exe=r"c:/tmp/gnuplot/bin/pgnuplot.exe"),根據(jù)實(shí)際路徑進(jìn)行修改,并保存。然
后,將grid.py和C:/Python25目錄下的python.exe文件拷貝到libsvm/windows目錄下,鍵入以下命令:$ python grid.py train.1.scale 執(zhí)行后,即可得到最優(yōu)參數(shù)c和g。
??? 另外,至于下libsvm和python的接口的問題,在libsvm2.86中林老師已經(jīng)幫助我們解決,在/libsvm/windows/python目錄下自帶了svmc.pyd這個(gè)文件,將該文件文件復(fù)制到
libsvm/python目錄下,同時(shí),也將python.exe文件復(fù)制到該目錄下,鍵入以下命令以檢驗(yàn)效
果(注意:.Py文件中關(guān)于gnuplot路徑的那項(xiàng)路徑一定要根據(jù)實(shí)際路徑修改):
python svm_test.py
??? 如果能看到程序執(zhí)行結(jié)果,說明libsvm和python之間的接口已經(jīng)配置完成,以后就可以直接在python程序里調(diào)用libsvm的函數(shù)了!
5) 采用最佳參數(shù)C與g 對(duì)整個(gè)訓(xùn)練集進(jìn)行訓(xùn)練獲取支持向量機(jī)模型
?? $ svmtrain –c x –g x –v x training_set_file [model_file]
?? x為上述得到的最優(yōu)參數(shù)c和g的值,v的值一般取5。
6)利用獲取的模型進(jìn)行測(cè)試與預(yù)測(cè)
使用Svmtrain訓(xùn)練好的模型進(jìn)行測(cè)試。輸入新的X值,給出SVM預(yù)測(cè)出的Y值
?$ Svmpredict? test_file? model_file? output_file
如:./svm-predict heart_scale heart_scale.model heart_scale.out
Accuracy = 86.6667% (234/270) (classification)
這里顯示的是結(jié)果
一個(gè)具體使用的例子。
?? ?以libsvm中的heart_scale作為訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù),同時(shí)已經(jīng)將python安裝至c盤,并將grid.py文件中關(guān)于gnuplot路徑的默認(rèn)值修改為實(shí)際解壓縮后的路徑,將
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
此時(shí),已經(jīng)得到heart_scale.model,進(jìn)行預(yù)測(cè):
./svm-predict heart_scale? heart_scale.model ?heart_scale.out
Accuracy = 86.6667% (234/270) (classification)
正確率為Accuracy = 86.6667%。
./python grid.py heart_scale
得到最優(yōu)參數(shù)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%.這塊還有點(diǎn)迷惑?為什么正確率降低了?
當(dāng)然也可以結(jié)合subset.py 和 easy.py 實(shí)現(xiàn)自動(dòng)化過程。
如果要訓(xùn)練多次,可以寫個(gè)批處理程序省好多事。
這里舉個(gè)例子:
::@ 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
這段批處理代碼首先調(diào)用subset.py對(duì)文件b59.txt執(zhí)行1000次分層隨機(jī)抽樣(對(duì)數(shù)據(jù)進(jìn)行80-20%分割)然后調(diào)用easy.py 進(jìn)行1000次參數(shù)尋優(yōu),把記錄結(jié)果寫到result89.txt中
(包括1000次訓(xùn)練的分類準(zhǔn)確率和參數(shù)對(duì))。
還可以調(diào)用fselect.py進(jìn)行特征選擇,調(diào)用plotroc.py進(jìn)行roc曲線繪制。
先寫到這里吧,希望能和大家一起學(xué)習(xí)libsvm,進(jìn)一步學(xué)好svm。
?
總結(jié)
以上是生活随笔為你收集整理的libsvm使用心得的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mathtype中批量修改公式的字号和大
- 下一篇: 15个学习习惯,受益一生(强烈推荐)