1.首先從主頁上下載libsvm、Python2.5.2和gnuplot 三個軟件。
http://www.csie.ntu.edu.tw/~cjlin/
2.準(zhǔn)備好數(shù)據(jù),首先要把數(shù)據(jù)轉(zhuǎn)換成Libsvm軟件包要求的數(shù)據(jù)格式為:
label index1:value1 index2:value2 ...
其中對于分類來說label為類標(biāo)識,指定數(shù)據(jù)的種類;對于回歸來說label為目標(biāo)值。(我主要要用到回歸)
Index是從1開始的自然數(shù),value是每一維的特征值。
該過程可以自己使用excel或者編寫程序來完成,也可以使用網(wǎng)絡(luò)上的FormatDataLibsvm.xls來完成。
FormatDataLibsvm.xls使用說明:
先將數(shù)據(jù)按照下列格式存放(注意label放最后面):
value1 value2 ?? label
value1 value2 ?? label
然后將以上數(shù)據(jù)粘貼到FormatDataLibsvm.xls中的最左上角單元格,接著工具->宏執(zhí)行行FormatDataToLibsvm宏。就可以得到libsvm要求的數(shù)據(jù)格式。將該數(shù)據(jù)存放到文本文件中進(jìn)行下一步的處理。
3.對數(shù)據(jù)進(jìn)行歸一化。
該過程要用到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進(jìn)行縮放) 其中, -l:數(shù)據(jù)下限標(biāo)記;lower:縮放后數(shù)據(jù)下限; -u:數(shù)據(jù)上限標(biāo)記;upper:縮放后數(shù)據(jù)上限; -y:是否對目標(biāo)值同時進(jìn)行縮放;y_lower為下限值,y_upper為上限值;(回歸需要對目標(biāo)進(jìn)行縮放,因此該參數(shù)可以設(shè)定為 –y -1 1 ) -s save_filename:表示將縮放的規(guī)則保存為文件save_filename; -r restore_filename:表示將縮放規(guī)則文件restore_filename載入后按此縮放; filename:待縮放的數(shù)據(jù)文件(要求滿足前面所述的格式)。
縮放規(guī)則文件可以用文本瀏覽器打開,看到其格式為:
y
lower upper min max x
lower upper
index1 min1 max1
index2 min2 max2
其中的lower 與upper 與使用時所設(shè)置的lower 與upper 含義相同;index 表 示特征序號;min 轉(zhuǎn)換前該特征的最小值;max 轉(zhuǎn)換前該特征的最大值。數(shù)據(jù)集的縮放結(jié)果在此情況下通過DOS窗口輸出,當(dāng)然也可以通過DOS的文件重定向符號“>”將結(jié)果另存為指定的文件。該文 件中的參數(shù)可用于最后面對目標(biāo)值的反歸一化。反歸一化的公式為:
(Value-lower)*(max-min)/(upper - lower)+lower
其中value為歸一化后的值,其他參數(shù)與前面介紹的相同。
建議將訓(xùn)練數(shù)據(jù)集與測試數(shù)據(jù)集放在同一個文本文件中一起歸一化,然后再將歸一化結(jié)果分成訓(xùn)練集和測試集。
4.訓(xùn)練數(shù)據(jù),生成模型。
用法: svmtrain [options] training_set_file [model_file]
其中, options(操作參數(shù)):可用的選項即表示的涵義如下所示 -s svm類型:設(shè)置SVM 類型,默認(rèn)值為0,可選類型有(對于回歸只能選3或4):
0 -- C- SVC 1 -- n - SVC 2 -- one-class-SVM 3 -- e - SVR 4 -- n - SVR -t 核函數(shù)類型:設(shè)置核函數(shù)類型,默認(rèn)值為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:核函數(shù)中的degree設(shè)置,默認(rèn)值為3;
-g g :設(shè)置核函數(shù)中的g ,默認(rèn)值為1/ k ; -r coef 0:設(shè)置核函數(shù)中的coef 0,默認(rèn)值為0; -c cost:設(shè)置C- SVC、e - SVR、n - SVR中從懲罰系數(shù)C,默認(rèn)值為1; -n n :設(shè)置n - SVC、one-class-SVM 與n - SVR 中參數(shù)n ,默認(rèn)值0.5; -p e :設(shè)置n - SVR的損失函數(shù)中的e ,默認(rèn)值為0.1; -m cachesize:設(shè)置cache內(nèi)存大小,以MB為單位,默認(rèn)值為40; -e e :設(shè)置終止準(zhǔn)則中的可容忍偏差,默認(rèn)值為0.001; -h shrinking:是否使用啟發(fā)式,可選值為0 或1,默認(rèn)值為1; -b 概率估計:是否計算SVC或SVR的概率估計,可選值0 或1,默認(rèn)0; -wi weight:對各類樣本的懲罰系數(shù)C加權(quán),默認(rèn)值為1; -v n:n折交叉驗證模式。
其中-g選項中的k是指輸入數(shù)據(jù)中的屬性數(shù)。操作參數(shù) -v 隨機(jī)地將數(shù)據(jù)剖分為n 部分并計算交叉檢驗準(zhǔn)確度和均方根誤差。以上這些參數(shù)設(shè)置可以按照SVM 的類型和核函數(shù)所支持的參數(shù)進(jìn)行任意組合,如果設(shè)置的參數(shù)在函數(shù)或SVM 類型中沒有也不會產(chǎn)生影響,程序不會接受該參數(shù);如果應(yīng)有的參數(shù)設(shè)置不正確,參數(shù)將采用默認(rèn)值。training_set_file是要進(jìn)行訓(xùn)練的數(shù)據(jù) 集;model_file是訓(xùn)練結(jié)束后產(chǎn)生的模型文件,該參數(shù)如果不設(shè)置將采用默認(rèn)的文件名,也可以設(shè)置成自己慣用的文件名。
本實驗中的參數(shù)-s取3,-t取2(默認(rèn))還需確定的參數(shù)是-c,-g,-p
另, 實驗中所需調(diào)整的重要參數(shù)是-c 和 –g,-c和-g的調(diào)整除了自己根據(jù)經(jīng)驗試之外,還可以使用gridregression.py對這兩個參數(shù)進(jìn)行優(yōu)化。(需要補(bǔ)充)
該優(yōu)化過程需要用到Python(2.5),Gnuplot(4.2),gridregression.py(該文件需要修改路徑)。
然后在命令行下面運行:
python.exe gridregression.py -log2c -10,10,1 -log2g -10,10,1 -log2p -10,10,1 -s 3 –t 2 -v 5 -svmtrain E:\libsvm\libsvm-2.86\windows\svm-train.exe -gnuplot E:\libsvm\libsvm-2.86\gnuplot\bin\pgnuplot.exe E:\libsvm\libsvm-2.86\windows\train.txt > gridregression_feature.parameter
以上三個路徑根據(jù)實際安裝情況進(jìn)行修改。
-log2c是給出參數(shù)c的范圍和步長 -log2g是給出參數(shù)g的范圍和步長 -log2p是給出參數(shù)p的范圍和步長上面三個參數(shù)可以用默認(rèn)范圍和步長 -s選擇SVM類型,也是只能選3或者4 -t是選擇核函數(shù) -v 10 將訓(xùn)練數(shù)據(jù)分成10份做交叉驗證。默認(rèn)為5
為了方便將gridregression.py是存放在python.exe安裝目錄下
trian.txt為訓(xùn)練數(shù)據(jù),參數(shù)存放在gridregression_feature.parameter中,可以自己命名。
搜索結(jié)束后可以在gridregression_feature.parameter中最后一行看到最優(yōu)參數(shù)。
其中,最后一行的第一個參數(shù)即為-c,第二個為-g,第三個為-p,最后一個參數(shù)為均方誤差。前三個參數(shù)可以直接用于模型的訓(xùn)練。
然后,根據(jù)搜索得到的參數(shù),重新訓(xùn)練,得到模型。
5.測試
用法:svmpredict [options] test_file model_file output_file options(操作參數(shù)): -b probability_estimates:是否需要進(jìn)行概率估計預(yù)測,可選值為0 或者1,默認(rèn)值為0。 model_file 是由svmtrain 產(chǎn)生的模型文件;
test_file 是要進(jìn)行預(yù)測的數(shù)據(jù)文件;
output_file 是svmpredict 的輸出文件,表示預(yù)測的結(jié)果值。
輸出結(jié)果包括均方誤差(Mean squared error)和相關(guān)系數(shù)(Squared correlation coefficient)。
用LIBSVM做回歸和預(yù)測的步驟(請指點)
用LIBSVM做回歸和預(yù)測的步驟(請指點)
首先說明,我學(xué)習(xí)SVM才幾天,對基本理論還不了解,只是想利用這一工具做自己想做的事情。摸索著做了幾個實驗,試著把過程寫下來,請大家指點。
<1> 下載Libsvm、Python和Gnuplot。我用的版本分別是:Libsvm(2.8.1),Python(2.4),Gnuplot(3.7.3)。注意:Gnuplot一定要用3.7.3版,3.7.1版的有bug.
<2> 修改訓(xùn)練和測試數(shù)據(jù)的格式(可以自己用perl編個小程序):
目標(biāo)值 第一維特征編號:第一維特征值 第二維特征編號:第二維特征值 …
…
例如:
2.3 1:5.6 2:3.2
表示訓(xùn)練用的特征有兩維,第一維是5.6,第二維是3.2,目標(biāo)值是2.3
注意:訓(xùn)練和測試數(shù)據(jù)的格式必須相同,都如上所示。測試數(shù)據(jù)中的目標(biāo)值是為了計算誤差用
<3> 分別使用Libsvm中的Windows版本的工具svmscale.exe進(jìn)行訓(xùn)練和測試數(shù)據(jù)的歸一化,svmtrain.exe進(jìn)行模型訓(xùn)練,svmpredict.exe進(jìn)行預(yù)測
(1)svmscale.exe的用法:svmscale.exe feature.txt feature.scaled
默認(rèn)的歸一化范圍是[-1,1],可以用參數(shù)-l和-u分別調(diào)整上界和下屆,feature.txt是輸入特征文件名
輸出的歸一化特征名為feature.scaled
(2)svmtrtrain.exe訓(xùn)練模型
我習(xí)慣寫個批處理小程序,處理起來比較方便。例如svm_train.bat中訓(xùn)練語句為:
svmtrain.exe -s 3 -p 0.0001 -t 2 -g 32 -c 0.53125 -n 0.99 feature.scaled
訓(xùn)練得到的模型為feature.scaled.model
具體的參數(shù)含義可以參考幫助文檔。這里-s是選擇SVM的類型。對于回歸來說,只能選3或者 4,3表示epsilon-support vector regression, 4表示nu-support vector regression。-t是選擇核函數(shù),通常選用RBF核函數(shù),原因在“A Practical Guide support vector classification”中已經(jīng)簡單介紹過了。-p盡量選個比較小的數(shù)字。需要仔細(xì)調(diào)整的重要參數(shù)是-c和-g。除非用 gridregression.py來搜索最優(yōu)參數(shù),否則只能自己慢慢試了。
用gridregression.py搜索最優(yōu)參數(shù)的方法如下:
python.exe gridregression.py -svmtrain H:\SVM\libsvm-2.81\windows\svmtrain.exe -gnuplot C:\gp373w32\pgnuplot.exe -log2c -10,10,1 -log2g -10,10,1 -log2p -10,10,1 -v 10 -s 3 -t 2 H:\SVM\libsvm-2.81\windows\feature.scaled > gridregression_feature.parameter
注意:-svmtrain是給出svmtrain.exe所在路徑,一定要是完整的全路徑
-gnuplot是給出pgnuplot.exe所在路徑。這里要用pgnuplot.exe這種命令行形式的,不要用wgnupl32.exe,這個是圖形界面的。
-log2c是給出參數(shù)c的范圍和步長
-log2g是給出參數(shù)g的范圍和步長
-log2p是給出參數(shù)p的范圍和步長
上面三個參數(shù)可以用默認(rèn)范圍和步長
-s選擇SVM類型,也是只能選3或者4
-t是選擇核函數(shù)
-v 10 將訓(xùn)練數(shù)據(jù)分成10份做交叉驗證。默認(rèn)為5
最后給出歸一化后訓(xùn)練數(shù)據(jù)的全路徑
搜索最優(yōu)參數(shù)的過程寫入文件gridregression_feature.parameter(注意別少了這個>符號?。?
根據(jù)搜索到的最優(yōu)參數(shù)修改feature.scaled.model中的參數(shù)
(3)用svmpredict.exe進(jìn)行預(yù)測
svmpredict.exe feature_test.scaled feature.scaled.model feature_test.predicted
其中feature_test.scaled是歸一化后的測試特征文件名,feature.scaled.model是訓(xùn)練好的模型,SVM預(yù)測的值在feature_test.predicted中
核函數(shù)方法簡介
(1)核函數(shù)發(fā)展歷史
早在1964年Aizermann等在勢函數(shù)方法的研究中就將該技術(shù)引入到機(jī)器學(xué)習(xí)領(lǐng)域,但是直到1992年Vapnik等利用該技術(shù)成功地將線性 SVMs推廣到非線性SVMs時其潛力才得以充分挖掘。而核函數(shù)的理論則更為古老,Mercer定理可以追溯到1909年,再生核希爾伯特空間 (ReproducingKernel Hilbert Space, RKHS)研究是在20世紀(jì)40年代開始的。
(2)核函數(shù)方法原理
根據(jù)模式識別理論,低維空間線性不可分的模式通過非線性映射到高維特征空間則可能實現(xiàn)線性可分,但是如果直接采用這種技術(shù)在高維空間進(jìn)行分類或回歸,則存 在確定非線性映射函數(shù)的形式和參數(shù)、特征空間維數(shù)等問題,而最大的障礙則是在高維特征空間運算時存在的“維數(shù)災(zāi)難”。采用核函數(shù)技術(shù)可以有效地解決這樣問 題。
設(shè)x,z∈X,X屬于R(n)空間,非線性函數(shù)Φ實現(xiàn)輸入間X到特征空間F的映射,其中F屬于R(m),n<<m。根據(jù)核函數(shù)技術(shù)有:
K(x,z) =<Φ(x),Φ(z) > (1)
其中:<, >為內(nèi)積,K(x,z)為核函數(shù)。從式(1)可以看出,核函數(shù)將m維高維空間的內(nèi)積運算轉(zhuǎn)化為n維低維輸入空間的核函數(shù)計算,從而巧妙地解決了在高 維特征空間中計算的“維數(shù)災(zāi)難”等問題,從而為在高維特征空間解決復(fù)雜的分類或回歸問題奠定了理論基礎(chǔ)。
(3)核函數(shù)特點
核函數(shù)方法的廣泛應(yīng)用,與其特點是分不開的:
1)核函數(shù)的引入避免了“維數(shù)災(zāi)難”,大大減小了計算量。而輸入空間的維數(shù)n對核函數(shù)矩陣無影響,因此,核函數(shù)方法可以有效處理高維輸入。
2)無需知道非線性變換函數(shù)Φ的形式和參數(shù).
3)核函數(shù)的形式和參數(shù)的變化會隱式地改變從輸入空間到特征空間的映射,進(jìn)而對特征空間的性質(zhì)產(chǎn)生影響,最終改變各種核函數(shù)方法的性能。
4)核函數(shù)方法可以和不同的算法相結(jié)合,形成多種不同的基于核函數(shù)技術(shù)的方法,且這兩部分的設(shè)計可以單獨進(jìn)行,并可以為不同的應(yīng)用選擇不同的核函數(shù)和算法。
(4)常見核函數(shù)
核函數(shù)的確定并不困難,滿足Mercer定理的函數(shù)都可以作為核函數(shù)。常用的核函數(shù)可分為兩類,即內(nèi)積核函數(shù)和平移不變核函數(shù),如:
1)高斯核函數(shù)K(x,xi) =exp(-||x-xi||2/2σ2;
2)多項式核函數(shù)K(x,xi)=(x·xi+1)^d, d=1,2,…,N;
3)感知器核函數(shù)K(x,xi) =tanh(βxi+b);
4)樣條核函數(shù)K(x,xi) = B2n+1(x-xi)。
(5)核函數(shù)方法實施步驟
核函數(shù)方法是一種模塊化(Modularity)方法,它可分為核函數(shù)設(shè)計和算法設(shè)計兩個部分,具體為:
1)收集和整理樣本,并進(jìn)行標(biāo)準(zhǔn)化;
2)選擇或構(gòu)造核函數(shù);
3)用核函數(shù)將樣本變換成為核函數(shù)矩陣,這一步相當(dāng)于將輸入數(shù)據(jù)通過非線性函數(shù)映射到高維
特征空間;
4)在特征空間對核函數(shù)矩陣實施各種線性算法;
5)得到輸入空間中的非線性模型。
顯然,將樣本數(shù)據(jù)核化成核函數(shù)矩陣是核函數(shù)方法中的關(guān)鍵。注意到核函數(shù)矩陣是l×l的對稱矩陣,其中l(wèi)為樣本數(shù)。
(6)核函數(shù)在模式識別中的應(yīng)用
1)新方法。主要用在基于結(jié)構(gòu)風(fēng)險最小化(Structural Risk Minimization,SRM)的SVM中。
2)傳統(tǒng)方法改造。如核主元分析(kernel PCA)、核主元回歸(kernel PCR)、核部分最小二乘法(kernel PLS)、核Fisher判別分析(Kernel Fisher Discriminator, KFD)、核獨立主元分析(Kernel Independent Component Analysis,KICA)等,這些方法在模式識別等不同領(lǐng)域的應(yīng)用中都表現(xiàn)了很好的性能。
聯(lián)系客服