LibSVM for Python 使用
經(jīng)歷手寫SVM的慘烈教訓(xùn)(還是太年輕)之后,我決定使用工具箱/第三方庫
Python
libsvm的GitHub倉庫
LibSVM是開源的SVM實(shí)現(xiàn),支持C, C++, Java,Python , R 和 Matlab 等, 這里選擇使用Python版本。
安裝LibSVM
將LibSVM倉庫的所有內(nèi)容放入Python的包目錄\Lib\site-packages或者工程目錄中。
在libsvm根目錄和python子目錄下中分別新建名為__init__.py的空文件,這兩個(gè)空文件將標(biāo)識所在的目錄為python包可以直接導(dǎo)入。
允許草民吐槽一下各種Blog里切換根目錄的奇怪的解決方案:這個(gè)和這個(gè)
因?yàn)榻?jīng)常使用svm,所以草民將libsvm包放入\Lib\site-packages目錄下。在Python交互環(huán)境或在任意腳本中都可以使用import libsvm.python來使用libsvm的python接口。
使用LibSVM
LibSVM的使用非常簡單,只需調(diào)用有限的接口
示例1:
from libsvm.python.svmutil import * from libsvm.python.svm import *y, x = [1,-1], [{1:1, 2:1}, {1:-1,2:-1}] prob = svm_problem(y, x) param = svm_parameter('-t 0 -c 4 -b 1') model = svm_train(prob, param) yt = [1] xt = [{1:1, 2:1}] p_label, p_acc, p_val = svm_predict(yt, xt, model) print(p_label)輸出結(jié)果:
optimization finished, #iter = 1 nu = 0.062500 obj = -0.250000, rho = 0.000000 nSV = 2, nBSV = 0 Total nSV = 2 test: Model supports probability estimates, but disabled in predicton. Accuracy = 100% (1/1) (classification) [1.0]在SVM數(shù)據(jù)中下載train1.txt和test1.txt。
LibSVM可以在文件中讀取訓(xùn)練數(shù)據(jù),這樣便于大規(guī)模數(shù)據(jù)的使用。
示例:
from libsvm.python.svmutil import * from libsvm.python.svm import *y, x = svm_read_problem('train1.txt') yt, xt = svm_read_problem('test1.txt') model = svm_train(y, x ) print('test:') p_label, p_acc, p_val = svm_predict(yt[200:202], xt[200:202], model) print(p_label)可以看到輸出:
optimization finished, #iter = 5371 nu = 0.606150 obj = -1061.528918, rho = -0.495266 nSV = 3053, nBSV = 722 Total nSV = 3053 test: Accuracy = 40.809% (907/2225) (classification)LibSVM接口
訓(xùn)練數(shù)據(jù)格式
libsvm的訓(xùn)練數(shù)據(jù)格式如下:
<label> <index1>:<value1> <index2>:<value2> ...示例:
1 1:2.927699e+01 2:1.072510e+02 3:1.149632e-01 4:1.077885e+02主要類型
- svm_problem
保存定義SVM模型的訓(xùn)練數(shù)據(jù)
- svm_parameter
存儲訓(xùn)練SVM模型所需的各種參數(shù)
- svm_model
完成訓(xùn)練的SVM模型
- svm_node
模型中一個(gè)特征的值,只包含一個(gè)整數(shù)索引和一個(gè)浮點(diǎn)值屬性。
主要接口:
-svm_problem(y, x)
由訓(xùn)練數(shù)據(jù)y,x創(chuàng)建svm_problem對象
- svm_train()
svm_train有3個(gè)重載:
model = svm_train(y, x [, 'training_options']) model = svm_train(prob [, 'training_options']) model = svm_train(prob, param)用于訓(xùn)練svm_model模型
- `svm_parameter(cmd)
創(chuàng)建svm_parameter對象,參數(shù)為字符串。
示例:
param = svm_parameter('-t 0 -c 4 -b 1')- svm_predict()
調(diào)用語法:
p_labs, p_acc, p_vals = svm_predict(y, x, model [,'predicting_options'])參數(shù):
y 測試數(shù)據(jù)的標(biāo)簽
x 測試數(shù)據(jù)的輸入向量
model為訓(xùn)練好的SVM模型。
返回值:
p_labs是存儲預(yù)測標(biāo)簽的列表。
p_acc存儲了預(yù)測的精確度,均值和回歸的平方相關(guān)系數(shù)。
p_vals在指定參數(shù)'-b 1'時(shí)將返回判定系數(shù)(判定的可靠程度)。
這個(gè)函數(shù)不僅是測試用的接口,也是應(yīng)用狀態(tài)下進(jìn)行分類的接口。比較奇葩的是需要輸入測試標(biāo)簽y才能進(jìn)行預(yù)測,因?yàn)閥不影響預(yù)測結(jié)果可以用0向量代替。
- svm_read_problem
讀取LibSVM格式的訓(xùn)練數(shù)據(jù):
y, x = svm_read_problem('data.txt')- svm_save_model
將訓(xùn)練好的svm_model存儲到文件中:
svm_save_model('model_file', model)model_file的內(nèi)容:
svm_type c_svc kernel_type linear nr_class 2 total_sv 2 rho 0 label 1 -1 probA 0.693147 probB 2.3919e-16 nr_sv 1 1 SV 0.25 1:1 2:1 -0.25 1:-1 2:-1- svm_load_model
讀取存儲在文件中的svm_model:
model = svm_load_model('model_file')調(diào)整SVM參數(shù)
LibSVM在訓(xùn)練和預(yù)測過程中需要一系列參數(shù)來調(diào)整控制。
svm_train的參數(shù):
-s SVM的類型(svm_type)
0 -- C-SVC(默認(rèn))
使用懲罰因子(Cost)的處理噪聲的多分類器
1 -- nu-SVC(多分類器)
按照錯(cuò)誤樣本比例處理噪聲的多分類器
2 -- one-class SVM
一類支持向量機(jī),可參見"SVDD"的相關(guān)內(nèi)容
3 -- epsilon-SVR(回歸)
epsilon支持向量回歸
4 -- nu-SVR(回歸)
-t 核函數(shù)類型(kernel_type)
0 -- linear(線性核):
u'*v
1 -- polynomial(多項(xiàng)式核):
(gamma*u'*v + coef0)^degree
2 -- radial basis function(RBF,徑向基核/高斯核):
exp(-gamma*|u-v|^2)
3 -- sigmoid(S型核):
tanh(gamma*u'*v + coef0)
4 -- precomputed kernel(預(yù)計(jì)算核):
核矩陣存儲在training_set_file中
下面是調(diào)整SVM或核函數(shù)中參數(shù)的選項(xiàng):
-d 調(diào)整核函數(shù)的degree參數(shù),默認(rèn)為3
-g 調(diào)整核函數(shù)的gamma參數(shù),默認(rèn)為1/num_features
-r 調(diào)整核函數(shù)的coef0參數(shù),默認(rèn)為0
-c 調(diào)整C-SVC, epsilon-SVR 和 nu-SVR中的Cost參數(shù),默認(rèn)為1
-n 調(diào)整nu-SVC, one-class SVM 和 nu-SVR中的錯(cuò)誤率nu參數(shù),默認(rèn)為0.5
-p 調(diào)整epsilon-SVR的loss function中的epsilon參數(shù),默認(rèn)0.1
-m 調(diào)整內(nèi)緩沖區(qū)大小,以MB為單位,默認(rèn)100
-e 調(diào)整終止判據(jù),默認(rèn)0.001
-wi調(diào)整C-SVC中第i個(gè)特征的Cost參數(shù)
調(diào)整算法功能的選項(xiàng):
-b 是否估算正確概率,取值0 - 1,默認(rèn)為0
-h 是否使用收縮啟發(fā)式算法(shrinking heuristics),取值0 - 1,默認(rèn)為0
-v 交叉校驗(yàn)
-q 靜默模式
Matlab
LibSVM的Matlab接口用法類似,Matlab豐富的標(biāo)準(zhǔn)工具箱提供了各種方便。
Statistic Tools工具箱提供了svmtrain和svmclassify函數(shù)進(jìn)行SVM分類。
traindata = [0 1; -1 0; 2 2; 3 3; -2 -1;-4.5 -4; 2 -1; -1 -3]; group = [1 1 -1 -1 1 1 -1 -1]'; testdata = [5 2;3 1;-4 -3]; svm_struct = svmtrain(traindata,group); Group = svmclassify(svm_struct,testdata);svmtrain接受traindata和group兩個(gè)參數(shù),traindata以一行表示一個(gè)樣本,group是與traindata中樣本對應(yīng)的分類結(jié)果,用1和-1表示。
svmtrain返回一個(gè)存儲了訓(xùn)練好的svm所需的參數(shù)的結(jié)構(gòu)體svm_struct。
svmclassify接受svm_struct和以一行表示一個(gè)樣本的testdata,并以1和-1列向量的形式返回分類結(jié)果。
轉(zhuǎn)載于:https://www.cnblogs.com/Finley/p/5329417.html
總結(jié)
以上是生活随笔為你收集整理的LibSVM for Python 使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件工程个人作业03
- 下一篇: 架构师必看 京东咚咚架构演进