Python: https://www.python.org/downloads/
Gnuplot: https://sourceforge.net/projects/gnuplot/files/gnuplot/
LIBSVM: http://www.csie.ntu.edu.tw/~cjlin/
測試資料集:http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/
1、libSVM的資料格式轉換:
資料有很多存儲格式,txt格式,xls格式,data格式,csv格式等等,這些資料格式之間都可以互相轉換,在此介紹一下xls如何生成libsvm格式的資料。
生成libsvm資料有兩種方法,在此介紹使用FormatDatalibsvm工具,因為這種方法直覺簡單,效率高,友善易行。其實隻是利用了excel的宏。
一、.xls格式——>svm格式的轉換
① 下載下傳FormatDatalibsvm.xls 位址如下:
http://download.csdn.net/detail/smilehehe110/9702456
②準備好Excel資料集
如果是csv格式的可以先通過Excel轉換成.xls格式,具體方法見下面。
③打開FormatDatalibsvm.xls
注意上方會出現一個框框提醒你宏已經被禁用,一定要點選更改,啟用宏。
④加載data
可以直接将資料複制到topleft單元格,注意複制的時候隻複制資料區域相關的屬性,不要複制屬性名稱,否則會崩潰。
⑤轉換
在Excel界面點選
“工具”—>”宏”—>”宏”—>FormatDatatoLibsvm–>執行
或“視圖”—>”宏”—>”檢視宏”——>FormatDatatoLibsvm–>執行
可以看到資料在進行轉換和移動,稍等一下就可以看到資料變成了libsvm格式。
等資料轉換完成後,将該檔案儲存為.txt檔案。這時資料轉換的問題就解決了。
csv和xls轉換
有時候一開始拿到的資料時csv格式的,想把它轉換成Excel原始格式,可以按照以下方式進行:
② 打開Excel,建立一空白文檔。
② 在界面中單擊“資料”—>“自文本”。找到并選中csv檔案“源檔案.csv”,單擊“導入”。
操作會彈出一個視窗,不用做任何操作,點選下一步。
③在下一個界面根據分隔符類型選擇相應符号,如逗号、分号等,選擇後點選下一步
③ 接着點選下一步,如果需要更改資料格式可做調整。
④ 點選完成,彈出一個視窗,選擇資料的存放位置,完成操作,可以看到資料變成了最原始的xls格式。
二、.txt格式——>svm格式的轉換
首先說明的是,這裡所提的.txt文本資料是指資料檔案帶有逗号、空格、頓号、分号等資料分離符号的資料檔案。因為其用符号來分離,導緻所有資料項都歸類為一個屬性,無法實作上面2步驟的格式輸入,也就無法實作正确結果格式的輸出了。
為了解決該問題,轉換該過程與上面過程的最大不同就在于:
在打開該.txt檔案的時候根據文本資料本身的資料特點将其所包含的逗号、分号、制表符等資料分離的符号去掉;
具體的做法是:轉換運作FormatDataLibsvm.xls,“檔案”->“打開”->選擇要打開的data.txt檔案,接着在文本導入向導中根據data.txt檔案本身的資料特點選擇“原始資料類型(分隔符号)”;接着選擇分隔符号的類型(目的是使得該資料分成獨立的一列列資料,分離成功的話,在資料預覽中将可以看到一列列分離獨立的資料) :選擇“列資料格式”(正常)->完成;
這時候隻要調整上面過程的資料格式,重複其後面的步驟2、3操作即可。
總結:資料最終要從.xls向libSVM進行格式轉換
2、(Subset.py的用法)樣本子集的選擇:
1、定位到tools目錄下
cd C:\libsvm-3.21\tools
2、>python subset.py heart_scale 200 heart_train heart_test
結果:tools目錄下多出2個檔案夾heart_train和heart_test檔案,資料集大小分别為200和70(原資料集heart_scale有270條資料)
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
3、(grid.py的用法)參數選擇:
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
選擇最佳參數c和g
通常而言,比較重要的參數是 gamma(-g) 跟 cost(-c) 。而 crossvalidation (-v)的參數常用5。
那麼如何去選取最優的參數c和g呢?
(Windows使用者,需要安裝gnuplot,非解壓)
libsvm 的 tools目錄下的 grid.py 可以幫助我們。 此時,其中需要安裝python3.5(一般預設安裝到c:/python35-32下),安裝成功之後修改環境變量,将Python的安裝路徑添加到計算機的環境變量path中去;安裝gnuplot(我安裝到了c:/gnuplot504)
安裝完畢後,進入/libsvm/tools目錄下,用文本編輯器(最好是IDLE)修改grid.py檔案,找到其中關于gnuplot路徑(c:/gnuplot504/bin)的那項(其預設路徑為gnuplot_exe=r"c:/tmp/gnuplot/bin/pgnuplot.exe"),根據實際路徑進行修改,本例即用"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 執行後,即可得到最優參數c和g。
(注意:grid.Py檔案中關于gnuplot路徑的那項路徑一定要根據實際路徑修改)
不修改路徑的話,需要執行程式的時候給出詳細路徑資訊:
>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
如果能看到程式執行結果,說明libsvm和python之間的接口已經配置完成,以後就可以直接在python程式裡調用libsvm的函數了!
1、修改gnuplot的路徑
C:\gnuplot504\bin\gnuplot.exe
2、定位到tools目錄下
cd C:\libsvm-3.21\tools
3、>python grid.py heart-scale
結果輸出: grid.py輸出兩個檔案
1. dataset.png: the CV accuracy contourplot generated by gnuplot,測試heart_scale,輸出heart_scale.png圖像在tools目錄下,該圖像顯示了資料集名稱以及最優(c,g)和best_rate。
2. dataset.out: the CV accuracy ateach (log2(C),log2(gamma)),輸出每一個(c,g)組以及交叉驗證結果。
以下為中間執行結果:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX3VEVNxGaXp1bWdkYwFjMjZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TM5gDO0YDN5EzNyITM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
使用grid.py是預設的取值範圍,可以根據實際情況進行修改。
關于SVM參數的優化選取,國際上并沒有公認統一的最好的方法,現在目前常用的方法就是讓c和g在一定的範圍内取值,對于取定的c和g對于把訓練集作為原始資料集利用K-CV方法得到在此組c和g下訓練集驗證分類準确率,最終取使得訓練集驗證分類準确率最高的那組c和g做為最佳的參數。
但有一個問題就是可能會有多組的c和g對應于最高的驗證分類準确率,這種情況怎麼處理?
這裡采用的手段是選取能夠達到最高驗證分類準确率中參數c最小的那組c和g做為最佳的參數,如果對應最小的c有多組g,就選取搜尋到的第一組c和g做為最佳的參數。
這樣做的理由是:過高的c會導緻過學習狀态發生,即訓練集分類準确率很高而測試集分類準确率很低(分類器的泛化能力降低),是以在能夠達到最高驗證分類準确率中的所有的成對的c和g中認為較小的懲罰參數c是更佳的選擇對象。
4、(checkdata.py的用法)LibSVM格式檢查:
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
5、(Easy.py的用法)一條龍服務:
檔案easy.py對樣本檔案做了“一條龍服務”,從參數優選,到檔案預測。是以,其對grid.py、svm-train、svm-scale和svm-predict都進行了調用(當然還有必須的python和gnuplot)。是以,運作easy.py需要保證這些檔案的路徑都要正确。當然還需要樣本檔案和預測檔案,這裡樣本檔案還是用heart_scale,預測檔案我們複制一份然後改名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
參數解讀:
Scaling training data...歸一化資料
Cross validation...在訓練集上做交叉驗證
Best c=2048.0,g=0.0001220703125 CV rate=84.0741
(通過網格搜尋法對每個參數對做交叉驗證,選擇交叉驗證精度最高所對應的參數.)
Training... ( 将上面得到的參數對在訓練集合上做模型訓練)
Output model: heart_scale.model (儲存模型到檔案)
Scaling testingdata... (歸一化資料)
Testing... (用訓練得出的模型對測試集進行測試)
Accuracy = 87.8049%(36/41) (classification)(測試的精度)
Output prediction: heart_test.predict(輸出預測結果)
(在交叉驗證過程中,會有一個圖形界面顯示參數選擇的情況,這就是gnuplot.exe的作用了)
SVM-scale操作:
用法: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:待縮放的資料檔案(要求滿足前面所述的格式)。
資料集的縮放結果在此情況下通過DOS視窗輸出,當然也可以通過DOS的檔案重定向符号“>”将結果另存為指定的檔案。
使用執行個體:
1)svm-scale –s train3.range train3> train3.scale
表示采用預設值(即對屬性值縮放到[1,1]−的範圍,對目标值不進行縮放)對資料集train3進行縮放操作,其結果縮放規則檔案儲存為train3.range,縮放集的縮放結果儲存為train3.scale。
2)svm-scale -r train3.range test3> test3.scale
表示載入縮放規則train3.range後按照其上下限對應的特征值和上下限值線性的地對資料集test3進行縮放,結果儲存為test3.scale。
3)svm-scale tran4>train4_scale (預設縮放範圍[-1,1])
SVM-train操作
svmtrain實作對訓練資料集的訓練,獲得SVM模型。
用法: svmtrain [options] training_set_file [model_file]
options(操作參數):可用的選項即表示的涵義如下所示
-s svm類型:設定SVM類型,預設值為0
-t 核函數類型:設定核函數類型,預設值為2
-d degree:核函數中的degree設定,預設值為3;
-g γ:設定核函數中的γ,預設值為1/k; -r 0coef:設定核函數中的0coef,預設值為0;
-c cost:設定CSVC−、SVRε−、SVRν−中從懲罰系數C,預設值為1; -n ν:設定SVCν−、oneclassSVM−−與SVRν− 中參數ν,預設值0.5;
-p ε:設定SVRν−的損失函數中的ε,預設值為0.1;
-m cachesize:設定cache記憶體大小,以MB為機關,預設值為40;
-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
SVM-predict操作
svmpredict是根據訓練獲得的模型,對資料集合進行預測。
用法:svmpredict [options] test_file model_file output_file
options(操作參數):
-b probability_estimates:是否需要進行機率估計預測,可選值為0或者1,預設值為0。
model_file是由svmtrain産生的模型檔案;
test_file是要進行預測的資料檔案;即使不知道label的值,也要任意填一個
output_file是svmpredict的輸出檔案,表示預測的結果值。
(注:Windows檔案夾下有*.exe檔案,tools檔案夾下有*.py,為了友善運作測試,可以把所有的*.py都移到Windows下,然後一直在windows下運作,不用更換路徑; 新舊版某些*.exe檔案名所有差别,以windows檔案夾下命名方式為準)