http://hi.baidu.com/yuanding232323/item/dee80e1a495c0b2bf6625c88python
主要參考了一些博客以及本身使用經驗。收集來以爲比較有用的。函數
LIBSVM工具
數據格式須要----------------------性能
決策屬性 條件屬性a 條件屬性b ...開發工具
2 1:7 2:5 ...測試
1 1:4 2:2 ...spa
數據格式轉換----------------------命令行
當數據較少時,能夠用formatdatalibsvm輕鬆地將文本數據轉換成爲svm工具使用的數據。excel
使用方法爲:orm
1,打開FormatDataLibsvm.xls而後將數據粘貼到sheet1的topleft單元。
輸入格式爲:
條件屬性a 條件屬性b ... 決策屬性
7 5 ... 2
4 2 ... 1
輸出數據格式是
決策屬性 條件屬性a 條件屬性b ...
2 1:7 2:5 ...
1 1:4 2:2 ...
2,再"工具"-->"宏"-->執行下面有一個選項(FormatDatatoLibsvm)-->執行,要選中這個而後運行就能夠了 ,這時數據轉換的問題就解決了(若是沒有宏選項,點擊「開始--excel選項---在功能區顯示「開發工具」選項卡」)
3,能夠copy到一個記事本中便可。可是注意在用libsvm的時候要在命令行輸入.txt後綴。
svm參數說明----------------------
若是你要輸出類的機率,必定要有-b參數
svm-train training_set_file model_file
svm-predict test_file model_fileoutput_file
自動腳本:python easy.py train_data test_data
自動選擇最優參數,自動進行歸一化。
對訓練集合和測試結合,使用同一個歸一化參數。
-c:參數
-g: 參數
-v:交叉驗證數
-s svm_type : set type of SVM (default 0)
0 -- C-SVC
1 -- nu-SVC
2 -- one-class SVM
3 -- epsilon-SVR
4 -- nu-SVR
-t kernel_type : set type of kernelfunction (default 2)
0 -- linear: u'*v
1 -- polynomial: (gamma*u'*v + coef0)^degree
2 -- radial basis function: exp(-gamma*|u-v|^2)
3 -- sigmoid: tanh(gamma*u'*v + coef0)
-d degree : set degree in kernel function(default 3)
-g gamma : set gamma in kernel function(default 1/num_features)
-r coef0 : set coef0 in kernel function(default 0)
-c cost : set the parameter C of C-SVC,epsilon-SVR, and nu-SVR (default 1)
-n nu : set the parameter nu of nu-SVC,one-class SVM, and nu-SVR (default 0.5)
-p epsilon : set the epsilon in lossfunction of epsilon-SVR (default 0.1)
-m cachesize : set cache memory size in MB(default 100)
-e epsilon : set tolerance of terminationcriterion (default 0.001)
-h shrinking: whether to use the shrinkingheuristics, 0 or 1 (default 1)
-b probability_estimates: whether to traina SVC or SVR model for probability estimates, 0 or 1 (default 0)(若是須要估計分到每一個類的機率,則須要設置這個)
-wi weight: set the parameter C of class ito weight*C, for C-SVC (default 1)
Thek in the -g option means the number of attributes in the input data.
libsvm使用誤區----------------------
(1) 直接將訓練集合和測試集合簡單歸一化到[0,1]區間,可能致使實驗結果不好。
(2) 若是樣本的特徵數很是多,那麼就沒必要使用RBF核將樣本映射到高維空間。
a) 在特徵數很是多的狀況下,使用線性核,結果已經很是好,而且只須要選擇參數C便可。
b) 雖說RBF核的結果至少比線性核好,前提下搜索整個的空間。
(3) 樣本數<<特徵數的狀況:
a) 推薦使用線性核,能夠達到與RBF一樣的性能。
(4) 樣本數和特徵數都很是多:推薦使用liblinear,更少的時間和內存,可比的準確率。
(5) 樣本數>>特徵數:若是想使用線性模型,可使用liblinear,而且使用-s 2參數
libsvm在訓練model的時候,有以下參數要設置,固然有默認的參數,可是在具體應用方面效果會大大折扣。
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部
當構建完成model後,還要爲上述參數選擇合適的值,方法主要有Gridsearch,其餘的感受不經常使用,Gridsearch說白了就是窮舉。
網格參數尋優函數(分類問題):SVMcgForClass
[bestCVaccuracy,bestc,bestg]=
SVMcgForClass(train_label,train,
cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)
輸入:
train_label:訓練集的標籤,格式要求與svmtrain相同。
train:訓練集,格式要求與svmtrain相同。
cmin,cmax:懲罰參數c的變化範圍,即在[2^cmin,2^cmax]範圍內尋找最佳的參數c,默認值爲cmin=-8,cmax=8,即默認懲罰參數c的範圍是[2^(-8),2^8]。
gmin,gmax:RBF核參數g的變化範圍,即在[2^gmin,2^gmax]範圍內尋找最佳的RBF核參數g,默認值爲gmin=-8,gmax=8,即默認RBF核參數g的範圍是[2^(-8),2^8]。
v:進行Cross Validation過程當中的參數,即對訓練集進行v-fold Cross Validation,默認爲3,即默認進行3折CV過程。
cstep,gstep:進行參數尋優是c和g的步進大小,即c的取值爲2^cmin,2^(cmin+cstep),…,2^cmax,,g的取值爲2^gmin,2^(gmin+gstep),…,2^gmax,默認取值爲cstep=1,gstep=1。
accstep:最後參數選擇結果圖中準確率離散化顯示的步進間隔大小([0,100]之間的一個數),默認爲4.5。
輸出:
bestCVaccuracy:最終CV意義下的最佳分類準確率。
bestc:最佳的參數c。
bestg:最佳的參數g。
網格參數尋優函數(迴歸問題):SVMcgForRegress
[bestCVmse,bestc,bestg]=
SVMcgForRegress(train_label,train,
cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)
其輸入輸出與SVMcgForClass相似,這裏再也不贅述。
而當你訓練完了model,在用它作classification或regression以前,應該知道model中的內容,以及其含義。
用來訓練的是libsvm自帶的heart數據
model =
Parameters: [5x1 double]
nr_class: 2
totalSV: 259 % 支持向量的數目
rho: 0.0514 % b
Label: [2x1 double] % classification中標籤的個數
ProbA: []
ProbB: []
nSV: [2x1 double] % 每類支持向量的個數
sv_coef: [259x1 double] % 支持向量對應的Wi
SVs: [259x13 double] % 裝的是259個支持向量
model.Parameters參數意義從上到下依次爲:
-s svm類型:SVM設置類型(默認0)
-t 核函數類型:核函數設置類型(默認2)
-d degree:核函數中的degree設置(針對多項式核函數)(默認3)
-g r(gama):核函數中的gamma函數設置(針對多項式/rbf/sigmoid核函數) (默認類別數目的倒數)
-r coef0:核函數中的coef0設置(針對多項式/sigmoid核函數)((默認0)
SVM 怎樣能獲得好的結果
1. 對數據作歸一化(simple scaling)
2. 應用 RBF kernel
3. 用cross-validation和grid-search 獲得最優的c和g
4. 用獲得的最優c和g訓練訓練數據
5. 測試
關於svm的C以及核函數參數設置----------------------
參考自:對支持向量機幾種經常使用核函數和參數選擇的比較研究
C通常能夠選擇爲:10^t , t=- 4..4就是0.0001 到10000
選擇的越大,表示對錯誤例懲罰程度越大,可能會致使模型過擬合
在LIBSVM中-t用來指定核函數類型(默認值是2)。
0)線性核函數
(無其餘參數)
1)多項式核函數
(重點是階數的選擇,即d,通常選擇1-11:1 3 5 7 9 11,也能夠選擇2,4,6…)
2)RBF核函數
(徑向基RBF內核,exp{-|xi-xj|^2/均方差},其中均方差反映了數據波動的大小。
參數一般可選擇下面幾個數的倒數:0.1 0.2 0.4 0.6 0.8 1.6 3.2 6.4 12.8,默認的是類別數的倒數,即1/k,2分類的話就是0.5)
3)sigmoid核函數 又叫作S形內核
兩個參數g以及r:g通常可選1 2 3 4,r選0.2 0.4 0.60.8 1
4)自定義核函數
經常使用的四種核函數對應的公式以下:
與核函數相對應的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。