1. 程式人生 > >LibSVM學習(六)——easy.py和grid.py的使用

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

     我們在“LibSVM學習(一)”中,講到libSVM有一個tools資料夾,裡面包含有四個python檔案,是用來對引數優選的。其中,常用到的是easy.py和grid.py兩個檔案。其實,網上也有相應的說明,但很不繫統,下面結合本人的經驗,對使用方法做個說明。

       這兩個檔案都要用python(可以在上下載到,需要安裝)和繪圖工具gnuplot可以在上下載,不需要安裝)。假設python安裝在d:/libsvm/tools/python26下,而gnuplot解壓到d:/libsvm/tools/gnuplotlibsvm放在了d:/libsvm/program中(這時easy.py和grid.py檔案的目錄為d:/libsvm/program/tools)。另外,需要注意的是版本,我的是

python 2.6、gnuplot 4.2 libsvm 2.89,作業系統是WINXP

1. grid.py使用方法

 檔案grid.py是對C-SVC的引數c和γ做優選的,原理也是網格遍歷,假設我們要對目錄d:/libsvm/program/tools下的樣本檔案heart_scale做優選,其具體用法為:

       第一步:開啟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環境,定位到d:/libsvm/program/tools資料夾,這裡是放置grid.py的地方。怎麼定位可以參看第一節。

      第三步:輸入以下命令:

                                          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.42.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下的幾個路徑:  

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)