多媒體系統課當時已稍微玩過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.py和easy.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流程:
- 將資料轉成libsvm看得懂的格式
- training data和testing data做Scale data
- 選用效能較佳的RBF kernel(預設值即是RBF)
- 使用cross validation選擇較好的參數(即是grid.py所做的事)
- 套用剛所找到的參數來Train model
- 將testing data做Predict data
現在有個問題,那張圖代表什麼意思?
Comments on: "[LibSVM] SVM 實驗最佳化參數" (12)
你好~最進也有用libsvm再進行分類
想請問要如何用libsvm 得出precision和 recall的值?
讚讚
嗨~雜草魂,
你有照著文章的步驟實驗嗎?
其實我這篇文章應該記錄的很清楚了,
若還是不太瞭解,
你可以去看林智仁老師的學生所寫的,
「笨蛋也可以使用LibSVM」,
我也看過了,呵呵~ 🙂
讚讚
抱歉我還想請問一下
如何用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自己退出了,先前的圖也不見了
讚讚
是有出現圖?然後不見?
我沒遇過你說的狀況~
照理說,按照上面步驟,
會很順利地得到結果才是。
讚讚
在跑的過程中
圖一直都在
圖也都有跟著數據做變動
只是結果出來之後
圖反而不見了
讚讚
我覺得你可以換台電腦試試看,說不一定就沒問題了~ 😉
讚讚
OK,感謝
讚讚
这种状况是正常的,最后会生成一个png和一个out文件,png就是不见了的图。另外我做测试发现交叉验证找到的参数训练之后进行预测跟默认参数一样→_→,可能是训练集正好这样吧,如果知道可以解惑。
讚讚
原來如此!謝謝你熱心的解答~看來參數也有關係! 😀
讚讚
[…] 研究過LibSVM]SVM 實驗最佳化參數,原本以為只要將Data Set平分為兩半,一半是Train Set,一半是Test Set即可,因為我讀了這篇論文Example-Based Image Color and Tone Style Enhancement也這麼做,要是它使用交叉驗證 (Cross Validation)的話,準確率想必可以再提昇,這個議題還能拿來再研究呢! […]
讚讚