LibSVM学习(六)——easy.py和grid.py的使用(转)
我們在“LibSVM學習(一)”中,講到libSVM有一個tools文件夾,里面包含有四個python文件,是用來對參數(shù)優(yōu)選的。其中,常用到的是easy.py和grid.py兩個文件。其實,網(wǎng)上也有相應的說明,但很不系統(tǒng),下面結(jié)合本人的經(jīng)驗,對使用方法做個說明。
?????? 這兩個文件都要用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,操作系統(tǒng)是WINXP。
?
1. grid.py使用方法
?? 文件grid.py是對C-SVC的參數(shù)c和γ做優(yōu)選的,原理也是網(wǎng)格遍歷,假設我們要對目錄d:/libsvm/program/tools下的樣本文件heart_scale做優(yōu)選,其具體用法為:
??????
?????? 第一步:打開d:/libsvm/program下的tools文件夾,找到grid.py文件。用python打開(不能雙擊,而要右鍵選擇“Edit with IDLE”),修改svmtrain_exe和gnuplot_exe的路徑。
????????????????????????????? svmtrain_exe = r"D:/libSVM/program/svm-train.exe"
????????????????????????????? gnuplot_exe = r"D:/libSVM/gnuplot/pgnuplot.exe"
?????? (這里面有一個是對非win32的,可以不用改,只改# example for windows下的就可以了)
????? 第二步:運行cmd,進入dos環(huán)境,定位到d:/libsvm/program/tools文件夾,這里是放置grid.py的地方。怎么定位可以參看第一節(jié)。
????? 第三步:輸入以下命令:
????????????????????????????????????????? d:/libsvm/python26/python grid.py heart_scale
?????? 你就會看到dos窗口中飛速亂串的[local]數(shù)據(jù),以及一個gnuplot的動態(tài)繪圖窗口。大約過10秒鐘,就會停止。Dos窗口中的[local]數(shù)據(jù)時局部最優(yōu)值,這個不用管,直接看最后一行:
????????????????????????????????????????? 2048.0 0.0001220703125 84.0741
?????? 其意義表示:C = 2048.0;γ=0.0001220703125(γ是哪個參數(shù)?參看LibSVM學習(三)中svmtrain的參數(shù)說明);交叉驗證精度CV Rate = 84.0741%,這就是最優(yōu)結(jié)果。
????? 第四步:打開目錄d:/libsvm/program/tools,我們可以看到新生成了兩個文件:heart_scale.out和heart_scale.png,第一個文件就是搜索過程中的[local]和最優(yōu)數(shù)據(jù),第二文件就是gnuplot圖像。
?
?????? 現(xiàn)在,grid.py已經(jīng)運行完了,你可以把最優(yōu)參數(shù)輸入到svmtrain中進行訓練了。當然了,你在當中某一步很可能出現(xiàn)問題,不過不要緊,我也不是一下子成功的,摸索了半天才成功。下面就需要注意的問題說明一下:
??????? 1)grid.py和svm-train的版本要統(tǒng)一,也就是說你不能用2.6的grid.py去調(diào)用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 目標文件樣本文件,其原則是要讓系統(tǒng)找得到文件。假如系統(tǒng)提示你“不是內(nèi)部或外部命令”,說明你python的路徑錯誤,而如果是‘not found file’的提示,很可能是其他兩個文件路徑錯誤。
??????? 4)假如,你仍舊出現(xiàn)問題,那么請換一下python或者gnuplot的版本,目前python最新版本是3.1,但是好像會出問題,老一點的版本2.4或2.5的兼容性會更好。
?
?
2. easy.py使用方法
?
?
??? 文件easy.py對樣本文件做了“一條龍服務”,從參數(shù)優(yōu)選,到文件預測。因此,其對grid.py、svm-train、svm-scale和svm-predict都進行了調(diào)用(當然還有必須的python和gnuplot)。因此,運行easy.py需要保證這些文件的路徑都要正確。當然還需要樣本文件和預測文件,這里樣本文件還是用heart_scale,預測文件我們復制一份然后改名heart_test,下面說一下使用方法:
??? 第一步:打開easy.py,修改# example for windows下的幾個路徑:?
?
?? 第二步:運行cmd,進入dos環(huán)境,定位到放置easy.py的目錄d:/libsvm/program/tools。
?? 第三步:輸入命令:
??????????????????? d:/libsvm/python26/python easy.py heart_scale heat_test
?????????? 你就會看到一個gnuplot的動態(tài)繪圖窗口。大約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
??? 這就是最終預測結(jié)果,可以看到第三行就是調(diào)用grid.py的結(jié)果。在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運行出現(xiàn)錯誤,你可以參照第一部分“grid.py使用方法”運行一下就會發(fā)現(xiàn)問題。另外,有的說是相對路徑的問題,建議找到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在調(diào)用過程中出現(xiàn)問題,要么是你的路徑不對,要么是你的版本不對,請檢查。
?
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
?????? [解析] 很顯然,你調(diào)用的是gridregression.py,其是用來做回歸用的。如果你調(diào)用easy.py也出現(xiàn)這種問題按照原作者的說法,這里是因為你的python調(diào)用出現(xiàn)錯誤,很可能是版本不對,如果是2.4的版本,請把easy.py中的
????? self.queue.insert(0,item)
改成
????? if sys.hexversion >= 0x020400A1:
????????????? self.queue.appendleft(item)
?????? else
????????????? self.queue.insert(0,item)
總結(jié)
以上是生活随笔為你收集整理的LibSVM学习(六)——easy.py和grid.py的使用(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用LIBSVM做回归和预测
- 下一篇: 用LIBSVM做回归和预测的步骤