天天看點

libsvm的使用(Python、gnuplot的下載下傳安裝)1、libSVM的資料格式轉換:

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)組以及交叉驗證結果。

   以下為中間執行結果:

libsvm的使用(Python、gnuplot的下載下傳安裝)1、libSVM的資料格式轉換:

使用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

libsvm的使用(Python、gnuplot的下載下傳安裝)1、libSVM的資料格式轉換:

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

libsvm的使用(Python、gnuplot的下載下傳安裝)1、libSVM的資料格式轉換:

參數解讀:

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檔案夾下命名方式為準)