咱們在「LibSVM學習(一)」中,講到libSVM有一個tools文件夾,裏面包含有四個python文件,是用來對參數優選的。其中,經常使用到的是easy.py和grid.py兩個文件。其實,網上也有相應的說明,但很不繫統,下面結合本人的經驗,對使用方法作個說明。python
這兩個文件都要用python(能夠在http://www.python.org上下載到,須要安裝)和繪圖工具gnuplot(能夠在ftp://ftp.gnuplot.info/pub/gnuplot/上下載,不須要安裝)。假設python安裝在d:/libsvm/tools/python26下,而gnuplot解壓到d:/libsvm/tools/gnuplot,libsvm放在了d:/libsvm/program中(這時easy.py和grid.py文件的目錄爲d:/libsvm/program/tools)。另外,須要注意的是版本,個人是python 2.6、gnuplot 4.2 和libsvm 2.89,操做系統是WINXP。web
1. grid.py使用方法bootstrap
文件grid.py是對C-SVC的參數c和γ作優選的,原理也是網格遍歷,假設咱們要對目錄d:/libsvm/program/tools下的樣本文件heart_scale作優選,其具體用法爲:windows
第一步:打開d:/libsvm/program下的tools文件夾,找到grid.py文件。用python打開(不能雙擊,而要右鍵選擇「Edit with IDLE」),修改svmtrain_exe和gnuplot_exe的路徑。app
svmtrain_exe = r"D:/libSVM/program/svm-train.exe"工具
gnuplot_exe = r"D:/libSVM/gnuplot/pgnuplot.exe"學習
(這裏面有一個是對非win32的,能夠不用改,只改# example for windows下的就能夠了)spa
第二步:運行cmd,進入dos環境,定位到d:/libsvm/program/tools文件夾,這裏是放置grid.py的地方。怎麼定位能夠參看第一節。操作系統
第三步:輸入如下命令:orm
d:/libsvm/python26/python grid.py heart_scale
你就會看到dos窗口中飛速亂串的[local]數據,以及一個gnuplot的動態繪圖窗口。大約過10秒鐘,就會中止。Dos窗口中的[local]數據時局部最優值,這個不用管,直接看最後一行:
2048.0 0.0001220703125 84.0741
其意義表示:C = 2048.0;γ=0.0001220703125(γ是哪一個參數?參看LibSVM學習(三)中svmtrain的參數說明);交叉驗證精度CV Rate = 84.0741%,這就是最優結果。
第四步:打開目錄d:/libsvm/program/tools,咱們能夠看到新生成了兩個文件:heart_scale.out和heart_scale.png,第一個文件就是搜索過程當中的[local]和最優數據,第二文件就是gnuplot圖像。
如今,grid.py已經運行完了,你能夠把最優參數輸入到svmtrain中進行訓練了。固然了,你在當中某一步極可能出現問題,不過沒關係,我也不是一會兒成功的,摸索了半天才成功。下面就須要注意的問題說明一下:
1)grid.py和svm-train的版本要統一,也就是說你不能用2.6的grid.py去調用2.89的svm-train。
2)你的目錄中若是有空格,好比d:/program files/ libsvm/...,那麼不管是在第一步仍是第二步,請把目錄改爲d:/progra~1/ libsvm/...
3) 第三步的命令問題。首先要看你定位到哪一個目錄,那麼其下的文件就不須要帶路徑,不然就要帶。像咱們上面的命令,我當前的目錄是d:/libsvm/program/tools,那麼其下的easy.py和heart_scale文件就不須要加路徑,而python.exe是在d:/libsvm/python26/下,所以不在當前目錄下,因此要加路徑。好比,當我首先用dos定位到d:/libsvm/python26時,其命令就能夠改爲:
python d:/libsvm/program/tools/grid.py d:/libsvm/program/tools/heart_scale
總起來講,命令爲python 目標文件 樣本文件,其原則是要讓系統找獲得文件。假如系統提示你「不是內部或外部命令」,說明你python的路徑錯誤,而若是是‘not found file’的提示,極可能是其餘兩個文件路徑錯誤。
4)假如,你仍舊出現問題,那麼請換一下python或者gnuplot的版本,目前python最新版本是3.1,可是好像會出問題,老一點的版本2.4或2.5的兼容性會更好。
2. easy.py使用方法
文件easy.py對樣本文件作了「一條龍服務」,從參數優選,到文件預測。所以,其對grid.py、svm-train、svm-scale和svm-predict都進行了調用(固然還有必須的python和gnuplot)。所以,運行easy.py須要保證這些文件的路徑都要正確。固然還須要樣本文件和預測文件,這裏樣本文件仍是用heart_scale,預測文件咱們複製一份而後更名heart_test,下面說一下使用方法:
第一步:打開easy.py,修改# example for windows下的幾個路徑:
第二步:運行cmd,進入dos環境,定位到放置easy.py的目錄d:/libsvm/program/tools。
第三步:輸入命令:
d:/libsvm/python26/python easy.py heart_scale heat_test
你就會看到一個gnuplot的動態繪圖窗口。大約20s之後中止,dos窗口顯示爲:
Scaling training data...
Cross validation...
Best c=2048.0, g=0.0001220703125 CV rate=84.0741
Training...
Output model: heart_scale.model
Scaling testing data...
Testing...
Accuracy = 85.1852% (230/270) (classification)
Output prediction: heart_test.predict
這就是最終預測結果,能夠看到第三行就是調用grid.py的結果。在d:/libsvm/program/tools下你會看到又多了7個文件,都是之前咱們碰到的過程文件,均可以用記事本打開。
3. 常見的問題解析:
1)
Scaling training data...
Cross validation...
Traceback (most recent call last):
File "easy.py", line 61, in ?
c,g,rate = map(float,last_line.split())
ValueError: need more than 0 values to unpack
[解析] 說明你的grid.py運行出現錯誤,你能夠參照第一部分「grid.py使用方法」運行一下就會發現問題。另外,有的說是相對路徑的問題,建議找到easy.py的如下部分:
cmd = "%s -svmtrain %s -gnuplot %s %s" % (grid_py, svmtrain_exe, gnuplot_exe, scaled_file)
改爲
cmd = "%s %s -svmtrain %s -gnuplot %s %s" % (python_path, grid_py, svmtrain_exe, gnuplot_exe, scaled_file)
2)
Traceback (most recent call last)
File "grid.py", line 349, in ?
main()
File "grid.py", line 344, in main
redraw(db)
File "grid.py", line 132, in redraw
gnuplot.write("set term windows/n")
IOError [Errno 22] Invalid argument
[解析] 說明你的gnuplot.exe在調用過程當中出現問題,要麼是你的路徑不對,要麼是你的版本不對,請檢查。
3)
Traceback (most recent call last):
File "C:/Python24/lib/threading.py", line 442, in __bootstrap
self.run()
File "c:/libsvm/tools/gridregression.py", line 212, in run
self.job_queue.put((cexp,gexp,pexp))
File "C:/Python24/lib/Queue.py", line 88, in put
self._put(item)
File "c:/libsvm/tools/gridregression.py", line 268, in _put
self.queue.insert(0,item)
AttributeError: 'collections.deque' object has no attribute 'insert
[解析] 很顯然,你調用的是gridregression.py,其是用來作迴歸用的。若是你調用easy.py也出現這種問題按照原做者的說法,這裏是由於你的python調用出現錯誤,極可能是版本不對,若是是2.4的版本,請把easy.py中的
self.queue.insert(0,item)
改爲 if sys.hexversion >= 0x020400A1: self.queue.appendleft(item) else self.queue.insert(0,item)