【libsvm】參數使用


2022.3.15 星期二

 太多了,自己多跑跑數據,改改代碼就眼熟了。記錄一下免得每次找。

一、參數

1. 讀取

libsvmread函數可以讀取以LIBSVM格式存儲的數據文件。

[label_vector, instance_matrix] = libsvmread(‘data.txt’);

這個函數輸入的是文件的名字,輸出為樣本的類標和對應的特征。

2.保存

libsvmwrite函數可以把Matlab的矩陣存儲稱為LIBSVM格式的文件。

libsvmwrite(‘data.txt’, label_vector, instance_matrix]

這個函數有三個輸入,分別為保存的文件名、樣本的類標和對應的特征(必須為double類型的稀疏矩陣)。

3. 訓練

libsvm函數用於對訓練集的數據進行訓練,得到訓練好的模型。

model = svmtrain(training_label_vector, training_instance_matrix [, 'libsvm_options']);

這個函數有三個參數,其中

  • -training_label_vector:訓練樣本的類標。如果有m個樣本,就是m x 1的矩陣(類型必須為double)。這里可以是二分類和多分類,類標是(-1,1)、(1,2,3)或者其他任意用來表示不同的類別的數字,要轉成double類型。
  • -training_instance_matrix:訓練樣本的特征。如果有m個樣本,每個樣本特征是n維,則為m x n的矩陣(類型必須為double)。
  • -libsvm_options:訓練的參數,在第5點詳細介紹。

4. 預測

libpredict函數用於對測試集的數據進行測試,還能對未知樣本進行預測。

[predicted_label, accuracy, decision_values/prob_estimates] 
    = svmpredict(testing_label_vector, testing_instance_matrix, model [, 'libsvm_options']);

這個函數包括四個參數,其中

  • -testing_label_vector:測試樣本的類標,如果有m個樣本,就是m x 1的矩陣(類型必須為double)。如果類標未知,可以初始化為任意m x 1的double數組。
  • -testing_instance_matrix:測試樣本的特征,如果有m個樣本,每個樣本特征是n維,則為m x n的矩陣(類型必須為double)。
  • -model:使用libsvmtrain返回的模型
  • -libsvm_options:預測的參數,與訓練的參數形式一樣。

 

5. 訓練的參數 libsvm_options

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

     0 — C-SVC:C-支持向量分類機;參數C為懲罰系數,C越大表示對錯誤分類的懲罰越大,適當的參數C對分類Accuracy很關鍵。

     1 — v-SVC:v-支持向量分類機;由於C的選取比較困難,用另一個參數v代替C。C是“無意義”的,v是有意義的。(與C_SVC模型相同,但參數C的范圍不同,C_SVC是0到正無窮,該類型是[0,1])

     2 — 一類SVM:​單類別-支持向量機;不需要類標號,用於支持向量的密度估計和聚類。

     后兩者是針對回歸問題的,分類問題與回歸問題最大的不同就是label,分類的label是類別,比如+1,-1,回歸的label是目標值,可能為任意值。

     3 — e-SVR:ε-支持向量回歸機;不敏感損失函數,對樣本點來說,存在着一個不為目標函數提供任何損失值的區域。

     4 — v-SVR:n-支持向量回歸機;由於EPSILON_SVR需要事先確定參數,然而在某些情況下選擇合適的參數卻不是一件容易的事情。而NU_SVR能夠自動計算參數。

  • -t 核函數類型:核函數設置類型(默認2)
        0 – 線性核函數
        1 – 多項式核函數:(r*u’v + coef0)^degree  (重點是階數的選擇,即d,一般選擇1-11:1 3 5 7 9 11,也可以選擇2,4,6…)
        2 – RBF(徑向基)核函數:exp(-r|u-v|^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核函數:tanh(r*u’v + coef0) ( 兩個參數g以及r:g一般可選1 2 3 4,r選0.2 0.4 0.60.8 1)
  • -d degree:核函數中的degree設置(只針對多項式核函數)(默認3)
  • -g r(gamma):核函數中的gamma函數設置(針對多項式/rbf/sigmoid核函數)(默認1/k,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)
  • -b probability_estimates:是否訓練SVC或SVR模型進行概率估計,0或1(默認為0)
  • -v n: n-fold交互檢驗模式,n為fold的個數,必須大於等於2

以上這些參數設置可以按照SVM的類型和核函數所支持的參數進行任意組合,如果設置的參數在函數或SVM類型中沒有也不會產生影響,程序不會接受該參數;如果應有的參數設置不正確,參數將采用默認值。

 

6. 訓練返回的內容

libsvmtrain函數返回訓練好的SVM分類器模型,可以用來對未知的樣本進行預測。這個模型是一個結構體,包含以下成員:

  • -Parameters: 一個5 x 1的矩陣,從上到下依次表示:
        -s SVM類型(默認0);
        -t 核函數類型(默認2)
        -d 核函數中的degree設置(針對多項式核函數)(默認3);
        -g 核函數中的r(gamma)函數設置(針對多項式/rbf/sigmoid核函數) (默認類別數目的倒數);
        -r 核函數中的coef0設置(針對多項式/sigmoid核函數)((默認0)
  • -nr_class: 表示數據集中有多少類別,比如二分類時這個值即為2。
  • -totalSV: 表示支持向量的總數。
  • -rho: 決策函數wx+b中的常數項的相反數(-b)。
  • -Label: 表示數據集中類別的標簽,比如二分類常見的1和-1。
  • -ProbA: 使用-b參數時用於概率估計的數值,否則為空。
  • -ProbB: 使用-b參數時用於概率估計的數值,否則為空。
  • -nSV: 表示每類樣本的支持向量的數目,和Label的類別標簽對應。如Label=[1; -1],nSV=[63; 67],則標簽為1的樣本有63個支持向量,標簽為-1的有67個。
  • -sv_coef: 表示每個支持向量在決策函數中的系數。
  • -SVs: 表示所有的支持向量,如果特征是n維的,支持向量一共有m個,則為m x n的稀疏矩陣。

另外,如果在訓練中使用了-v參數進行交叉驗證時,返回的不是一個模型,而是交叉驗證的分類的正確率或者回歸的均方根誤差。

 

7. 預測返回的內容

libsvmtrain函數有三個返回值,不需要的值在Matlab可以用~進行代替。

  • -predicted_label:第一個返回值,表示樣本的預測類標號。
  • -accuracy:第二個返回值,一個3 x 1的數組,表示分類的正確率、回歸的均方根誤差、回歸的平方相關系數。
  • -decision_values/prob_estimates:
    第三個返回值,一個矩陣包含決策的值或者概率估計。對於n個預測樣本、k類的問題:
    如果指定“-b 1”參數,則n x k的矩陣,每一行表示這個樣本分別屬於每一個類別的概率;
    如果沒有指定“-b 1”參數,則為n x k*(k-1)/2的矩陣,每一行表示k(k-1)/2個二分類SVM的預測結果。

ps.libsvm可以對多類進行分類,采取的策略為“一對一”,即:K類會有N = (K-1)*K/2個SVM分類器,對樣本N個分類器都進行分類,會有N個分類結果,對分類結果中的類別進行統計,出現次數最多的類別為樣本類別

%訓練及測試數據
trainx=[-5,4;-4,5;5,4;4,5;-5,-5;-4,-5;6,-5;5,-6];
trainy=[1;1;2;2;3;3;4;4];
testx=[-6,5;7,4;-7,6;7,5;-100,-100];
testy=[1;2;3;4;3];

%訓練程序
%1
model1 = svmtrain(trainy,trainx,'-c 2 -g 0.02 -t 1 ');%未指定 -b 1
[~,~,p1] = svmpredict(testy,testx,model1); %未指定 -b 1

%2
model2 = svmtrain(trainy,trainx,'-c 2 -g 0.02 -t 1 -b 1');%指定 -b 1
[~,~,p2] = svmpredict(testy,testx,model2); %未指定 -b 1

%3  會報錯:Model does not support probabiliy estimates
model3 = svmtrain(trainy,trainx,'-c 2 -g 0.02 -t 1 ');%未指定 -b 1
[~,~, p3] = svmpredict(testy,testx,model3,'-b 1'); %指定 -b 1

%4
model4 = svmtrain(trainy,trainx,'-c 2 -g 0.02 -t 1  -b 1');%指定 -b 1
[~,~, p4] = svmpredict(testy,testx,model4,'-b 1'); %指定 -b 1

  

<1>svmtrain(…)中,未指定“-b 1” 時,訓練得到的model1;

<2>svmtrain(…)中,指定“-b 1” 時,訓練得到的model2;

對比可知,訓練時,如果未指定“-b 1”訓練模型結構體中,ProbA和ProbB為空,指定時,為K*1的列向量,(K為訓練樣本類別數)

           

<3>svmpredict(…)中,指定“-b 1” 時,概率估計(prob_estimates)p4每一行表示一個樣本屬於每個類別的概率。

<4>svmpredict(…)中,未指定“-b 1” 時,決策值(decision_values)p1;

訓練樣本有4類有6個二類SVM,最終類別歸於類別投票中,出現次數最多的一類,下面對投票過程進行分析:
決策值矩陣列數為6,每列表示一個二類SVM的決策值:

如圖,第一列是第一類和第二類SVM的決策值value。value>0,則表示在第一類和第二類比較判別中,樣本屬於第一類,value<0表示屬於第二類;其他列可同理分析,以第5行數據分析投票結果:

從票數統計看,第三類得票最多,因此測試樣本5屬於第三類。

               

 1,2,1,2,3

 二、核函數

在LIBSVM中-t用來指定核函數類型(默認值是2)。
0)線性核函數
1)多項式核函數
2)RBF核函數
3)sigmoid核函數
4)自定義核函數

常用的四種核函數對應的公式如下:

 

與核函數相對應的參數:
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。

三 超參數

  SVM的rbf核函數調參參數模型有兩個非常重要的參數C與gamma。

  結論:

  • C過大或過小,泛化能力變差。
  • gamma值越小,模型的泛化性變好, 但過小,模型實際上會退化為線性模型;gamma越大,理論上SVM可以擬合任何非線性數據。
  • 相同的模型表現下,取較小的 C (C 值較小能夠節省內存,而且跑的更快)。

 

 

參考文獻: 1.支持向量機通俗導論 支持向量機通俗導論(理解SVM的三層境界)_v_JULY_v的博客-CSDN博客_svm算法

                   2.LibSVM 在 Matlab中的使用

       3.RBF SVM 參數解讀 | gamma 和 C 如何對應模型表現 - 知乎 (zhihu.com)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM