libsvm的使用方法(python)

本文講使用臺灣大學林智仁(Lin Chih-Jen)教授等開發設計開發設計的一個簡單、易用的SVM模式識別與回歸的軟件包,本文將使用svmlib在python下的版本對其使用方法進行總結:

libsvm下載地址:http://www.csie.ntu.edu.tw/~cjlin/libsvm/

通過上一篇博文轉載了python下載libsvm的教程,在python32位環境下使用libsvm

libsvm在python版本提供了兩個模塊,svmutil.py為高層次版本,svm.py為低層次版本

在低層次版本svm.py中,沒有對python內置庫ctypes類型進行封裝,而svmutil.py則提供了簡單易用的函數可以直接使用

libsvm使用的步驟為:

1)將數據轉化為libsvm工具使用的格式,

<label1> <index1>:<value1> <index2>:<value2> ? ? ..... ?<index L>:<valueL>

<label2> ......................

label可以為int或double類型

2)進行數據變化,常用的數據變化為歸一化,同時將training data 和 test data通過放縮在[-1,1]區間

【待定】

3)選擇核函數:優先考慮使用RBF核函數

4)用cross-validation(交叉驗證)和grid-search得到最優的c和g

方法一:cross-validation(交叉驗證):

m = svm_train(y, x, '-v 2')

如果option參數-v為確切值,則svm_train返回model為一個數值,如果是svm分類則返回交叉驗證的準確率,-v 的值要大于等于2,一般選用5.若為svm回歸則返回結果與真實值的差異值平均方差

方法二:grid-search:

libsvm提供了幾個小工具包,其中包括了tools中的grid.py,能夠快速選擇最優參數c和g

$ python grid.py svmguide1.scale

2.0 2.0 96.8922

(Best C=2.0, γ=2.0 with ?ve-fold cross-validation rate=96.8922%)

5)使用最優參數C和g去訓練training set

6)測試:

在svmutil.py,可使用函數svm_predict獲得分類準確率

p_label, p_acc, p_val = svm_predict(y, , m)

#p_labels: a list of predicted labels,預測類別

#p_acc: a tuple including accuracy (for classification), mean squared error, and squared correlation coefficient (forregression),準確率,誤差的均方差,和相關系數平方

#p_val:a list of decision values or probability estimates


下面介紹一下livsvm在python中的具體使用方法:

主要介紹svmutil.py函數使用

>>>from svmutil import *

#讀取LIBSVM數據,分別存入y,x列表,其中y為類別,x為訓練樣本

>>>y, x = svm_read_problem(r'E:\Projects\Python\svmlib\heart_scale')

#使用前200個數據進行訓練,svm_train返回的是model類,表示通過訓練產生的model

>>>m =? svm_train(y[:200], x[:200], '-c 4' )

#使用后70個數據對訓練的model m進行檢驗

>>>p_label, p_acc, p_val = svm_predict(y[200:], x[200:], m)

#能夠將訓練產生的model保留成為文件

>>> svm_save_model('heart_scale.model', m)

#讀取保存的model

>>> m = svm_load_model('heart_scale.model')

>>> p_label, p_acc, p_val = svm_predict(y, x, m, '-b 1')

#得到訓練檢驗結果

>>> ACC, MSE, SCC = evaluations(y, p_label)

svmtuil.py中含有下列主要函數

svm_train()? ? ? ? : 訓練SVM模型

svm_predict()? ? ? : 預測測試數據結果

svm_read_problem() : 讀取數據.

svm_load_model()? : 加載SVM模型

svm_save_model()? :保存SVM模型.

evaluations()? ? ? : 檢驗預測結果.

?還有下列函數

svm_problem(y, x):返回一個problem類,作用等同于記錄y,x列表

svm_parameter('training_options'):返回一個parameter類,作用是記錄參數選擇

下面介紹下使用過程中涉及到的一些參數函數:

Options:可用的選項即表示的涵義如下

-s ? svm類型:SVM設置類型(默認0)

0 -- C-SVC

1 -- v-SVC

2–一類SVM

3 -- e -SVR

4 -- v-SVR

-t ? 核函數類型:核函數設置類型(默認2)

0–線性:u'v

1–多項式:(r*u'v + coef0)^degree

2–RBF函數:exp(-gamma|u-v|^2)

3–sigmoid:tanh(r*u'v + coef0)

-d ?degree:核函數中的degree設置(針對多項式核函數)(默認3)

-g ?r(gama):核函數中的gamma函數設置(針對多項式/rbf/sigmoid核函數)(默認1/ k)

-r ? coef0:核函數中的coef0設置(針對多項式/sigmoid核函數)((默認0)

-c cost:設置C-SVC,e -SVR和v-SVR的參數(損失函數)(默認1)

-n nu:設置v-SVC,一類SVM和v- SVR的參數(默認0.5)

-p p:設置e -SVR中損失函數p的值(默認0.1)

-m cachesize:設置cache內存大小,以MB為單位(默認40)

-e eps:設置允許的終止判據(默認0.001)

-h shrinking:是否使用啟發式,0或1(默認1)

-wi weight:設置第幾類的參數C為weight*C(C-SVC中的C)(默認1)

-v n: n-fold交互檢驗模式,n為fold的個數,必須大于等于2

其中-g選項中的k是指輸入數據中的屬性數。option -v隨機地將數據剖分為n部

1)如果你要輸出類的概率,一定要有-b參數

2)C一般可以選擇為:10^t , t=- 4..4就是0.0001到10000

選擇的越大,表示對錯誤例懲罰程度越大,可能會導致模型過擬合

在LIBSVM中-t用來指定核函數類型(默認值是2)。

3)與核函數相對應的libsvm參數:

(1)對于線性核函數,沒有專門需要設置的參數

(2))對于多項式核函數,有三個參數。-d用來設置多項式核函數的最高此項次數,也就是公式中的d,默認值是3。-g用來設置核函數中的gamma參數設置,也就是公式中的第一個r(gamma),默認值是1/k(k是類別數)。-r用來設置核函數中的coef0,也就是公式中的第二個r,默認值是0。

(3)對于RBF核函數,有一個參數。-g用來設置核函數中的gamma參數設置,也就是公式中的第一個r(gamma),默認值是1/k(k是類別數)。

(4)對于sigmoid核函數,有兩個參數。-g用來設置核函數中的gamma參數設置,也就是公式中的第一個r(gamma),默認值是1/k(k是類別數)。-r用來設置核函數中的coef0,也就是公式中的第二個r,默認值是0。

運行結果中顯示的幾個參數含義為:

rho 為判決函數的常數項b#iter為迭代次數,nu 與前面的操作參數-n n 相同,obj為SVM文件轉換為的二次規劃求解得到的最小值,nSV 為支持向量個數,nBSV為邊界上的支持向量個數,Total nSV為支持向量總個數。


下面介紹下LIBSVM提供的幾個工具包

svm-scale:

這是能夠放縮輸入數據的工具

grid.py:

放縮后的數據進行最優參數選擇

subset.py

自動選擇子集減少訓練量

checkdata.py

檢查是否符合LIBSVM格式

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容