libsvm使用

 轉載:http://blog.csdn.net/ssrs626/article/details/3256631


libsvm使用

LIBSVM 軟件包簡介

LIBSVM 是臺灣大學林智仁 (Chih-Jen Lin) 博士等開發設計的一個操作簡單、易於使用、快速有效的通用 SVM 軟件包,可以解決分類問題(包括 C- SVC 、n - SVC )、迴歸問題(包括 e - SVR 、 n - SVR )以及分佈估計(one-class-SVM )等問題,提供了線性、多項式、徑向基和 S 形函數四種常用的核函數供選擇,可以有效地解決多類問題、交叉驗證選擇參數、對不平衡樣本加權、多類問題的概率估計等。 LIBSVM 是一個開源的軟件包,需要者都可以免費的從作者的個人主頁 http://www.csie.ntu.edu.tw/~cjlin/ 處獲得。他不僅提供了 LIBSVM 的 C++ 語言的算法源代碼,還提供了 Python 、 Java 、 R 、 MATLAB 、 Perl 、 Ruby 、 LabVIEW以及 C#.net 等各種語言的接口,可以方便的在 Windows 或 UNIX 平臺下使用,也便於科研工作者根據自己的需要進行改進(譬如設計使用符合自己特定問題需要的核函數等)。另外還提供了 WINDOWS 平臺下的可視化操作工具 SVM-toy ,並且在進行模型參數選擇時可以繪製出交叉驗證精度的等高線圖。

 SVM進行函數估計是有監督學習,進行概率密度估計是非監督學習

自從版本2.8以後 libsvm採用SMO算法

初步使用

將編譯好的文件4個文件放在windows文件下(從臺灣人網站上下載的文件中有個windows文件將其複製到D:盤),改名windowssvm然後把heart_scale文件拷貝到windowssvm,如下圖


heart_scale文件臺灣人爲我們準備的一些數據,用於測試,以後我們用自己的測試數據

切換到字符目錄下:

 

一二行出現不能打開heart_scale是沒有將文件拷貝到與svm-train.exe所在目錄。

 

其中, #iter 爲迭代次數, nu 與前面的操作參數 -n n (-n n :設置 n - SVC 、 one-class-SVM 與 n - SVR 中參數 n ,默認值 0.5 ;)相同, obj 爲 SVM 文件

轉換爲的二次規劃求解得到的最小值, rho 爲判決函數的常數項 b , nSV 爲支持

向量個數, nBSV 爲邊界上的支持向量個數, Total nSV 爲支持向量總個數。

註釋2:

obj 是對偶SVM問題的最優目標值. rho 是判決函數sgn(w^Tx - rho)的偏項. nSV  nBSV 分別代表支持向量和邊界支持向量 (alpha_i = C)的個數. nu-svm 在某中程度上可以看作 C-SVM的等價形式,不過其中的C被替換爲 nu. nu 僅表明了相應的參數.

 

訓練後的模型保存爲文件 heart_scale.model:

 

可以看到多出了heart_scale.model文件,用寫字板打開

 

用記事本等文本瀏覽器打開

 

可以看到其內容如下(其後“ % ”後內容爲筆者所加註釋):

svm_type c_svc % 訓練所採用的 svm 類型,此處爲 C- SVC

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

gamma 0.0769231 % 與操作參數設置中的 g 含義相同

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

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

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

label 0 1 % 類別標籤

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

SV % 以下爲支持向量

 

test_file 就是我們要 predict 的數據。它的格式跟 svmtrain 的輸入,也就是 training_set_file 是一樣的!不過每行最前面的 label 可以省略 ( 因爲 predict 就是要 predict 那個 label) 。 但如果 test_file 有 label 的值的話, predict 完會順便拿 predict 出來的值跟 test_file 裏面寫的值去做比對,這代表: test_file 寫的 label 是真正的分類結果,拿來跟我們 predict 的結果比對就可以 知道 predict 有沒有猜對了。

 

也所以,我們可以拿原 training set 當做 test_file 再丟給 svmpredict 去 predict ( 因爲格式一樣 ) ,看看正確率有多高, 方便後面調參數。

 

輸入如下內容:

 

 

 

As you can see ,我們把原輸入丟回去 predict , Accuracy 就是預測的正確率了。 如果輸入沒有 label 的話,那就是真的 predict 了。

 

爲什麼正確率是86。6667%主要是相關的參數我們沒有設置(使用的程序默認的參數)。下一步我們爲了追求正確率更高,研究如何設置參數的問題。

 

我們首先刪除D:/windowssvm/目錄下的heart_scale.model,heart_scale.out文件

在輸入如下內容:屏幕顯示(此時文件目錄下生成新的heart_scale.model)

 

 

我們重新在預測一下以前的文件: 

 

 

 

 

我們可以看到正確率提高了。

Cross Validation (交叉驗證選擇參數

一般而言, SVM 使用的方式 ( 在決定參數時 ) 常是這樣:

1. 先有已分好類的一堆資料

2. 隨機數拆成好幾組 training set

3. 用某組參數去 train 並 predict 別組看正確率

4. 正確率不夠的話,換參數再重複 train/predict

說明白點就是自己去測試,等找到一組不錯的參數後,就拿這組參數來建 model 並用來做最後對未知數據的predict 。 這整個過程叫 cross validation , 也就是交叉比對。

 

在我們找參數的過程中,可以利用 svmtrain 的內建 cross validation 功能來幫忙: 
-v n: n-fold cross validation 
n 就是要拆成幾組,像 n=3 就會拆成三組,然後先拿 1 跟 2 來 train model 並 predict 3 以得到正確率; 再來拿 2跟 3 train 並 predict 1 ,最後 1,3 train 並 predict 2 。其它以此類推。

 

如果沒有交叉比對的話,很容易找到只在特定輸入時好的參數。像前面我們 c=10 得到 92.2% ,不過拿 -v 5 來看看:

 

 

Cross Validation Accuracy = 76.6667%  ,比一開始的 86 還差。

 

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

 

cost 默認值是 1, gamma 默認值是 1/k , k 等於輸入 數據筆數。 那我們怎麼知道要用多少來當參數呢?

就是 Try 參數找比較好的值。(後面我將會介紹使用工具得到參數)

Try 參數的過程常用 exponential 指數成長的方式來增加與減少參數的數值,也就是 2^n (2  n 次方 ) 

 

因爲有兩組參數,所以等於要 try n*n=n^2 次。 這個過程是不連續的成長,所以可以想成我們在一個 X-Y 平面上指定的範圍內找一羣格子點 ( grid  如果你不太明白,想成方格紙或我們把平面上所有 整數交點都打個點,就是那樣 ) ,每個格子點的 X  Y 經過換算 (  2^x, 2^y) 就拿去當 cost  gamma 的值來 cross validation 

所以現在你應該懂得 libsvm 的 python 子目錄下面 有個 grid.py 是做啥的了: 它把上面的過程自動化, 在你給定的範圍內呼叫 svm-train 去 try 所有的參數值。 python 是一種語言,在這裏我不做介紹,因爲我會了 :P (just a joke,真正原因是 -- 這是 libsvm 的 tutorial) 。 grid.py 還會把結果 plot 出來,方便你尋找參數。 libsvm 有很多跟python 結合的部份,由此可見 python 是強大方便的工具。很多神奇的功能,像自動登入多臺 機器去平行跑 grid等等都是 python 幫忙的。不過 SVM 本身可以完全不需要 python ,只是會比較方便。

 

交叉驗證,尋找合適的參數(guide.pdf文件的翻譯)

此段內容要補充。。。。。。。。。。

主要是確定兩個參數 C 和r,使用默認的參數並不能保證準確率,因此我門要使用模型來求出好的參數,保證訓練準確率

 

在v重交叉驗證,我們首先將訓練集分爲v個子集,用v-1個子集測試剩下來的一個子集

全部訓練集的每個子集都會被預測,交叉驗證的準確率就是正確分類的百分率。

 

交叉驗證能阻止溢出問題,我們使用圖一來說明這個問題,實心的圓和實心的三角形是訓練數據。空心的代表測試數據,測試的正確率在1(a),1(b)中不是很好。另一方面在1(c),1(d)

沒有溢出訓練數據我們得到更好的測試準確率。

 

我們推薦“grid-search”on C和r,

 

這種方法很直接看起來很愚蠢,事實上他能節省計算代價通過

Grid-search有兩個目的:

我們感覺不是很安全去使用近似法和啓發式的方法去窮盡所有的參數。

發現好的參數的計算時間不比先進的算法少。

 

原始的使用方法:

 

 

 

 

 

 

 

 

 

 

 

easy.py,subset.py,grid.py,checkdata.py使用

libsvm的一些工具還是非常有用的

1.可以調用subset.py將你的樣本集合按你所想要的比例進行抽樣出兩個子樣本集合

2.還可以調用grid.py做關於(C,gamma)的交叉驗證參數選擇,可以輕鬆的搜索到最好的參數對(C,gamma).

3.還可以調用easy.ph一步到位完成svm的整個挖掘過程,最後得出交叉驗證精度,最有參數對和測試集上的測試精度.

4.還可以調用checkdata進行檢查你的數據格式是否有錯誤.

easy.ph的使用

結果如下:

 

安裝python工具編譯環境,因爲在前一段時間安裝了ARCGIS自帶了一個python24版本默認安裝在D:/Python24目錄下,設置路徑在系統變量Path後加路徑即可。

如果成功的話可以在控制檯輸入python 回車驗證

 

另一個工具就是gnuplot.exe,下載不是安裝文件:

安裝完上面的軟件還不能運行,還要修改easy.py,grid.py的設置.將他們對應的代碼" gnuplot_exe = r"c:/tmp/gnuplot/bin/pgnuplot.exe""都改爲你的pgnuplot.exe所在的路徑,
比如我的文件在當前目錄的上一級目錄,就是和tools文件夾在同一級目錄,那麼我的設置應該爲" gnuplot_exe = r"../gnuplot/bin/pgnuplot.exe"".

本人使用的上邊一種方法,事實上也符合下面的方式,爲了保險起見。

這樣設置就完成了,我們只需要到控制檯下運行上面相應的四個程序即可.
注意:下面的python命令中,我們默認所有需要處理的樣本數據集都是放在在tools目錄下,如果數據文件不在tools目錄下則我們需要用絕對路徑指定數據的位置.

如下目錄結構:

 

 

Tools 和windows是直接從下載的libsvm2.88文件複製過來,只是在tools 中加入了guide.pdf的幾個數據集,gnuplot直接下載後將gnuplot拷貝過來

 

只要簡單輸入,就可以完成svm挖掘的所有步驟,即:
1. Conduct simple scaling on the data
2.Consider the RBF kernel K(x; y)
3.Use cross-validation to nd the best parameter C and
4.Use the best parameter C and to train the whole training set
5.Test
對於初學者而言這個文件無非是他們的救命稻草,可以簡單看看他的語法:
在控制檯下走到easy.py所在的目錄下:

 

(大體數據如下)

Scaling training data...歸一化數據
Cross validation...在訓練集上做交叉驗證
Best c=128.0, g=0.125 CV rate=88.9186 (通過網格搜索法對每個參數對做交叉驗證,選擇交叉驗證精度最高所對應的參數.)
Training...( 將上面得到的參數對在訓練集合上做模型訓練)
Output model: crttrain.model (保存模型到文件)
Scaling testing data... (歸一化數據)
Testing...(用訓練得出的模型對測試集進行測試)
Accuracy = 87.8049% (36/41) (classification)(測試的精度)
Output prediction: crttest.predict (輸出預測結果)

(在交叉驗證過程中,會有一個圖形界面顯示參數選擇的情況,這就是gnuplot.exe的作用了)

 

 

grid.py:用於做交叉驗證,選擇最好的參數對

在控制檯下走到grid.py所在的目錄下:

 

 

。。。。。。。。。。。

 

 

(c=32768.0,gamma=3.0517578125e-005 96.9893 交叉驗證精度96.9893)

 

 

subset.py按個數分割樣本集成訓練集和測試集.

在控制檯下走到subset.py所在的目錄下:


$python subset.py train.1 100 train.2 test.2 
參數說明:
crt:樣本集合;
100:訓練集樣本個數;
crttrain:存儲100個訓練樣本;
crttest:存儲剩下的樣本集做爲測試集;

 

 

 

 

 

 

 

checkdata.py檢測樣本集存儲格式是否正確
在控制檯下走到subset.py所在的目錄下:
$python checkdata.py crt
No error. (表示沒有錯)

不知什麼緣故 我測試總是顯示無用的組合。

詳細的使用請參考tools下的README文件.

Grid-search 任就是花費很多時間的,我們推薦使用a coarse(粗糙) grid

圖形接口初步使用SVM-TOY.EXE:

(這個就是一個簡單的演示,沒有什麼用的。)

在SVM-TOY上點擊出現小點,在點擊“run”,後面選擇參數

 

最後單擊“save”,用記事本打開查看

 

 

 

關於libsvm的數據格式:
a. FormatSplitBat.m是一個批量將以Tab或者空格分隔的數據轉換爲libsvm格式,並且分成佔全部數據比例爲p的訓練集和1-p的測試集,然後調用easy.py的例子。
b. 手工轉換數據格式,可以通過excel文件FormatDataLibsvm.xls打開包含數據的文本文件,然後用宏將數據轉換爲libsvm格式。也可以用宏將libsvm格式的數據轉換回來。

發佈了18 篇原創文章 · 獲贊 39 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章