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> 下載Libsvm、Python和Gnuplot。我用的版本分別是: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中,用於最后測試。
(2)svm-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