支持向量機用法


 

1.文件中數據格式

label index1:value1 index2:value2 ...

Label在分類中表示類別標識,在預測中表示對應的目標值

Index表示特征的序號,一般從1開始,依次增大

Value表示每個特征的值

例如:

3 1:0.122000 2:0.792000

3 1:0.144000 2:0.750000

3 1:0.194000 2:0.658000

3 1:0.244000 2:0.540000

3 1:0.328000 2:0.404000

3 1:0.402000 2:0.356000

3 1:0.490000 2:0.384000

3 1:0.548000 2:0.436000

 數據文件准備好后,可以用一個python程序檢查格式是否正確,這個程序在下載的libsvm文件夾的子文件夾tools下,叫checkdata.py,用法:在windows命令行中先移動到checkdata.py所在文件夾下,輸入:checkdata.py 你要檢查的文件完整路徑(包含文件名)

回車后會提示是否正確。

 

 

2.對數據進行歸一化。

    該過程要用到libsvm軟件包中的svm-scale.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為上限值;(回歸需要對目標進行縮放,因此該參數可以設定為 –y -1 1 ) 

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

        -r restore_filename:表示將縮放規則文件restore_filename載入后按此縮放; 

        filename:待縮放的數據文件(要求滿足前面所述的格式)。

 

    數據集的縮放結果在此情況下通過DOS窗口輸出,當然也可以通過DOS的文件重定向符號“>”將結果另存為指定的文件。該文件中的參數可用於最后面對目標值的反歸一化。反歸一化的公式為:

 

    (Value-y_lower)*(max-min)/(y_upper - y_lower)+min

其中value為歸一化后的值,max,min分別是歸一化之前所有目標值的最大值和最小值,其他參數與前面介紹的相同。

    注意:    將訓練數據集與測試數據集放在同一個文本文件中一起歸一化,然后再將歸一化結果分成訓練集和測試集。

3.訓練數據,生成模型。

    用法: svmtrain [options] training_set_file [model_file]

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

     -s svm類型:設置SVM 類型,默認值為0,可選類型有(對於回歸只能選3或4):

    0 -- C- SVC     1 -- n - SVC     2 -- one-class-SVM     3 -- e - SVR     4 -- n - SVR 

    -t 核函數類型:設置核函數類型,默認值為2,可選類型有: 

        0 -- 線性核:u'*v 

        1 -- 多項式核: (g*u'*v+ coef 0)deg ree 

        2 -- RBF 核:e( u v 2) g - 

        3 -- sigmoid 核:tanh(g*u'*v+ coef 0) 

        -d degree:核函數中的degree設置,默認值為3;

        -g g :設置核函數中的g ,默認值為1/ k ; 

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

        -c cost:設置C- SVC、e - SVR、n - SVR中從懲罰系數C,默認值為1; 

        -n n :設置n - SVC、one-class-SVM 與n - SVR 中參數n ,默認值0.5; 

        -p e :設置n - SVR的損失函數中的e ,默認值為0.1; 

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

        -e 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是訓練結束后產生的模型文件,該參數如果不設置將采用默認的文件名,也可以設置成自己慣用的文件名。

 

另, 實驗中所需調整的重要參數是-c 和 –g,-c和-g的調整除了自己根據經驗試之外,還可以使用grid.py對這兩個參數進行優化。

注意:經過實測,在用於分類時,grid.py能得到較好參數值,但用於回歸時得到的參數值效果很差。

    該優化過程需要用到Python(2.5),Gnuplot(4.2),grid.py(該文件需要修改路徑)。

 

    然后在命令行下面運行:

grid.py -log2c -10,10,1 -log2g -10,10,1 -log2p -10,10,1 -s 3 -t 2 -v 5 -svmtrain E:\libsvm-2.86\windows\svm-train.exe -gnuplot E:\gnuplot\bin\pgnuplot.exe  E:\libsvm\libsvm-2.86\windows\train.txt以上三個路徑根據實際安裝情況進行修改。

    -log2c是給出參數c的范圍和步長 

    -log2g是給出參數g的范圍和步長 

    -log2p是給出參數p的范圍和步長上面三個參數可以用默認范圍和步長 

    -s選擇SVM類型,也是只能選3或者4 

    -t是選擇核函數 

    -v 5 將訓練數據分成5份做交叉驗證。默認為5

 

    搜索結束后可以在最后一行看到最優參數。

    其中,最后一行的第一個參數即為-c,第二個為-g,第三個為-p,前三個參數可以直接用於模型的訓練。

然后,根據搜索得到的參數,重新訓練,得到模型。

命令行會出現以下內容:

optimization finished, #iter = 162

nu = 0.431029

obj = -100.877288, rho = 0.424462

nSV = 132, nBSV = 107

Total nSV = 132

  其中,#iter為迭代次數,nu 是你選擇的核函數類型的參數,obj為SVM文件轉換為的二次規划求解得到的最小值,rho為判決函數的偏置項b,nSV 為標准支持向量個數(0<a[i]<c),nBSV為邊界上的支持向量個數(a[i]=c),Total nSV為支持向量總個數(對於兩類來說,因為只有一個分類模型Total nSV = nSV,但是對於多類,這個是各個分類模型的nSV之和)。

 

模型文件內容前幾行大致如下:

svm_type epsilon_svr//svm類型

kernel_type rbf//核函數類型

gamma 100//訓練時參數g的值

nr_class 2  //類別數,此處為兩分類問題

total_sv 12//支持向量個數

rho -0.35336//判決函數的偏置項b

SV //以下為各個類的權系數及相應的支持向量

文件中下面是支持向量數據

 

4.測試

 

    用法:svmpredict [options] test_file model_file output_file options(操作參數): -b probability_estimates:是否需要進行概率估計預測,可選值為0 或者1,默認值為0。 model_file 是由svmtrain 產生的模型文件;

 

    test_file 是要進行預測的數據文件;

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

輸出結果包括均方誤差(Mean squared error)和相關系數(Squared correlation coefficient)。

5.實例

<1> 下載LibsvmPythonGnuplot。我用的版本分別是:Libsvm(2.8.1),Python(2.4),Gnuplot(3.7.3)。

 

<2> 修改訓練和測試數據的格式:

目標值 第一維特征編號:第一維特征值 第二維特征編號:第二維特征值 …

例如:

2.3 1:5.6 2:3.2

表示訓練用的特征有兩維,第一維是5.6,第二維是3.2,目標值是2.3

注意:訓練和測試數據的格式必須相同,都如上所示。測試數據中的目標值是為了計算誤差用

檢查格式正確性:用checkdata.py,上面已經介紹過

 

<3>開始處理數據 

分別使用Libsvm中的Windows版本的工具svmscale.exe進行訓練和測試數據的歸一化,svmtrain.exe進行模型訓練,svmpredict.exe進行預測

 

(1)Svm-scale.exe用法:

Svm-scale.exe -y 0 1 -l 0 -u 1 feature.txt feature.scaled

 

講目標值和特征值都歸一到[-1,1],默認的歸一化范圍是[-1,1],可以用參數-y ,-l和-u分別調整上界和下屆,feature.txt是輸入特征文件名

輸出的歸一化文件名為feature.scaled

然后將feature.scaled中的某些數據剪切到另一文件feature_test.scaled中,用於最后測試。

 

2svm-train.exe訓練模型

Svm-train.exe -s 3 -p 0.0001 -t 2 -g 32 -c 0.53125 feature.scaled

訓練得到的模型為feature.scaled.model

具體的參數含義可以參考幫助文檔。這里-s是選擇SVM的類型。對於回歸來說,只能選3或者 4,3表示epsilon-support vector regression, 4表示nu-support vector regression。-t是選擇核函數,通常選用RBF核函數。-p盡量選個比較小的數字。需要仔細調整的重要參數是-c和-g。除非用 grid.py來搜索最優參數,否則只能自己慢慢試了。

 

(3)用svm-predict.exe進行預測

Svm-predict.exe feature_test.scaled feature.scaled.model feature_test.predicted

 

其中feature_test.scaled是歸一化后的測試特征文件名,feature.scaled.model是訓練好的模型,SVM預測的值在feature_test.predicted中

6.svm-toy.exe的使用

在libsvm-3.19\windows下有個名為svm-toy.exe的,他是用來展示你的數據樣式和查看預測分類結果的。

 

可以在上面任意點擊,他會根據點擊的位置生成點,”change”可以改變點的顏色,“save”用來保存這些數據到一個文件,也可以用“load”裝載經過歸一化后的數據文件,在按鈕后面輸入想設置的參數后,點擊”run”就會出現分類或預測結果。利用它,可以直觀地看到改變某些參數導致的變化和結果,從而便於找到合適參數。

例如:對於下列數據

0.239 1:0.000

0.351 1:0.033

0.342 1:0.067

0.338 1:0.100

0.350 1:0.133

0.375 1:0.167

0.032 1:0.200

0.192 1:0.233

0.059 1:0.267

0.242 1:0.300

0.113 1:0.333

0.437 1:0.367

0.650 1:0.400

0.796 1:0.433

0.939 1:0.467

0.892 1:0.500

0.874 1:0.533

0.768 1:0.567

0.672 1:0.600

0.411 1:0.633

0.396 1:0.667

0.184 1:0.700

0.000 1:0.733

0.118 1:0.767

0.165 1:0.800

0.293 1:0.833

0.331 1:0.867

0.356 1:0.900

0.317 1:0.933

0.329 1:0.967

0.183 1:1.000

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM