Just My Life & My Work

[LibSVM] SVM 實驗最佳化參數

多媒體系統課當時已稍微玩過LibSVM實驗,然而那時候並沒有下參數,讓分類結果最佳化,於是今日捲土重來。

先不用理解複雜的LibSVM原理,跑出數字和視覺化結果,讓我們更感興趣!

準備工作:

假設使用的平台是Windows 7,從命令列執行。先把一些需要的東西裝好,我們總共需要三個東西:libsvm、python、gnuplot。

  • Libsvm:http://www.csie.ntu.edu.tw/~cjlin/libsvm/
    下載libsvm,然後解壓縮到C:\。
    路徑:C:\libsvm-3.12
  • Python:http://www.python.org/download/
    下載Python,直接安裝就好,記得設定python這個指令在命令提示字元中的所有位置都可以執行。也可以從這個路徑設定:我的電腦->進階系統設定->進階->環境變數->系統變數,設定Path:C:\Python33\。在命令提示字元輸入指令:python,即可知道是否成功。
    路徑:C:\Python33
  • Gnuplot:http://www.gnuplot.info/
    下載Gnuplot,直接安裝就好了。
    路徑:C:\Program Files\gnuplot

到C:\libsvm-3.12\tools找grid.pyeasy.py,並複製到C:\libsvm-3.12\windows。
開啟grid.py和easy.py,分別在第26行和第25行更改兩者

  • gnuplot_exe = r"C:\Program Files\gnuplot\bin\pgnuplot.exe"

因為我們需要執行pgnuplot.exe,其位置在

  • C:\Program Files\gnuplot\bin\

到http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/ 找LIBSVM data sets,這次使用a1a這個資料集,a1a為training set,a1a.t為testing set。

執行檔與程式檔說明:

  • svm-train.exe:可以將training data訓練為model。
    • model檔格式:< 類別號> < 索引1> :< 特徵值1> < 索引2> :< 特徵值2> …
  • svm-scale.exe:用來調整feature的大小範圍,以免有某一項feature值太大,在算距離時主導了結果。通常我們將取值的範圍訂在[0,1]或[-1,~1],注意,training data與testing data都必須作相同程度的scale。
  • svm-predict.exe:預測testing data在已訓練model的狀況。
  • svm-toy.exe:可以視覺化操作資料與修改參數,執行後產生分類結果。
  • grid.py:分類要切的好,參數就要下的好。林智仁老師寫好的工具幫我們自動測試參數,不用自己手動測試。
  • easy.py:簡化命令提示列下指令的過程。

開始執行:

按Win + R,跳出「執行」視窗,輸入「cmd」。

  • C:\Users\WEN>cd C:\libsvm-3.12\windows
  • C:\libsvm-3.12\windows>svm-scale.exe -s scale a1a > a1a.scale

WARNING: original #nonzeros 22249
new #nonzeros 181365
Use -l 0 if many original feature values are zeros

  • C:\libsvm-3.12\windows>svm-scale.exe -r scale a1a.t > a1a.t.scale

WARNING: original #nonzeros 429343
new #nonzeros 3807588
Use -l 0 if many original feature values are zeros

  • C:\libsvm-3.12\windows>python grid.py a1a.scale

[local] 5 -7 81.8692 (best c=32.0, g=0.0078125, rate=81.8692)
[local] -1 -7 82.7414 (best c=0.5, g=0.0078125, rate=82.7414)
[local] 5 -1 75.2648 (best c=0.5, g=0.0078125, rate=82.7414)
[local] -1 -1 75.3271 (best c=0.5, g=0.0078125, rate=82.7414)
[local] 11 -7 78.7539 (best c=0.5, g=0.0078125, rate=82.7414)

[local] 13 -5 80.5607 (best c=8.0, g=0.0078125, rate=83.4891)
[local] 13 -15 82.7414 (best c=8.0, g=0.0078125, rate=83.4891)
[local] 13 3 75.2648 (best c=8.0, g=0.0078125, rate=83.4891)
[local] 13 -9 78.3801 (best c=8.0, g=0.0078125, rate=83.4891)
[local] 13 -3 79.6262 (best c=8.0, g=0.0078125, rate=83.4891)
8.0 0.0078125 83.4891

  • C:\libsvm-3.12\windows>svm-train.exe -c 8.0 -g 0.0078125 a1a.scale

.*.*
optimization finished, #iter = 2430
nu = 0.338842
obj = -3667.375758, rho = 0.654220
nSV = 659, nBSV = 443
Total nSV = 659

  • C:\libsvm-3.12\windows>svm-predict.exe a1a.t.scale a1a.scale.model a1a.t.out

Accuracy = 83.9869% (25999/30956) (classification)

以上一連串的指令,其實可以換成一個script:

  • C:\libsvm-3.12\windows>python easy.py a1a a1a.t

輸出結果同上。

Gnuplot繪出的圖形:

圖中accuracy = 83.4891%training data的訓練後分類準確度,而Accuracy = 83.9869% (25999/30956) (classification)為testing data以訓練好的model預測後分類準確度。

結論

林智仁老師有一套建議的classify流程:

  1. 將資料轉成libsvm看得懂的格式
  2. training data和testing data做Scale data
  3. 選用效能較佳的RBF kernel(預設值即是RBF)
  4. 使用cross validation選擇較好的參數(即是grid.py所做的事)
  5. 套用剛所找到的參數來Train model
  6. 將testing data做Predict data

現在有個問題,那張圖代表什麼意思?

神奇的是尋找最佳參數的過程就像是在爬山,若爬得越高就代表準確度越好!於是這張圖被稱作等高線圖:)

參考資料:

Comments on: "[LibSVM] SVM 實驗最佳化參數" (12)

  1. 你好~最進也有用libsvm再進行分類
    想請問要如何用libsvm 得出precision和 recall的值?

    • 嗨~雜草魂,
      你有照著文章的步驟實驗嗎?
      其實我這篇文章應該記錄的很清楚了,
      若還是不太瞭解,
      你可以去看林智仁老師的學生所寫的,
      「笨蛋也可以使用LibSVM」,
      我也看過了,呵呵~ 🙂

  2. 抱歉我還想請問一下
    如何用LIBSVM實現多分類
    因為我目前手邊有的是需要多分類的資料

  3. 您好
    我想請問一下
    C:\libsvm-3.12\windows>svm-predict.exe a1a.t.scale a1a.scale.model a1a.t.out
    Accuracy = 83.9869% (25999/30956) (classification)
    這一步完成之後
    如何把Gnuplot繪出的圖形叫出來並保存下來

    因為我在到這一步時
    Gnuplot自己退出了,先前的圖也不見了

  4. […] 研究過LibSVM]SVM 實驗最佳化參數,原本以為只要將Data Set平分為兩半,一半是Train Set,一半是Test Set即可,因為我讀了這篇論文Example-Based Image Color and Tone Style Enhancement也這麼做,要是它使用交叉驗證 (Cross Validation)的話,準確率想必可以再提昇,這個議題還能拿來再研究呢! […]

隨意留個言吧:)~

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

標籤雲