1. 程式人生 > >Libsvm在windows下使用細節彙總

Libsvm在windows下使用細節彙總

0.下載Libsvm

Libsvm官網 https://www.csie.ntu.edu.tw/~cjlin/libsvm/ 下載後將其解壓到本地,這裡,我的本地路徑為: C: \Anaconda3\Lib\sit-packages\libsvm

1.準備資料

  • 一種方法是通過svm_read_peoblem方法直接讀取libsvm格式的檔案,返回分類 標籤([ ])和資料([[ ]])。如:labels, datas = svm_read_problem(‘filename’)
  • 另一種方法是直接使用python的格式的,這種方法適用於在程式執行過程中動態產生的data。分為兩種:一種是特徵值連續的不用手動表明各個屬性值的index,例如labels,datas = [1,-1], [[1,2,3],[-1,-2,–3]],還有一種是帶index的,適合處理那些資料比較稀疏的,即好多特徵值沒有,label, datas = [{1:1, 3:1}, {1:-1, 3:-1}]

2. 通過訓練集training得到模型

使用svm_train方法,傳入labels, datas必要的引數,返回model.也有兩種方案:

  • 直接呼叫model = svm_train(label, data, ‘-h 0’),將必要的引數’-h 0’傳入。
  • 先labels和datas作為一個整體prob傳入,整體構成用過**svm_problem(labels, datas)得到,再呼叫svm_train(prob, param)訓練得到model,這裡的param可以直接以’-h -0’字串形式,也可以通過param=svm_parameter(‘-c 4 –b 1’)**得到。

3. 利用model進行預測

這裡的model可以是上一步返回的model,或者從外部檔案匯入的model,預測的方法是svm_predict(testClassfier, testSeqVector,model),引數集分別是測試集實際labels,測試資料特徵向量,訓練模型,當然還有一個可選的引數就是predict的是否需要評估概率的引數-b 0 or 1, 預設為0.例如p_label, p_acc, p_val = svm_predict(y, x, m, ‘-b 1’),這裡返回了3個值,分別是預測的label列表([]),準確率p_acc()用於分類的準確率,迴歸的mean-squared erro 和squared correlation coefficient.

4. 常用介面

  • svm_train() # train a mdoel 訓練
  • svm_predict() # predict testing data 預測
  • svm_read_problem() #read the data from a LIBSVM-format file 讀取libsvm格式資料
  • svm_load_model() #load a LIBSVM model
  • svm_save_model #save model to a file
  • evaluations() #evaluate prediction results

Function: avm_train #三種訓練寫法 There are three ways to call svm_train()

  • model = svm_train(y, x, [‘training_options’])
  • model = svm_train(prob, [‘training_options’])
  • model = svm_train(prob, param)

5. 有關引數的設定(可檢視read me 資料夾中說明)

Usage; svm-train[options] training_set_file[model_file] options:

  • -s svm_type : set type of SVM (default 0) #選擇哪一種svm 0 :C-SVC(multi-class classification):使用乘法因子(cost)的處理噪聲的多分類器 1 :nu-SVC (multi-class classification):按照錯誤樣本比例處理噪聲的多分類器 2 :one-class SVM:一類支援向量機 3:epsilon-SVC(regression)epsilon-支援向量迴歸 4 :nu-SVC (multi-regression)

  • -t kernel_type: set type of kernel function(default 2) #核函式型別 0 – linear : u’v 線性核 1 – polynomial: (gammauv +coef0)^degree 多項式核 2 – radial basis function : exp(-gamma|u-v|^2) RBF 徑向基核/高斯核 3 – sigmoid: tanh(gamma*u’*v +coef0) S型核 4 – precomputed kernel (kernel values in training_set_file) 預計算核

  • -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 loss function of epsilon-SVR (default 0.1)

  • -m cachesize : set cache memory size in MB (default 100)調整內緩衝區大小以MB為單位

  • -e epasilon : set tolerance of termination criterion (default 0.001)

  • -h shrinking : whether to use the shrinking heuristics, 0 or 1 (default 1)是否使用收縮啟發式演算法

  • -b probability_estimates : whether to train a SVC or SVR model for probability estimates, 0 or 1(default 1)是否估算正確概率,取值為0或者-1

  • -wi weight : set the parameter C of class i to weight*C for C-SVC (default 1) 調整C-SVC中第i個特徵的Cost引數

  • v n : n-fold cross validation mode 交叉驗證

  • q : quiet mode (no outputs) 靜默模式

6.提高預測的準確率

通過一定的過程,可以提高預測的準確率

  • 轉換資料為libsvm可用形式
  • 進行一個簡單的尺度變化
  • 利用RBF kernel, 利用cross-validation來查詢最佳的引數C和r
  • 利用最佳引數C和r,來訓練整個資料集
  • 測試

7. 引數及返回值的含義

  • y 訓練資料的標籤
  • x 訓練資料的輸入向量
  • yt 測試資料的標籤
  • xt 測試資料的輸入向量
  • m 訓練好的SVM模型
  • p_label 儲存預測標籤的列表
  • p_acc 儲存了預測的精確度,均值和迴歸的平均相關係數
  • p_vals 在制定引數時返回判定係數(判定的可靠程度)

8. LIBSVM使用流程

1) 按照LIBSVM軟體包所要求的格式準備資料集;LIBSVM的資料格式為: Label 1:value 2:value … Label為標籤,1 2 3為第幾個特徵,value是對應的特徵值,資料之間用空格隔開,當特徵值為0時, 可以省略(即序號可以不連續,預設0)。生成libsvm所用的資料格式,一種方法是FormatDataLibsvm.xls, 第二種方法是.txt檔案轉換。 2) 對資料進行簡單的縮放操作; 3) 考慮選用RBF 核函式 ; 4) 採用交叉驗證選擇最佳引數C與g ; 5) 採用最佳引數C與g 對整個訓練集進行訓練獲取支援向量機模型; 6) 利用獲取的模型進行測試與預測。

9. 如何根據實際問題選用模型

{C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR}

  • C_SVC: C代表懲罰因子,C越大表示對錯誤分類的懲罰越大
  • NU_SVC: 和C_SVC相同
  • ONE_CLASS: 不需要類標號,用於支援向量的密度估計和聚類
  • EPSILON_SVR:不敏感損失函式,對於樣本點來說,存在著一個不為目標函式提供任何損失值得區域,即-帶
  • NU_SVR: 由於EPSILON_SVR需要事先確定引數,然而在某些情況下選擇合適的引數不是一件容易的事情,而NU_SVR能夠自動計算引數。 **注意:**C_SVC和NU_SVC其實採用的模型相同,但是它們的引數C的範圍不同,C_SVC採用的是0到正無窮,NU_SVC是[0,1]

10. 如何選擇核函式及懲罰因子C和核引數

{LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED} 即:線性、多項式、徑向基、神經元的非線性作用函式、使用者自定義 我們需要先選出首選的核函式,然後選擇懲罰因子C和核引數。

  • 建議一般使用RBF核函式,因為其有良好的性質。這個核函式將樣本非線性地對映到一個更高維的空間,與線性核不同,它能夠處理分類標註和屬性的非線性關係。並且,線性核是RBF的一個特例(Keerthi and Lin 2003),因此,使用一個懲罰因子C的線性核與某些引數(C,γ)的RBF核具有相同的效能。同時,Sigmoid核的表現很像一定引數的RBF核(Lin and Link 2003)。 第二個原因,超引數(hyperparameter)的數量會影響到模型選擇的複雜度(因為引數只能靠試驗呀!)。多項式核比RBF核有更多的超引數。 最後,RBF核有更少的數值複雜度(numerical difficulties)
  • 不適用RBF核的情形,例如特徵維度非常大的時候,只能選用線性核。

11. 尋優

使用pythonGnuplot來對引數進行尋優(網格搜尋法Grid-Search)

  • 用網格搜尋法尋找最優化引數c和g,網路搜尋法的基本原理是讓c和g在一定範圍內劃分網格並遍歷網格內所有的店進行取值,對於選取的c和g,利用交叉驗證法獲得在此組(c,g)下訓練集驗證預測準確率,最終取得訓練集驗證預測準確率最高的那組(c,g)作為最佳的引數。
  • 選擇大的搜尋區間和搜尋步長,並以指數形式增長順序的C和g來訓練,逐步縮小搜尋的範圍和步長進行fine grid search(小範圍的搜尋),選擇k-折交叉驗證檢驗引數,同時得到的交叉驗證精確度是被正確預測資料的百分比,得到最佳引數對。 Grid.py具體操作: 1)下載gunplot 2)使用grid.py,找到該py,用Spyder開啟,修改class GridOption下else中svm-train.exe及pgnuplot.exe路徑,儲存 3) 執行cmd,用cd定位到Anaconda3\Lib\site-packages\libsvm\tools 4) 輸入命令grid.py 空格 檔名 5) 找最後一行數字例如2048.0 0.0001220703125 84.0741 含義是C=2048.0, =0.0001220703125,交叉驗證精度為84.0741%

12. 對資料進行歸一化

  • SVM-SCALE: 1)windows+R 2)cmd進行命令視窗 3)將當前路徑定位到SVM-SCALE : cd Anaconda3\Lib\site-packages\libsvm\windows 4)將需要進行歸一化處理的文件copy到該目錄下 5) 以fun.csv.txt為例svm-scale fun.csv.txt > fun.csv.scale.txt
  • 呼叫MATLAB中的premnmx進行歸一化,預測結果用postmnmxp(x1, min(x),max(x))進行反歸一化操作。
  • 手動歸一化
  • 歸一化到N(0,1) 注意: 建議將訓練資料集與測試資料集放在同一個文字檔案中一起歸一化,然後再將歸一化結果分成訓練集和測試集。

13. 多分類演算法有哪些可以用

SVM適用於二分類問題,若遇到多分類問題,需要採用多分類演算法。

  • 一對餘支援向量機(1-v-R),對於k分類問題,需要構造k個 描述:對於第i類樣本,首先標記都為正類,將其餘k-1類的樣本標記為負類,通過訓練得到對滴i個SVM分類器,而對待測樣本進行分類時,帶入所有k個分類器,選取函式輸出值最大的類別作為新樣本的類別。
  • 一對一支援向量機(1-v-1),對於k分類問題,需要構造k(k-1)/2個分類器。 描述:每兩類之間構造SVM分類器,在判別待測樣本的所屬類別時,需要將該樣本點依次通過每個分類器進行分類,最後統計各個類別的“得票數”,並將該樣本點歸於得票數最高的那個類別。
  • 有向無環圖SVM演算法
  • 支援向量機決策樹
  • 多支援向量機分類器

14. LIBSVM提供的幾個工具包

  • svm-scale:能夠放縮輸入資料的工具
  • : 放縮後的資料進行最優引數選擇

15. svmscale的用法

vmscale是用來對原始樣本進行縮放的,範圍可以自己定,一般是[0,1]或[-1,1]。縮放的目的主要是 1)防止某個特徵過大或過小,從而在訓練中起的作用不平衡; 2)為了計算速度。因為在核計算中,會用到內積運算或exp運算,不平衡的資料可能造成計算困難。 用法: svmscale [-l lower] [-u upper] [-y y_lower y_upper] [-s save_filename] [-r restore_filename] filename 其中,[ ]中都是可選項: -l :設定資料下限;lower:設定的資料下限值,預設為-1 -u:設定資料上限;upper:設定的資料上限值,預設為 1 -y:是否對目標值同時進行縮放;y_lower為下限值,y_upper為上限值; -s: save_filename:表示將縮放的規則儲存為檔案save_filename; -r :restore_filename:表示將按照已經存在的規則檔案restore_filename進行縮放; filename:待縮放的資料檔案,檔案格式按照libsvm格式。 預設情況下,只需要輸入要縮放的檔名就可以了:比如(已經存在的檔案為test.txt),這時,test.txt中的資料已經變成[-1,1]之間的資料了。但是,這樣原來的資料就被覆蓋了,為了讓規劃好的資料另存為其他的檔案,我們用一個dos的重定向符 > 來另存為(假設為out.txt): svmscale test.txt > out.txt 執行後,我們就可以看到目錄下多了一個out.txt檔案,那就是規範後的資料。假如,我們想設定資料範圍[0,1],並把規則儲存為test.range檔案: svmscale –l 0 –u 1 –s test.range test.txt > out.txt,這時,目錄下又多了一個test.range檔案,可以用記事本開啟,下次就可以用-r test.range來載入。

16.easy.py的用法

注意: easy.py與先grid.py再輸入程式碼結果相同 檔案easy.py對樣本檔案做了“一條龍服務”,從引數優選,到檔案預測,因此,其對grid.py、svm-train、svm-scale和svm-predict都進行了呼叫,因此,執行時需要保證這些檔案的路徑都要正確,還要樣本檔案和預測檔案 1) 開啟easy.py,修改幾個路徑 #example for windows(已修改) 2) 執行cmd, 使用cd,定位到easy.py的路徑 cd Anaconda3\Lib\site-packages\libsvm\tools 3) 輸入命令 easy.py空格+訓練集+空格+測試集

17.一些使用方法說明

  • cd 進入到當前盤某個目錄。
  • *cd * 進入當前盤根目錄
  • cd \windows 進入到當前盤Windows目錄
  • cd… 退出到上一級目錄 注意: 進入含有特殊字元目錄時需要加引號 例如 cd"c:\program files"