一、介紹:
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.py和grid.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,可以自己隨意定,比如-10,0,15。當然,如果是迴歸,這是目標值,就要實事求是了。
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)採用交叉驗證選擇懲罰係數C與g的最佳參數;
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.0,g 0.03125,正確率mse爲84%。
還可以得到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/k,k爲特徵(或者說是屬性)數;
-r coef 0:設置核函數中的coef 0,默認值爲0;
-c cost:設置C-SVC、ε-SVR、n - SVR中從懲罰係數C,默認值爲1;
-n v:設置v-SVC、one-class-SVM與n - SVR中參數n ,默認值0.5;
-pε:設置v-SVR的損失函數中的e,默認值爲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折交叉驗證模式;
model_file:可選項,爲要保存的結果文件,稱爲模型文件,以便在預測時使用。
默認情況下,只需要給函數提供一個樣本文件名就可以了,但爲了能保存結果,還是要提供一個結果文件名,比如:test.model,則命令爲:
svm-train heart.txttest.model
利用上步所得到的的參數 c 2.0,g 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