libsvm 使用介紹

一、介紹:

        LIBSVM是臺灣大學林智仁(Chih-Jen Lin)副教授等開發設計的一個簡單、易於使用和快速有效的SVM模式識別與迴歸的軟件包,他不但提供了編譯好的可在Windows系列系統的執行文件,還提供了源代碼,方便改進、修改以及在其它操作系統上應用;該軟件還有一個特點,就是對SVM所涉及的參數調節相對比較少,提供了很多的默認參數,利用這些默認參數就可以解決很多問題;並且提供了交互檢驗(Cross Validation)的功能。

二、安裝使用

1、下載

總共需要三個軟件:libsvm, python, gnuplot。(python安裝就不用說了,記得加python路徑到環境變量)

gnuplot是用來畫圖用的。可以直接去這裏下載http://download.csdn.net/detail/kuaile123/6252717

放置路徑如下:

E:\labSoftWare\gp373w32

E:\labSoftWare\libsvm-2.9.tar\libsvm-2.9

2、修改參數

c:\libsvm-2.9\tools中修改easy.pygrid.py的路徑:

①打開easy.py 修改地方如下:

 else:
        # example for windows
 svmscale_exe = r"E:\labSoftWare\libsvm-2.9.tar\libsvm-2.9\windows\svm-scale.exe"
 svmtrain_exe = r"E:\labSoftWare\libsvm-2.9.tar\libsvm-2.9\windows\svm-train.exe"
 svmpredict_exe = r"E:\labSoftWare\libsvm-2.9.tar\libsvm-2.9\windows\svm-predict.exe"
 gnuplot_exe = r"E:\labSoftWare\gp373w32\pgnuplot.exe"
 grid_py = r"E:\labSoftWare\libsvm-2.9.tar\libsvm-2.9\tools\grid.py"

②點中grid.py修改路徑如下:

else:
       # example for windows
       svmtrain_exe = r"E:\labSoftWare\libsvm-2.9.tar\libsvm-2.9\windows\svm-train.exe"
       gnuplot_exe = r"E:\labSoftWare\gp373w32\pgnuplot.exe"

三、訓練步驟

裏面的語法和參數說明:按照 E:\labSoftWare\libsvm-2.9.tar\libsvm-2.9和E:\labSoftWare\libsvm-2.9.tar\libsvm-2.9\tools下的README

(1)按照LIBSVM軟件包所要求的格式準備數據集;

libSVM的數據格式

Label 1:value 2:value ….

 Label:是類別的標識,比如1 -1,可以自己隨意定,比如-10015。當然,如果是迴歸,這是目標值,就要實事求是了。

Value:就是要訓練的數據,從分類的角度來說就是特徵值,數據之間用空格隔開

 需要注意的是,如果特徵值爲0,特徵冒號前面的(姑且稱做序號)可以不連續。如:

       -15 1:0.708 3:-0.3333

表明第2個特徵值爲0,從編程的角度來說,這樣做可以減少內存的使用,並提高做矩陣內積時的運算速度。

準備的數據存放於txt中,如 heart.txt

可以在這裏下載http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary/heart

(2)對數據進行縮放操作;

svm-scale是用來對原始樣本進行縮放的,範圍可以自己定,一般是[0,1][-1,1]。縮放的目的主要是

1)防止某個特徵過大或過小,從而在訓練中起的作用不平衡;

2)爲了計算速度。因爲在覈計算中,會用到內積運算或exp運算,不平衡的數據可能造成計算困難。

用法:svm-scale [-l lower] [-u upper]

                         [-y y_lower y_upper]

                         [-s save_filename]

                         [-r restore_filename] filename

其中,[]中都是可選項:

         -l:設定數據下限;lower:設定的數據下限值,缺省爲-1

         -u:設定數據上限;upper:設定的數據上限值,缺省爲 1

         -y:是否對目標值同時進行縮放;y_lower爲下限值,y_upper爲上限值;

         -s save_filename:表示將縮放的規則保存爲文件save_filename;

         -r restore_filename:表示將按照已經存在的規則文件restore_filename進行縮放;

         filename:待縮放的數據文件,文件格式按照libsvm格式。

 

默認情況下,只需要輸入要縮放的文件名就可以了:    

                         svm-scaleheart.txt

這時,test.txt中的數據已經變成[-1,1]之間的數據了。但是,這樣原來的數據就被覆蓋了,爲了讓規劃好的數據另存爲其他的文件,我們用一個dos的重定向符 > 來另存爲(假設爲out.txt):

                                 svm-scaleheart.txt > out.txt

    運行後,我們就可以看到目錄下多了一個out.txt文件,那就是規範後的數據。假如,我們想設定數據範圍[0,1],並把規則保存爲heart.range文件:

                         svm-scale –l 0 –u 1 -sheart.range heart.txt > out.txt 

 

將數據heart.txt保存在E:\labSoftWare\libsvm-2.9.tar\libsvm-2.9\windows文件夾下

svm-scale -l 0 -u 1 heart.txt > heart.scale.txt

(3)選用適當的核函數;

(4)採用交叉驗證選擇懲罰係數Cg的最佳參數;

cd 到所要保存文件的路徑下 輸入

python E:\labSoftWare\libsvm-2.9.tar\libsvm-2.9\tools\grid.py -log2c -10,10,1 -log2g -10,10,1 E:\labSoftWare\libsvm-2.9.tar\libsvm-2.9\windows\heart.scale.txt > test.txt

會出錯顯示 libsvm NameError: global name 'split' is not defined

原因是split使用語法錯誤,跟python版本不一致造成的,將split(argv[i],",") 都替換爲argv[i].split(",")

這個需要一段時間,產生一個test.txt文件,其中記錄了參數尋優的結果

可以看到,參數分別爲c 2.0g 0.03125,正確率mse84%。

還可以得到heart.scale.txt.png

(5)採用獲得的最佳參數對整個訓練集進行訓練獲取支持向量機模型;

svm-train用法:

用法: svm-train [options] training_set_file [model_file]

其中,options爲操作參數,可用的選項即表示的涵義如下所示:

-s設置svm類型:

        0 – C-SVC

        1 – v-SVC

        2 – one-class-SVM

        3 –ε-SVR

        4 – n - SVR

-t設置核函數類型,默認值爲2

         0 -- 線性核:u'*v

         1 -- 多項式核: (g*u'*v+coef0)degree

         2 -- RBF 核:exp(-γ*||u-v||2)

         3 -- sigmoid 核:tanh(γ*u'*v+coef0)

-d degree:設置多項式核中degree的值,默認爲3

-gγ:設置核函數中γ的值,默認爲1/kk爲特徵(或者說是屬性)數;

        -r coef 0:設置核函數中的coef 0,默認值爲0

        -c cost:設置C-SVC、ε-SVRn - SVR中從懲罰係數C,默認值爲1

        -n v:設置v-SVCone-class-SVMn - SVR中參數,默認值0.5

        -pε:設置v-SVR的損失函數中的e,默認值爲0.1

        -m cachesize:設置cache內存大小,以MB爲單位,默認值爲40

        -eε:設置終止準則中的可容忍偏差,默認值爲0.001

        -h shrinking:是否使用啓發式,可選值爲01,默認值爲1

        -b概率估計:是否計算SVCSVR的概率估計,可選值01,默認0

        -wi weight:對各類樣本的懲罰係數C加權,默認值爲1

        -v nn折交叉驗證模式;

        model_file:可選項,爲要保存的結果文件,稱爲模型文件,以便在預測時使用。   

    默認情況下,只需要給函數提供一個樣本文件名就可以了,但爲了能保存結果,還是要提供一個結果文件名,比如:test.model,則命令爲:

                                         svm-train heart.txttest.model

 

利用上步所得到的的參數 c 2.0g 0.03125 對heart.scale.txt進行訓練,cd 到 E:\labSoftWare\libsvm-2.9.tar\libsvm-2.9\windows 下輸入:

svm-train –c 2.0 –g 0.03125 -b 1  heart.scale.txt heart.scale.txt.model

注意此處這裏會生成 heart.scale.txt.model

注意要加 -b 1 不然進行c++連接訓練時會出錯。probability_estimates train a SVR model for probability estimates 

(6)利用獲取的模型進行測試與預測

svm-predict 是根據訓練獲得的模型,對數據集合進行預測。

   用法:svm-predict [options] test_file model_file output_file 

   其中,options爲操作參數,可用的選項即表示的涵義如下所示:

-b probability_estimates——是否需要進行概率估計預測,可選值爲0或者1,默認值爲0

model_file ——是由svmtrain產生的模型文件;

test_file——是要進行預測的數據文件,格式也要符合libsvm格式,即使不知道label的值,也要任意填一個,svmpredict會在output_file中給出正確的label結果,如果知道label的值,就會輸出正確率;

output_file ——svmpredict的輸出文件,表示預測的結果值。 

 

如在一個test1.txt文件輸入一個符合規則的值,輸出結果保存在result1.txt中,則 cmd下輸入 svm-predict test1.txtheart.scale.txt.model result1.txt

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章