LibSVM學習(六)——easy.py和grid.py的使用

  咱們在「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/gnuplotlibsvm放在了d:/libsvm/program中(這時easy.pygrid.py文件的目錄爲d:/libsvm/program/tools)。另外,須要注意的是版本,個人是python 2.6gnuplot 4.2 libsvm 2.89,操做系統是WINXPweb

 

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_exegnuplot_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.outheart_scale.png,第一個文件就是搜索過程當中的[local]和最優數據,第二文件就是gnuplot圖像。

 

       如今,grid.py已經運行完了,你能夠把最優參數輸入到svmtrain中進行訓練了。固然了,你在當中某一步極可能出現問題,不過沒關係,我也不是一會兒成功的,摸索了半天才成功。下面就須要注意的問題說明一下:

        1grid.pysvm-train的版本要統一,也就是說你不能用2.6grid.py去調用2.89svm-train

        2)你的目錄中若是有空格,好比d:/program files/ libsvm/...,那麼不管是在第一步仍是第二步,請把目錄改爲d:/progra~1/ libsvm/...

        3) 第三步的命令問題。首先要看你定位到哪一個目錄,那麼其下的文件就不須要帶路徑,不然就要帶。像咱們上面的命令,我當前的目錄是d:/libsvm/program/tools,那麼其下的easy.pyheart_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.42.5的兼容性會更好。

 

 

2. easy.py使用方法

 

 

    文件easy.py對樣本文件作了「一條龍服務」,從參數優選,到文件預測。所以,其對grid.pysvm-trainsvm-scalesvm-predict都進行了調用(固然還有必須的pythongnuplot)。所以,運行easy.py須要保證這些文件的路徑都要正確。固然還須要樣本文件和預測文件,這裏樣本文件仍是用heart_scale,預測文件咱們複製一份而後更名heart_test,下面說一下使用方法:

 

    第一步:打開easy.py,修改# example for windows下的幾個路徑:  

6.1

   第二步:運行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)

相關文章
相關標籤/搜索