您的位置:首页 > 其它

svm理论与实验之16: libsvm工具包

2013-10-12 22:16 363 查看
徐海蛟博士 Teaching.

libSVM有一个tools文件夹,里面包含有四个python文件,是用来对参数优选的。其中,常用到的是easy.py和grid.py两个文件。这里,我们以Python 2.7环境为例,加以说明。

需要安装python 2.7和绘图工具gnuplot 4.6(让数据可视化)。并将<python安装目录>添加于%PATH%环境变量。

pythone是一种编程语言,就像Java、C/C++、Matlab等。gnuplot是一套跨平台的数学绘图自由软件。可以绘制图形。它不是统计软件,也不是数学软件,它纯粹只是一套函数/数据绘图软件。

1. grid.py使用方法
文件grid.py是对C-SVC的参数c和γ做优选的,原理也是网格遍历,假设我们要对样本文件heart_scale做优选,其具体用法为:

第一步:打开<libsvm>\tools\文件夹,修改grid.py文件。修改gnuplot_exe的路径:

self.gnuplot_pathname = r"...安装目录.../gnuplot/pgnuplot.exe"

这里,有一个是对非win32的(Unix/linux),不用改,只改# example for windows下的就可以了。

第二步:运行cmd,进入dos命令行环境,定位到<libsvm>\tools\文件夹,这里是放置grid.py的地方。
cd <libsvm>\tools\
dir

第三步:输入以下命令:
python grid.py heart_scale
训练数据文件是:heart_scale, 270个样本数据。

这是grid.py最简单的用法格式。grid.py的用法是:
grid.py [grid_options] [svm_options] dataset

如:python grid.py -svmtrain pathname -gnuplot pathname -out pathname heart_scale

好了。你就会看到dos窗口中飞速乱串的[local]数据,以及一个gnuplot的动态绘图窗口。大约过10秒钟,就会停止。Dos窗口中的[local]数据时局部最优值,这个不用管,直接看最后一行:

2048.0 0.0001220703125 84.0741

其意义表示:C = 2048.0;γ=0.0001220703125(γ是核函数中参数γ,默认为1/k);交叉验证精度CV Rate = 84.0741%,这就是最优结果。

第四步:打开目录tools/,我们可以看到新生成了两个文件:heart_scale.out和heart_scale.png,第一个文件就是搜索过程中的[local]和最优数据,第二文件就是gnuplot图像。

现在,grid.py已经运行完了,你可以把最优参数输入到svm-train中进行训练了:
svm-train -c 2048.0 -g 0.0001220703125 ../heart_scale

测试下:
svm-predict heart_scale_test heart.model heart.result
精度多少?

当然了,你在当中某一步很可能出现问题,不过不要紧,我也不是一下子成功的,摸索了半天才成功。下面就需要注意的问题说明一下:

1)版本要统一,我的版本:python 2.7, 绘图工具gnuplot 4.6, libsvm 3.17。

2)目录名如果有空格,比如d:/xhj lab/libsvm/...,那么加上引号
'd:/xhj lab/libsvm/...'

3) 定位目录,那么其下的文件就不需要带路径,否则就要带全路径:
python d:/.../libsvm/tools/grid.py d:/.../libsvm/heart_scale

总起来说,命令为:
python 目标文件 样本文件

其原则是要让系统找得到文件。假如系统提示你“不是内部或外部命令”,说明你python的路径错误,而如果是‘not found file’的提示,很可能是其他两个文件路径错误。

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下的gnuplot_exe的路径:

self.gnuplot_pathname = r"...安装目录.../gnuplot/pgnuplot.exe"

第二步:运行cmd,进入dos环境,定位到放置easy.py的目录

第三步:输入命令:

python easy.py heart_scale heat_test

你就会看到一个gnuplot的动态绘图窗口。大约20s停止,dos窗口显示:

Scaling training data...
Cross validation...
Best c=0.5, g=0.125 CV rate=97.5155
Training...
Output model: heart_scale.model
Scaling testing data...
Testing...
Accuracy = 89.7436% (35/39) (classification)
Output prediction: heart_test.predict

这就是最终预测结果,可以看到第三行就是调用grid.py的结果。在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运行出现错误,你可以参照第1部分“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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: