Python: https://www.python.org/downloads/
Gnuplot: https://sourceforge.net/projects/gnuplot/files/gnuplot/
LIBSVM: http://www.csie.ntu.edu.tw/~cjlin/
測試數(shù)據(jù)集:http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/
數(shù)據(jù)有很多存儲格式,txt格式,xls格式,data格式,csv格式等等,這些數(shù)據(jù)格式之間都可以互相轉(zhuǎn)換,在此介紹一下xls如何生成libsvm格式的數(shù)據(jù)。
生成libsvm數(shù)據(jù)有兩種方法,在此介紹使用FormatDatalibsvm工具,因?yàn)檫@種方法直觀簡單,效率高,方便易行。其實(shí)只是利用了excel的宏。
一、.xls格式——>svm格式的轉(zhuǎn)換
① 下載FormatDatalibsvm.xls 地址如下:
http://download.csdn.net/detail/smilehehe110/9702456
②準(zhǔn)備好Excel數(shù)據(jù)集
如果是csv格式的可以先通過Excel轉(zhuǎn)換成.xls格式,具體方法見下面。
③打開FormatDatalibsvm.xls
注意上方會(huì)出現(xiàn)一個(gè)框框提醒你宏已經(jīng)被禁用,一定要點(diǎn)擊更改,啟用宏。
④加載data
可以直接將數(shù)據(jù)復(fù)制到topleft單元格,注意復(fù)制的時(shí)候只復(fù)制數(shù)據(jù)區(qū)域相關(guān)的屬性,不要復(fù)制屬性名稱,否則會(huì)崩潰。
⑤轉(zhuǎn)換
在Excel界面點(diǎn)擊
“工具”—>”宏”—>”宏”—>FormatDatatoLibsvm–>執(zhí)行
或“視圖”—>”宏”—>”查看宏”——>FormatDatatoLibsvm–>執(zhí)行
可以看到數(shù)據(jù)在進(jìn)行轉(zhuǎn)換和移動(dòng),稍等一下就可以看到數(shù)據(jù)變成了libsvm格式。
等數(shù)據(jù)轉(zhuǎn)換完成后,將該文件保存為.txt文件。這時(shí)數(shù)據(jù)轉(zhuǎn)換的問題就解決了。
csv和xls轉(zhuǎn)換
有時(shí)候一開始拿到的數(shù)據(jù)時(shí)csv格式的,想把它轉(zhuǎn)換成Excel原始格式,可以按照以下方式進(jìn)行:
② 打開Excel,新建一空白文檔。
② 在界面中單擊“數(shù)據(jù)”—>“自文本”。找到并選中csv文件“源文件.csv”,單擊“導(dǎo)入”。
操作會(huì)彈出一個(gè)窗口,不用做任何操作,點(diǎn)擊下一步。
③在下一個(gè)界面根據(jù)分隔符類型選擇相應(yīng)符號,如逗號、分號等,選擇后點(diǎn)擊下一步
③ 接著點(diǎn)擊下一步,如果需要更改數(shù)據(jù)格式可做調(diào)整。
④ 點(diǎn)擊完成,彈出一個(gè)窗口,選擇數(shù)據(jù)的存放位置,完成操作,可以看到數(shù)據(jù)變成了最原始的xls格式。
二、.txt格式——>svm格式的轉(zhuǎn)換
首先說明的是,這里所提的.txt文本數(shù)據(jù)是指數(shù)據(jù)文件帶有逗號、空格、頓號、分號等數(shù)據(jù)分離符號的數(shù)據(jù)文件。因?yàn)槠溆梅杹矸蛛x,導(dǎo)致所有數(shù)據(jù)項(xiàng)都?xì)w類為一個(gè)屬性,無法實(shí)現(xiàn)上面2步驟的格式輸入,也就無法實(shí)現(xiàn)正確結(jié)果格式的輸出了。
為了解決該問題,轉(zhuǎn)換該過程與上面過程的最大不同就在于:
在打開該.txt文件的時(shí)候根據(jù)文本數(shù)據(jù)本身的數(shù)據(jù)特點(diǎn)將其所包含的逗號、分號、制表符等數(shù)據(jù)分離的符號去掉;
具體的做法是:轉(zhuǎn)換運(yùn)行FormatDataLibsvm.xls,“文件”->“打開”->選擇要打開的data.txt文件,接著在文本導(dǎo)入向?qū)е懈鶕?jù)data.txt文件本身的數(shù)據(jù)特點(diǎn)選擇“原始數(shù)據(jù)類型(分隔符號)”;接著選擇分隔符號的類型(目的是使得該數(shù)據(jù)分成獨(dú)立的一列列數(shù)據(jù),分離成功的話,在數(shù)據(jù)預(yù)覽中將可以看到一列列分離獨(dú)立的數(shù)據(jù)) :選擇“列數(shù)據(jù)格式”(常規(guī))->完成;
這時(shí)候只要調(diào)整上面過程的數(shù)據(jù)格式,重復(fù)其后面的步驟2、3操作即可。
總結(jié):數(shù)據(jù)最終要從.xls向libSVM進(jìn)行格式轉(zhuǎn)換
1、定位到tools目錄下
cd C:\libsvm-3.21\tools
2、>python subset.py heart_scale 200 heart_train heart_test
結(jié)果:tools目錄下多出2個(gè)文件夾heart_train和heart_test文件,數(shù)據(jù)集大小分別為200和70(原數(shù)據(jù)集heart_scale有270條數(shù)據(jù))
Python:
Usage: subset.py [options] dataset number [output1] [output2]
options:
-s method : method of selection (default 0)
0 -- stratifiedselection (classification only)
1 -- randomselection
output1 : the subset (optional)
output2 : the rest of data (optional)
Example:
>python subset.py heart_scale 100 file1 file2
Python:
Usage: grid.py [grid_options] [svm_options] dataset
grid_options :
-log2c {begin,end,step| "null"} : set the range of c (default -5,15,2)
begin,end,step --c_range = 2^{begin,...,begin+k*step,...,end}
"null" -- do notgrid with c
-log2g {begin,end,step| "null"} : set the range of g (default 3,-15,-2)
begin,end,step --g_range = 2^{begin,...,begin+k*step,...,end}
"null" -- do notgrid with g
-v n : n-fold crossvalidation (default 5)
-svmtrain {pathname} : setsvm executable path and name
-gnuplot {pathname |"null"} :
pathname -- setgnuplot executable path and name
"null" -- do not plot
-out {pathname |"null"} : (default dataset.out)
pathname -- setoutput file path and name
"null" -- do notoutput file
-png pathname : setgraphic output file path and name (default dataset.png)
-resume [pathname] :resume the grid task using an existing output file (default pathname isdataset.out)
svm_options : additionaloptions for svm-train
example:
>python grid.py -log2c -5,5,1-log2g -4,0,1 -v 5 -m 300 heart_scale
>python grid.py -log2c -5,5,1 -svmtrain "c:\ProgramFiles\libsvm\windows\svm-train.exe" -gnuplotc:\tmp\gnuplot\binary\pgnuplot.exe -v 10 heart_scale
Output: two files
dataset.png: the CV accuracy contour plot generated bygnuplot
dataset.out: the CV accuracy at each (log2(C),log2(gamma))
The following example saves running time by loading theoutput file of a previous run.
> python grid.py -log2c -7,7,1 -log2g -5,2,1 -v 5 -resumeheart_scale.out heart_scale
通常而言,比較重要的參數(shù)是 gamma(-g) 跟 cost(-c) 。而 crossvalidation (-v)的參數(shù)常用5。
那么如何去選取最優(yōu)的參數(shù)c和g呢?
(Windows用戶,需要安裝gnuplot,非解壓)
libsvm 的 tools目錄下的 grid.py 可以幫助我們。 此時(shí),其中需要安裝python3.5(一般默認(rèn)安裝到c:/python35-32下),安裝成功之后修改環(huán)境變量,將Python的安裝路徑添加到計(jì)算機(jī)的環(huán)境變量path中去;安裝gnuplot(我安裝到了c:/gnuplot504)
安裝完畢后,進(jìn)入/libsvm/tools目錄下,用文本編輯器(最好是IDLE)修改grid.py文件,找到其中關(guān)于gnuplot路徑(c:/gnuplot504/bin)的那項(xiàng)(其默認(rèn)路徑為gnuplot_exe=r"c:/tmp/gnuplot/bin/pgnuplot.exe"),根據(jù)實(shí)際路徑進(jìn)行修改,本例即用"c:/gnuplot504/bin/gnnuplot.exe"代替"c:/tmp/gnuplot/bin/pgnuplot.exe",并保存。
(注意:看清楚bin目錄下的exe文件名稱,新版舊版有所差別)
然后,將grid.py和樣本文件(heart_scale)文件置于同一目錄下。
打開cmd,先定位到grid.py所在文件夾的位置:
cmd窗口中鍵入:cd C:\libsvm-3.21\tools
> python grid.py heart-scale 執(zhí)行后,即可得到最優(yōu)參數(shù)c和g。
(注意:grid.Py文件中關(guān)于gnuplot路徑的那項(xiàng)路徑一定要根據(jù)實(shí)際路徑修改)
不修改路徑的話,需要執(zhí)行程序的時(shí)候給出詳細(xì)路徑信息:
>grid.py -log2c -5,5,1 -svmtrain"C:\libsvm-3.21\windows\svm-train.exe" -gnuplot C:\gnuplot504\bin\gnuplot.exe -v 10 heart_scale
如果能看到程序執(zhí)行結(jié)果,說明libsvm和python之間的接口已經(jīng)配置完成,以后就可以直接在python程序里調(diào)用libsvm的函數(shù)了!
1、修改gnuplot的路徑
C:\gnuplot504\bin\gnuplot.exe
2、定位到tools目錄下
cd C:\libsvm-3.21\tools
3、>python grid.py heart-scale
結(jié)果輸出: grid.py輸出兩個(gè)文件
1. dataset.png: the CV accuracy contourplot generated by gnuplot,測試heart_scale,輸出heart_scale.png圖像在tools目錄下,該圖像顯示了數(shù)據(jù)集名稱以及最優(yōu)(c,g)和best_rate。
2. dataset.out: the CV accuracy ateach (log2(C),log2(gamma)),輸出每一個(gè)(c,g)組以及交叉驗(yàn)證結(jié)果。
以下為中間執(zhí)行結(jié)果:
使用grid.py是默認(rèn)的取值范圍,可以根據(jù)實(shí)際情況進(jìn)行修改。
關(guān)于SVM參數(shù)的優(yōu)化選取,國際上并沒有公認(rèn)統(tǒng)一的最好的方法,現(xiàn)在目前常用的方法就是讓c和g在一定的范圍內(nèi)取值,對于取定的c和g對于把訓(xùn)練集作為原始數(shù)據(jù)集利用K-CV方法得到在此組c和g下訓(xùn)練集驗(yàn)證分類準(zhǔn)確率,最終取使得訓(xùn)練集驗(yàn)證分類準(zhǔn)確率最高的那組c和g做為最佳的參數(shù)。
但有一個(gè)問題就是可能會(huì)有多組的c和g對應(yīng)于最高的驗(yàn)證分類準(zhǔn)確率,這種情況怎么處理?
這里采用的手段是選取能夠達(dá)到最高驗(yàn)證分類準(zhǔn)確率中參數(shù)c最小的那組c和g做為最佳的參數(shù),如果對應(yīng)最小的c有多組g,就選取搜索到的第一組c和g做為最佳的參數(shù)。
這樣做的理由是:過高的c會(huì)導(dǎo)致過學(xué)習(xí)狀態(tài)發(fā)生,即訓(xùn)練集分類準(zhǔn)確率很高而測試集分類準(zhǔn)確率很低(分類器的泛化能力降低),所以在能夠達(dá)到最高驗(yàn)證分類準(zhǔn)確率中的所有的成對的c和g中認(rèn)為較小的懲罰參數(shù)c是更佳的選擇對象。Usage: checkdata.py dataset
> cat bad_data
1 3:1 2:4
> python checkdata.py bad_data
line 1: feature indices must be in an ascending order,previous/current features 3:1 2:4
Found 1 lines with error.
1、定位到tools目錄下
cd C:\libsvm-3.21\tools
2、>python checkdata.pyheart_scale
文件easy.py對樣本文件做了“一條龍服務(wù)”,從參數(shù)優(yōu)選,到文件預(yù)測。因此,其對grid.py、svm-train、svm-scale和svm-predict都進(jìn)行了調(diào)用(當(dāng)然還有必須的python和gnuplot)。因此,運(yùn)行easy.py需要保證這些文件的路徑都要正確。當(dāng)然還需要樣本文件和預(yù)測文件,這里樣本文件還是用heart_scale,預(yù)測文件我們復(fù)制一份然后改名heart_test。
(注意:easy.py和樣本文件(heart_scale)、測試文件(heart_test)位于同一目錄tools下)
1、修改gnuplot的路徑
C:\gnuplot504\bin\gnuplot.exe
2、定位到tools目錄下
cd C:\libsvm-3.21\tools
3、> python easy.py heart_scale heart_test
參數(shù)解讀:
Scaling training data...歸一化數(shù)據(jù)
Cross validation...在訓(xùn)練集上做交叉驗(yàn)證
Best c=2048.0,g=0.0001220703125 CV rate=84.0741
(通過網(wǎng)格搜索法對每個(gè)參數(shù)對做交叉驗(yàn)證,選擇交叉驗(yàn)證精度最高所對應(yīng)的參數(shù).)
Training... ( 將上面得到的參數(shù)對在訓(xùn)練集合上做模型訓(xùn)練)
Output model: heart_scale.model (保存模型到文件)
Scaling testingdata... (歸一化數(shù)據(jù))
Testing... (用訓(xùn)練得出的模型對測試集進(jìn)行測試)
Accuracy = 87.8049%(36/41) (classification)(測試的精度)
Output prediction: heart_test.predict(輸出預(yù)測結(jié)果)
(在交叉驗(yàn)證過程中,會(huì)有一個(gè)圖形界面顯示參數(shù)選擇的情況,這就是gnuplot.exe的作用了)
用法:svmscale [-l lower] [-u upper] [-y y_lower y_upper]
[-s save_filename] [-r restore_filename] filename
(缺省值: lower = -1,upper = 1,沒有對y進(jìn)行縮放) 其中,
-l:數(shù)據(jù)下限標(biāo)記;lower:縮放后數(shù)據(jù)下限; -u:數(shù)據(jù)上限標(biāo)記;upper:縮放后數(shù)據(jù)上限;
-y:是否對目標(biāo)值同時(shí)進(jìn)行縮放;y_lower為下限值,y_upper為上限值;
-s save_filename:表示將縮放的規(guī)則保存為文件save_filename;
-r restore_filename:表示將縮放規(guī)則文件restore_filename載入后按此縮放; filename:待縮放的數(shù)據(jù)文件(要求滿足前面所述的格式)。
數(shù)據(jù)集的縮放結(jié)果在此情況下通過DOS窗口輸出,當(dāng)然也可以通過DOS的文件重定向符號“>”將結(jié)果另存為指定的文件。
使用實(shí)例:
1)svm-scale –s train3.range train3> train3.scale
表示采用缺省值(即對屬性值縮放到[1,1]?的范圍,對目標(biāo)值不進(jìn)行縮放)對數(shù)據(jù)集train3進(jìn)行縮放操作,其結(jié)果縮放規(guī)則文件保存為train3.range,縮放集的縮放結(jié)果保存為train3.scale。
2)svm-scale -r train3.range test3> test3.scale
表示載入縮放規(guī)則train3.range后按照其上下限對應(yīng)的特征值和上下限值線性的地對數(shù)據(jù)集test3進(jìn)行縮放,結(jié)果保存為test3.scale。
3)svm-scale tran4>train4_scale (默認(rèn)縮放范圍[-1,1])
svmtrain實(shí)現(xiàn)對訓(xùn)練數(shù)據(jù)集的訓(xùn)練,獲得SVM模型。
用法: svmtrain [options] training_set_file [model_file]
options(操作參數(shù)):可用的選項(xiàng)即表示的涵義如下所示
-s svm類型:設(shè)置SVM類型,默認(rèn)值為0
-t 核函數(shù)類型:設(shè)置核函數(shù)類型,默認(rèn)值為2
-d degree:核函數(shù)中的degree設(shè)置,默認(rèn)值為3;
-g γ:設(shè)置核函數(shù)中的γ,默認(rèn)值為1/k; -r 0coef:設(shè)置核函數(shù)中的0coef,默認(rèn)值為0;
-c cost:設(shè)置CSVC?、SVRε?、SVRν?中從懲罰系數(shù)C,默認(rèn)值為1; -n ν:設(shè)置SVCν?、oneclassSVM??與SVRν? 中參數(shù)ν,默認(rèn)值0.5;
-p ε:設(shè)置SVRν?的損失函數(shù)中的ε,默認(rèn)值為0.1;
-m cachesize:設(shè)置cache內(nèi)存大小,以MB為單位,默認(rèn)值為40;
-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:對各類樣本的懲罰系數(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è)置成自己慣用的文件名。
使用實(shí)例:
1)svmtrain train3.scale train3.model
訓(xùn)練train3.scale,將模型保存于文件train3.model,并在dos窗口中輸出如下結(jié)果:
optimization finished, #iter = 1756 nu = 0.464223
obj = -551.002342, rho = -0.337784 nSV = 604, nBSV = 557 Total nSV = 604
svmpredict是根據(jù)訓(xùn)練獲得的模型,對數(shù)據(jù)集合進(jìn)行預(yù)測。
用法:svmpredict [options] test_file model_file output_file
options(操作參數(shù)):
-b probability_estimates:是否需要進(jìn)行概率估計(jì)預(yù)測,可選值為0或者1,默認(rèn)值為0。
model_file是由svmtrain產(chǎn)生的模型文件;
test_file是要進(jìn)行預(yù)測的數(shù)據(jù)文件;即使不知道label的值,也要任意填一個(gè)
output_file是svmpredict的輸出文件,表示預(yù)測的結(jié)果值。
(注:Windows文件夾下有*.exe文件,tools文件夾下有*.py,為了方便運(yùn)行測試,可以把所有的*.py都移到Windows下,然后一直在windows下運(yùn)行,不用更換路徑; 新舊版某些*.exe文件名所有差別,以windows文件夾下命名方式為準(zhǔn))
聯(lián)系客服