svm訓練顯示信息說明


現簡單對屏幕回顯信息進行說明:

#iter 為迭代次數,

nu  與前面的操作參數 -n nu  相同,

obj 為 SVM 文件轉換為的二次規划求解得到的最小值,

rho  為判決函數的常數項 b 

nSV  為支持向量個數,

nBSV 為邊界上的支持向量個數,

Total nSV 為支持向量總個數。

訓練后的模型保存為文件 *.model ,用記事本打開其內容如下:

svm_type c_svc  訓練所采用的 svm 類型,此處為 C- SVC

kernel_type rbf % 訓練采用的核函數類型,此處為 RBF 

gamma 0.0769231 % 設置核函數中的 g  ,默認值為 1/ k

nr_class 2 % 分類時的類別數,此處為兩分類問題

total_sv 132 % 總共的支持向量個數

rho 0.424462 % 決策函數中的常數項 b

label 1 -1% 類別標簽

nr_sv 64 68 % 各類別標簽對應的支持向量個數

SV % 以下為支持向量

1 1:0.166667 2:1 3:-0.333333 4:-0.433962 5:-0.383562 6:-1 7:-1 8:0.0687023 9:-1 10:-0.903226 11:-1 12:-1 13:1

0.5104832128985164 1:0.125 2:1 3:0.333333 4:-0.320755 5:-0.406393 6:1 7:1 8:0.0839695 9:1 10:-0.806452 12:-0.333333 13:0.5

1 1:0.333333 2:1 3:-1 4:-0.245283 5:-0.506849 6:-1 7:-1 8:0.129771 9:-1 10:-0.16129 12:0.333333 13:-1

1 1:0.208333 2:1 3:0.333333 4:-0.660377 5:-0.525114 6:-1 7:1 8:0.435115 9:-1 10:-0.193548 12:-0.333333 13:1

4 )采用交叉驗證選擇最佳參數 C 與 g

     通常而言,比較重要的參數是  gamma (-g)  跟  cost (-c)  。而  cross validation (-v)

的參數常用 5 。那么如何去選取最優的參數 c 和 g 呢? libsvm  的  python  子目錄下面的  grid.py  可以幫助我們。   此時。其中安裝 python2.5 需要(一般默認安裝到 c:/python25

下),將 gnuplot 解壓。安裝解壓完畢后,進入 /libsvm/tools 目錄下,用文本編輯器(記事

本, edit 都可以)修改 grid.py 文件,找到其中關於 gnuplot 路徑的那項(其默認路徑為

gnuplot_exe=r"c:/tmp/gnuplot/bin/pgnuplot.exe" ),根據實際路徑進行修改,並保存。然

后,將 grid.py 和 C:/Python25 目錄下的 python.exe 文件拷貝到 libsvm/windows 目錄下,鍵入以下命令: $ python grid.py train.1.scale  執行后,即可得到最優參數 c 和 g 。

     另外,至於下 libsvm 和 python 的接口的問題,在 libsvm2.86 中林老師已經幫助我們解決,在/libsvm/windows/python 目錄下自帶了 svmc.pyd 這個文件,將該文件文件復制到

libsvm/python 目錄下,同時,也將 python.exe 文件復制到該目錄下,鍵入以下命令以檢驗效

果(注意: .Py 文件中關於 gnuplot 路徑的那項路徑一定要根據實際路徑修改):

python svm_test.py

     如果能看到程序執行結果,說明 libsvm 和 python 之間的接口已經配置完成,以后就可以直接在python 程序里調用 libsvm 的函數了!

5 )   采用最佳參數 C 與 g  對整個訓練集進行訓練獲取支持向量機模型

    $ svmtrain –c x –g x –v x training_set_file [model_file]

    x 為上述得到的最優參數 c 和 g 的值, v 的值一般取 5 。

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

使用 Svmtrain 訓練好的模型進行測試。輸入新的 X 值,給出 SVM 預測出的 Y 值

  $ Svmpredict   test_file   model_file   output_file

如: ./svm-predict heart_scale  heart_scale.model  heart_scale.out

Accuracy = 86.6667% (234/270) (classification)

這里顯示的是結果

一個具體使用的例子。

      以 libsvm 中的 heart_scale 作為訓練數據和測試數據,同時已經將 python 安裝至 c 盤,並將grid.py 文件中關於 gnuplot 路徑的默認值修改為實際解壓縮后的路徑,將

heart_scale 、 grid.py 和 python.exe 拷貝至 /libsvm/windows 文件夾下。

./svm-train heart_scale

optimization finished, #iter = 162

nu = 0.431029

obj = -100.877288, rho = 0.424462

nSV = 132, nBSV = 107

Total nSV = 132

此時,已經得到 heart_scale.model ,進行預測:

./svm-predict heart_scale   heart_scale.model   heart_scale.out

Accuracy = 86.6667% (234/270) (classification)

正確率為 Accuracy = 86.6667% 。

./python grid.py heart_scale

得到最優參數 c=2048 , g=0.0001220703125.

./svm-train -c 2048 -g 0.0001220703125 heart_scale 得到 model 后,由 ./svm-predict heart_scale  heart_scale.model heart_scale.out 得到的正確

率為 Accuracy = 85.1852%.這塊還有點迷惑?為什么正確率降低了?

 

當然也可以結合subset.py 和 easy.py 實現自動化過程。

如果要訓練多次,可以寫個批處理程序省好多事。

這里舉個例子:

::@ echo off
cls
:: split the data and output the results
for /L %%i in (1,1,1000) do python subset.py b59.txt 546 b59(%%i).in8 b59(%%i).out2

for /L %%i in (1,1,1000) do python easy.py b59(%%i).in8 b59(%%i).out2 >> result89.txt

 

這段批處理代碼首先調用subset.py對文件b59.txt執行1000次分層隨機抽樣(對數據進行80-20%分割)然后調用easy.py 進行1000次參數尋優,把記錄結果寫到result89.txt中

(包括1000次訓練的分類准確率和參數對)。

還可以調用fselect.py進行特征選擇,調用plotroc.py進行roc曲線繪制。

先寫到這里吧,希望能和大家一起學習libsvm,進一步學好svm。


免責聲明!

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



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