本文講使用臺灣大學林智仁(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格式