libsvm的使用方法(python)

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

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

通過上一篇博文轉(zhuǎn)載了python下載libsvm的教程,在python32位環(huán)境下使用libsvm

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

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

libsvm使用的步驟為:

1)將數(shù)據(jù)轉(zhuǎn)化為libsvm工具使用的格式,

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

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

label可以為int或double類型

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

【待定】

3)選擇核函數(shù):優(yōu)先考慮使用RBF核函數(shù)

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

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

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

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

方法二:grid-search:

libsvm提供了幾個小工具包,其中包括了tools中的grid.py,能夠快速選擇最優(yōu)參數(shù)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)使用最優(yōu)參數(shù)C和g去訓練training set

6)測試:

在svmutil.py,可使用函數(shù)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),準確率,誤差的均方差,和相關(guān)系數(shù)平方

#p_val:a list of decision values or probability estimates


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

主要介紹svmutil.py函數(shù)使用

>>>from svmutil import *

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

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

#使用前200個數(shù)據(jù)進行訓練,svm_train返回的是model類,表示通過訓練產(chǎn)生的model

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

#使用后70個數(shù)據(jù)對訓練的model m進行檢驗

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

#能夠?qū)⒂柧毊a(chǎn)生的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')

#得到訓練檢驗結(jié)果

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

svmtuil.py中含有下列主要函數(shù)

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

svm_predict()? ? ? : 預測測試數(shù)據(jù)結(jié)果

svm_read_problem() : 讀取數(shù)據(jù).

svm_load_model()? : 加載SVM模型

svm_save_model()? :保存SVM模型.

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

?還有下列函數(shù)

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

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

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

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

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

0 -- C-SVC

1 -- v-SVC

2–一類SVM

3 -- e -SVR

4 -- v-SVR

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

0–線性:u'v

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

運行結(jié)果中顯示的幾個參數(shù)含義為:

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


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

svm-scale:

這是能夠放縮輸入數(shù)據(jù)的工具

grid.py:

放縮后的數(shù)據(jù)進行最優(yōu)參數(shù)選擇

subset.py

自動選擇子集減少訓練量

checkdata.py

檢查是否符合LIBSVM格式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容