libsvm中參數(shù)c與g的調(diào)整 | 您所在的位置:網(wǎng)站首頁 › 算卦的步驟順序 › libsvm中參數(shù)c與g的調(diào)整 |
Libsvm使用心得 首先下載Libsvm、Python和Gnuplot: l?????????libsvm的主頁http://www.csie.ntu.edu.tw/~cjlin/libsvm/上下載libsvm (我自己用2.86版本) l?????????python的主頁http://www.python.org下載?python (我自己用2.5版本) l?????????gnuplot的主頁http://www.gnuplot.info/下載gnuplot? (我用4.0版本) LIBSVM?使用的一般步驟是: 1)按照LIBSVM軟件包所要求的格式準(zhǔn)備數(shù)據(jù)集;???????????????????????????????????? 2)對數(shù)據(jù)進(jìn)行簡單的縮放作;??????????????????????????????????? 3)首要考慮選用RBF?核函數(shù); 4)采用交叉驗(yàn)證選擇最佳參數(shù)C與g?; 5)采用最佳參數(shù)C與g?對整個(gè)訓(xùn)練集進(jìn)行訓(xùn)練獲取支持向量機(jī)模型; 6)利用獲取的模型進(jìn)行測試與預(yù)測。 1)LIBSVM使用的數(shù)據(jù)格式 ????該軟件使用的訓(xùn)練數(shù)據(jù)和檢驗(yàn)數(shù)據(jù)文件格式如下: [label] [index1]:[value1] [index2]:[value2] ... [label] [index1]:[value1] [index2]:[value2] ... 一行一條記錄數(shù)據(jù),如: +1?1:0.708?2:1?3:1?4:-0.320?5:-0.105?6:-1 這里(x,y)à((0.708,1,1, -0.320, -0.105, -1), +1) label?或說是class,?就是你要分類的種類,通常是一些整數(shù)。 index?是有順序的索引,通常是連續(xù)的整數(shù)。 value?就是用來?train?的數(shù)據(jù),通常是一堆實(shí)數(shù)。 ? 2)對數(shù)據(jù)進(jìn)行簡單的縮放作 ????掃描數(shù)據(jù).?因?yàn)樵紨?shù)據(jù)可能范圍過大或過小, svmscale可以先將數(shù)據(jù)重新scale (縮放)?到適當(dāng)范圍使訓(xùn)練與預(yù)測速度更快。 ????svmscale.exe的用法:svmscale.exe feature.txt feature.scaled 默認(rèn)的歸一化范圍是[-1,1],可以用參數(shù)-l和-u分別調(diào)整上界和下屆,feature.txt是輸入特征文件名?輸出的歸一化特征名為feature.scaled ? 3)?考慮選用RBF?核函數(shù) 訓(xùn)練數(shù)據(jù)形成模型(model),實(shí)質(zhì)是算出了wx+b=0中的w,b. ?Svmtrain的用法:svmtrain [options] training_set_file [model_file] ? 其中options涵義如下: -s svm類型:設(shè)置SVM?類型,默認(rèn)值為0,可選類型有: 0 -- C- SVC 1 -- nu - SVC 2 -- one-class-SVM 3 -- e - SVR 4 -- nu-SVR -t?核函數(shù)類型:設(shè)置核函數(shù)類型,默認(rèn)值為2,可選類型有: 0 --?線性核:u'*v 1 --?多項(xiàng)式核:(g*u'*v+ coef0)degree 2 -- RBF?核:exp(-||u-v||*||u-v||/g*g) 3 -- sigmoid?核:tanh(g*u'*v+ coef 0) -d degree:核函數(shù)中的degree設(shè)置,默認(rèn)值為3; -g r(gama):核函數(shù)中的函數(shù)設(shè)置(默認(rèn)1/ k); -r coef 0:設(shè)置核函數(shù)中的coef0,默認(rèn)值為0; -c cost:設(shè)置C- SVC、e - SVR、n - SVR中從懲罰系數(shù)C,默認(rèn)值為1; -n nu?:設(shè)置nu - SVC、one-class-SVM?與nu - SVR?中參數(shù)nu?,默認(rèn)值0.5; -p e?:核寬,設(shè)置e - 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?概率估計(jì):是否計(jì)算SVC或SVR的概率估計(jì),可選值0?或1,默認(rèn)0; -wi weight:對各類樣本的懲罰系數(shù)C加權(quán),默認(rèn)值為1; -v n:n折交叉驗(yàn)證模式。 ? 其中-g選項(xiàng)中的k是指輸入數(shù)據(jù)中的屬性數(shù)。作參數(shù)?-v?隨機(jī)地將數(shù)據(jù)剖分為n?部分并計(jì)算交叉檢驗(yà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è)置成自己慣用的文件名。舉個(gè)例子如下: C:/libsvm-2.85/windows>svmtrain heart_scale * optimization finished, #iter = 162 nu = 0.431029 obj = -100.877288, rho = 0.424462 nSV = 132, nBSV = 107 Total nSV = 132 現(xiàn)簡單對屏幕回顯信息進(jìn)行說明: #iter為迭代次數(shù), nu?與前面的作參數(shù)-n nu?相同, obj為SVM文件轉(zhuǎn)換為的二次規(guī)劃求解得到的最小值, rho?為判決函數(shù)的常數(shù)項(xiàng)b, nSV?為支持向量個(gè)數(shù), nBSV為邊界上的支持向量個(gè)數(shù), Total nSV為支持向量總個(gè)數(shù)。 訓(xùn)練后的模型保存為文件*.model,用記事本打開其內(nèi)容如下: svm_type c_svc?%?訓(xùn)練所采用的svm類型,此處為C- SVC kernel_type rbf?%訓(xùn)練采用的核函數(shù)類型,此處為RBF核 gamma 0.0769231?%設(shè)置核函數(shù)中的g?,默認(rèn)值為1/ k nr_class 2?%分類時(shí)的類別數(shù),此處為兩分類問題 total_sv 132?%總共的支持向量個(gè)數(shù) rho 0.424462?%決策函數(shù)中的常數(shù)項(xiàng)b label 1 -1%類別標(biāo)簽 nr_sv 64 68?%各類別標(biāo)簽對應(yīng)的支持向量個(gè)數(shù) 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)采用交叉驗(yàn)證選擇最佳參數(shù)C與g ????通常而言,比較重要的參數(shù)是?gamma (-g)?跟?cost (-c)?。而?cross validation (-v) 的參數(shù)常用5。那么如何去選取最優(yōu)的參數(shù)c和g呢?libsvm?的?python?子目錄下面的?grid.py?可以幫助我們。?此時(shí)。其中安裝python2.5需要(一般默認(rèn)安裝到c:/python25 下),將gnuplot解壓。安裝解壓完畢后,進(jìn)入/libsvm/tools目錄下,用文本編輯器(記事 本,edit都可以)修改grid.py文件,找到其中關(guān)于gnuplot路徑的那項(xiàng)(其默認(rèn)路徑為 gnuplot_exe=r"c:/tmp/gnuplot/bin/pgnuplot.exe"),根據(jù)實(shí)際路徑進(jìn)行修改,并保存。然 后,將grid.py和C:/Python25目錄下的python.exe文件拷貝到libsvm/windows目錄下,鍵入以下命令:$ python grid.py train.1.scale?執(zhí)行后,即可得到最優(yōu)參數(shù)c和g。 ????另外,至于下libsvm和python的接口的問題,在libsvm2.86中林老師已經(jīng)幫助我們解決,在/libsvm/windows/python目錄下自帶了svmc.pyd這個(gè)文件,將該文件文件復(fù)制到 libsvm/python目錄下,同時(shí),也將python.exe文件復(fù)制到該目錄下,鍵入以下命令以檢驗(yàn)效 果(注意:.Py文件中關(guān)于gnuplot路徑的那項(xiàng)路徑一定要根據(jù)實(shí)際路徑修改): python svm_test.py ????如果能看到程序執(zhí)行結(jié)果,說明libsvm和python之間的接口已經(jīng)配置完成,以后就可以直接在python程序里調(diào)用libsvm的函數(shù)了! 5)?采用最佳參數(shù)C與g?對整個(gè)訓(xùn)練集進(jìn)行訓(xùn)練獲取支持向量機(jī)模型 ???$ svmtrain –c x –g x –v x training_set_file [model_file] ???x為上述得到的最優(yōu)參數(shù)c和g的值,v的值一般取5。 6)利用獲取的模型進(jìn)行測試與預(yù)測 使用Svmtrain訓(xùn)練好的模型進(jìn)行測試。輸入新的X值,給出SVM預(yù)測出的Y值 ?$ Svmpredict??test_file??model_file??output_file 如:./svm-predict?heart_scale?heart_scale.model?heart_scale.out Accuracy = 86.6667% (234/270) (classification) 這里顯示的是結(jié)果 一個(gè)具體使用的例子。 ????以libsvm中的heart_scale作為訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù),同時(shí)已經(jīng)將python安裝至c盤,并將grid.py文件中關(guān)于gnuplot路徑的默認(rèn)值修改為實(shí)際解壓縮后的路徑,將 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 此時(shí),已經(jīng)得到heart_scale.model,進(jìn)行預(yù)測: ./svm-predict heart_scale??heart_scale.model??heart_scale.out Accuracy = 86.6667% (234/270) (classification) 正確率為Accuracy = 86.6667%。 ./python grid.py heart_scale 得到最優(yōu)參數(shù)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%.這塊還有點(diǎn)迷惑?為什么正確率降低了? 當(dāng)然也可以結(jié)合subset.py 和 easy.py 實(shí)現(xiàn)自動化過程。 如果要訓(xùn)練多次,可以寫個(gè)批處理程序省好多事。 這里舉個(gè)例子: ::@ 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 這段批處理代碼首先調(diào)用subset.py對文件b59.txt執(zhí)行1000次分層隨機(jī)抽樣(對數(shù)據(jù)進(jìn)行80-20%分割)然后調(diào)用easy.py 進(jìn)行1000次參數(shù)尋優(yōu),把記錄結(jié)果寫到result89.txt中 (包括1000次訓(xùn)練的分類準(zhǔn)確率和參數(shù)對)。 還可以調(diào)用fselect.py進(jìn)行特征選擇,調(diào)用plotroc.py進(jìn)行roc曲線繪制。 先寫到這里吧,希望能和大家一起學(xué)習(xí)libsvm,進(jìn)一步學(xué)好svm。 |
今日新聞 |
推薦新聞 |
專題文章 |
CopyRight 2018-2019 實(shí)驗(yàn)室設(shè)備網(wǎng) 版權(quán)所有 |