论文信誉排行网 论文信誉排行网 设为首页
联系我们
收藏本站
 官方首页
 投稿指南
 写作指导
 职称评审
 文献检索
 期刊科普知识
 非法期刊
 学术不端
期刊分类解释 期刊刊号的解释 医学期刊分类表 核心期刊 期刊查询 (2014-2015)CSSCI来源期刊目录 2008医学核心期刊 政策法规
CSSCI CSCD SSCI 《工程索引》(EI) SCI(科学引文索引) 参考文献格式国家标准 2014中文核心期刊目录 论文信誉排行
 当前位置:首页 > 写作指导 > 浏览正文
[转载]libsvm参数寻优及其他
作者: 佚名     来源: 本站原创     时间:2014年05月27

Tags:论文信誉排行网
 1.首先从主页上下载libsvm、Python2.5.2和gnuplot 三个软件。

http://www.csie.ntu.edu.tw/~cjlin/

 

 

2.准备好数据,首先要把数据转换成Libsvm软件包要求的数据格式为:

label index1:value1 index2:value2 ...

其中对于分类来说label为类标识,指定数据的种类;对于回归来说label为目标值。(我主要要用到回归)

Index是从1开始的自然数,value是每一维的特征值。该过程可以自己使用excel或者编写程序来完成,也可以使用网络上的FormatDataLibsvm.xls来完成。

FormatDataLibsvm.xls使用说明:

先将数据按照下列格式存放(注意label放最后面):

value1 value2 „„ label

value1 value2 „„ label

„„

然后将以上数据粘贴到FormatDataLibsvm.xls中的最左上角单元格,接着工具->宏执行行FormatDataToLibsvm宏。就可以得到libsvm要求的数据格式。将该数据存放到文本文件中进行下一步的处理。

3.对数据进行归一化。

 

该过程要用到libsvm软件包中的svm-scale.exe

Svm-scale用法:

用法:svmscale [-l lower] [-u upper] [-y y_lower y_upper] [-s save_filename] [-r restore_filename] filename (缺省值: lower = -1,upper = 1,没有对y进行缩放) 其中, -l:数据下限标记;lower:缩放后数据下限; -u:数据上限标记;upper:缩放后数据上限; -y:是否对目标值同时进行缩放;y_lower为下限值,y_upper为上限值;(回归需要对目标进行缩放,因此该参数可以设定为 –y -1 1 ) -s save_filename:表示将缩放的规则保存为文件save_filename; -r restore_filename:表示将缩放规则文件restore_filename载入后按此缩放; filename:待缩放的数据文件(要求满足前面所述的格式)。

缩放规则文件可以用文本浏览器打开,看到其格式为:y

lower upper min max x

lower upper

index1 min1 max1

index2 min2 max2

„„ 其中的lower 与upper 与使用时所设置的lower 与upper 含义相同;index 表 示特征序号;min 转换前该特征的最小值;max 转换前该特征的最大值。数据集的缩放结果在此情况下通过DOS窗口输出,当然也可以通过DOS的文件重定向符号“>”将结果另存为指定的文件。该文件中的参数可用于最后面对目标值的反归一化。反归一化的公式为:

(Value-lower)*(max-min)/(upper - lower)+lower

其中value为归一化后的值,其他参数与前面介绍的相同。

建议将训练数据集与测试数据集放在同一个文本文件中一起归一化,然后再将归一化结果分成训练集和测试集。

4.训练数据,生成模型。用法: svmtrain [options] training_set_file [model_file]

其中, options(操作参数):可用的选项即表示的涵义如下所示 -s svm类型:设置SVM 类型,默认值为0,可选类型有(对于回归只能选3或4):

0 -- C- SVC 1 -- n - SVC 2 -- one-class-SVM 3 -- e - SVR 4 -- n - SVR -t 核函数类型:设置核函数类型,默认值为2,可选类型有: 0 -- 线性核:u'*v 1 -- 多项式核: (g*u'*v+ coef 0)deg ree 2 -- RBF 核:e( u v 2) g - 3 -- sigmoid 核:tanh(g*u'*v+ coef 0) -d degree:核函数中的degree设置,默认值为3;

-g g :设置核函数中的g ,默认值为1/ k ; -r coef 0:设置核函数中的coef 0,默认值为0; -c cost:设置C- SVC、e - SVR、n - SVR中从惩罚系数C,默认值为1; -n n :设置n - SVC、one-class-SVM 与n - SVR 中参数n ,默认值0.5; -p e :设置n - SVR的损失函数中的e ,默认值为0.1; -m cachesize:设置cache内存大小,以MB为单位,默认值为40; -e e :设置终止准则中的可容忍偏差,默认值为0.001; -h shrinking:是否使用启发式,可选值为0 或1,默认值为1; -b 概率估计:是否计算SVC或SVR的概率估计,可选值0 或1,默认0; -wi weight:对各类样本的惩罚系数C加权,默认值为1; -v n:n折交叉验证模式。

其中-g选项中的k是指输入数据中的属性数。操作参数 -v 随机地将数据剖分为n 部分并计算交叉检验准确度和均方根误差。以上这些参数设置可以按照SVM 的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM 类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。training_set_file是要进行训练的数据集;model_file是训练结束后产生的模型文件,该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名。

本实验中的参数-s取3,-t取2(默认)还需确定的参数是-c,-g,-p另, 实验中所需调整的重要参数是-c 和 –g,-c和-g的调整除了自己根据经验试之外,还可以使用gridregression.py对这两个参数进行优化。(需要补充)

该优化过程需要用到Python(2.5),Gnuplot(4.2),gridregression.py(该文件需要修改路径)。

然后在命令行下面运行:

python.exe gridregression.py -log2c -10,10,1 -log2g -10,10,1 -log2p -10,10,1 -s 3 –t 2 -v 5 -svmtrain E:\libsvm\libsvm-2.86\windows\svm-train.exe -gnuplot E:\libsvm\libsvm-2.86\gnuplot\bin\pgnuplot.exe E:\libsvm\libsvm-2.86\windows\train.txt > gridregression_feature.parameter

以上三个路径根据实际安装情况进行修改。

-log2c是给出参数c的范围和步长 -log2g是给出参数g的范围和步长 -log2p是给出参数p的范围和步长上面三个参数可以用默认范围和步长 -s选择SVM类型,也是只能选3或者4 -t是选择核函数 -v 10 将训练数据分成10份做交叉验证。默认为5

为了方便将gridregression.py是存放在python.exe安装目录下

trian.txt为训练数据,参数存放在gridregression_feature.parameter中,可以自己命名。搜索结束后可以在gridregression_feature.parameter中最后一行看到最优参数。

其中,最后一行的第一个参数即为-c,第二个为-g,第三个为-p,最后一个参数为均方误差。前三个参数可以直接用于模型的训练。然后,根据搜索得到的参数,重新训练,得到模型。

 

5.测试

 

用法:svmpredict [options] test_file model_file output_file options(操作参数): -b probability_estimates:是否需要进行概率估计预测,可选值为0 或者1,默认值为0。 model_file 是由svmtrain 产生的模型文件;

test_file 是要进行预测的数据文件;

output_file 是svmpredict 的输出文件,表示预测的结果值。

输出结果包括均方误差(Mean squared error)和相关系数(Squared correlation coefficient)。

╰㊣Lonely '

svmtrain

训练数据. 跑SVM被戏称为 "开火車" 也是由于这个程序名而来. train会接受特定格式的输入, 产生一个 "Model" 文件. 这个 model 你可以想像成SVM的內部数据,因为预测要model才能预测, 不能直接吃原始数据.想想也很合理,假定 train 本身是很耗时的动作, 而 train可以以某种形式存起內部数据,那下次要预测时直接把那些內部数据载入就快多了.

svmpredict

依照已经训练好的 model, 再加上给定的输入(新值), 输出預测新值所对应的类別.

svmscale

扫描数据. 因为原始数据可能范围过大或过小, svmscale 可以先将数据重新 scale (縮放) 到适当范围使训练与预测速度更快。

文件格式

文件格式要先交代一下. 你可以参考 libsvm 里面附的 "heart_scale": 这是SVM 的输入文件格式.

[label] [index1]:[value1] [index2]:[value2] ...

[label] [index1]:[value1] [index2]:[value2] ...

一行一条记录数据,如:

+1 1:0.708 2:1 3:1 4:-0.320 5:-0.105 6:-1

label

或说是class, 就是你要分类的种类,通常是一些整数。

index

是有順序的索引,通常是连续的整数。

value

就是用来 train 的数据,通常是一堆实数。

每一行都是如上的結构, 意思就是: 我有一排数据, 分別是 value1, value2, .... value, (而且它们的順序已由 index 分別指定),这排数据的分类結果就是label。

或許你会不太懂,为什么会是 value1,value2,.... 这样一排呢? 这牵涉到 SVM 的原理。 你可以这样想(我沒说这是正确的), 它的名字就叫 Support "Vector" Machine, 所以输入的训练数据是 "Vector"(向量), 也就是一排的 x1, x2, x3, ... 这些值就是 value,而 x[n] 的n就是由index 指定。 这些东西又称为 "(属性)attribute"。

真实的情况是,大部份时候我们给定的数据可能有很多 "特征(feature)" 或说 "属性(attribute)",所以输入会是一组的。 举例来说,以前面点分区的例子 来说,我们不是每个点都有 X 跟 Y 的坐标吗? 所以它就有两种属性。 假定我有两个点: (0,3) 跟 (5,8) 分別在 label(class) 1 跟 2 ,那就会写成

1 1:0 2:3

2 1:5 2:8

同理,空间中的三維坐标就等于有三组属性。这种文件格式最大的好处就是可以使用稀疏矩阵(sparse matrix), 或说有些 数据的属性可以有缺失。

svmtrain

svmtrain 的语法大致就是:

svmtrain [options] training_set_file [model_file]

training_set_file 就是之前的格式,而 model_file 如果不给就会 叫 [training_set_file].model。 options 可以先不要给。

下列程序执行結果会产生 heart_scale.model 文件:(螢幕输出不是很重要,沒有错誤就好了)

./svmtrain heart_scale

optimization finished, #iter = 219

nu = 0.431030

obj = -100.877286, rho = 0.424632

nSV = 132, nBSV = 107

Total nSV = 132

svmpredict

svmpredict 的语法是 :

svmpredict test_file model_file output_file

test_file 就是我们要预测的数据。它的格式跟 svmtrain 的输入,也就是 training_set_file 是一样的, 不过每行最前面的 label 可以省略 (因为预测就是要预测那个 label)。 但如果 test_file 有 label 的值的话, predict 完会順便拿 predict 出来的值跟 test_file 里面写的值去做比对,这代表: test_file 写的label是真正的分类結果,拿来跟我们预测的結果比对就可以知道预测的效果。所以,我们可以拿原 training set 当做 test_file再丟给 svmpredict 去预测(因为格式一样),看看正确率有多高,方便后面调参数。其它参数就很好理解了: model_file就是 svmtrain 出来的文件, output_file是存输出結果的文件案。 输出的格式很简单,每行一个 label,对应到你的 test_file 里面的各行。下列程序执行結果会产生 heart_scale.out:

./svm-predict heart_scale heart_scale.model heart_scale.out

Accuracy = 86.6667% (234/270) (classification)

Mean squared error = 0.533333 (regression)

Squared correlation coefficient = 0.532639(regression)

我们把原输入丟回去 predict, 第一行的 Accuracy 就是預测的正确率了。如果输入沒有label 的话,那就是真的预测了。看到这里,基本上你应该已经可以利用 svm 来作事了: 你只要写程序输出正确格式的数据,交给 svm 去 train, 后来再 predict 并读入結果即可。

 

Scaling

svm-scale 目前不太好用,不过它有其必要性。因为适当的扫描有助于参数的选择,还有解svm的速度。svmscale 会对每个属性做扫描。 范围用 -l, -u 指定,通常是[0,1]或是[-1,1]。 输出在 stdout。另外要注意的(常常会忘记)是 testing data 和 training data要一起扫描。而 svm-scale 最难用的地方就是沒办法指定 testing data/training data(不同文件) 然后一起扫描。

Arguments

前面提到,在train的时候可以使用一些参数。(直接执行 svm-train 不指定输入文件与参数会列出所有参数及语法说明) 这些参数对应到原始 SVM 公式的一些参数,所以会影响预测的正确与否。

举例来说,改个 c=10:

./svm-train -c 10 heart_scale

再来预测 ,正确率馬上变成 92.2% (249/270)。

╰㊣Lonely '

Cross Validation

一般而言, SVM 使用的方式(在决定参数时)常是这样:

1. 先有已分好类的一堆数据

2. 随机拆成好几组训练集

用某组参数去训练并预测別组,看正确率 正确率不够的话,换参数再重复训练/预测 [/li][/ol]等找到一组不错的参数后,就拿这组参数来建model并用来做最后对未知数据的预测。 这整个过程叫cross validation , 也就是交叉比对。 在我们找参数的过程中,可以利用 svmtrain 的內建交叉比对功能来帮忙:

-v n: n-fold cross validation

n 就是要拆成几组,像 n=3 就会拆成三组,然后先拿 1跟2来训练并预测 3 以得到正确率; 再来拿 2跟 3 训练并预测1,最后 1,3 训练并预测2。其它以此类推。如果沒有交叉比对的话,很容易找到只在特定输入时好的参数。像前面我们 c=10 得到 92.2%,不过拿 -v 5 来看看:

./svm-train -v 5 -c 10 heart_scale

Cross Validation Accuracy = 80.3704%

平均之后才只有 80.37%,比一开始的 86 还差。

What arguments rules?

通常而言,比较重要的参数是 gamma (-g) 跟 cost (-c) 。而交叉比对 (-v) 的参数常用 5。cost 預设值是 1, gamma 預设值是 1/k ,k 等于输入数据条数。 那我们怎么知道要用多少来当参数呢?

TRY就是尝试找比较好的参数值。 Try 参数的过程是用指数增长的方式来增加与減少参数的数值,也就是 2^n (2 的 n 次方)。因为有两组参数,所以等于要尝试 n*n=n^2 次。 这个过程是不连续的成长,所以可以想象成我们在一个 X-Y 平面上指定的范围內找一群格子点 (grid,如果你不太明白,想成方格紙或我们把平面上所有整数交点都打个点,就是那样),每个格子点的 X 跟 Y 经过换算 (如 2^x, 2^y) 就拿去当 cost 跟 gamma 的值来交叉比对。所以現在你应该懂得 libsvm 的 python 子目录下面有个 grid.py 是做啥的了: 它把上面的过程自动化, 在你给定的范围內呼叫svm-train去尝试所有的参数值。grid.py 还会把結果绘制出来,方便你尋找参数。 libsvm 有很多跟 python 結合的部份,由此可見 python 是強大方便的工具。很多神奇的功能,像自动登入多台机器去平行跑 grid等等都是python帮忙的。不过 SVM 本身可以完全不需要python,只是会比较方便。跑 grid (基本上用 grid.py 跑当然是最方便,不过如果你不懂python而且觉得很难搞,那你要自己产生参数来跑也是可以的)通常好的范围是 [c,g]=[2^-10,2^10]*[2^-10,2^10]另外其实 grid 用 [-8,8] 也很够了。

Regression(衰减)

另一个值得一提的是regression(衰减)。 简单来说,前面都是拿 SVM 来做分类,所以label的值都是离散的数据、或说已知的固定值。而 regression 则是求连续的值、或说未知的值。你也可以说,一般是二分类问题, 而 regression是可以預测一个实数。

比如说我知道股市指数受到某些因素影响, 然后我想預测股市。股市的指数就是我们的 label, 那些因素量化以后变成属性。 以后收集那些属性给 SVM 它就会 預测出指数(可能是沒出現过的数字),这就要用 regression。那对于开奖的号码呢?因为都是固定已知的数字,很明显我们应该用一般SVM的分类来预测 。 (註这是真实的例子 --llwang就写过这样的东西) 所以说 label 也要扫描, 用 svm-scale -y lower upper但是比较糟糕的情况是grid.py不支持regression,而且较差对比对 regression 也常常不是很有效。

╰㊣Lonely '

libsvm及其与python的接口

 

由于课程和课题的原因,这两天试用了一下国立台湾大学Chih-Chung Chang和Chih-Jen Lin编写的libsvm函数库,发现的确是一款写得很不错的软件,而且上手也比较容易,用了一个晚上的时间基本搞定了libsvm的基本用法以及它和python的接口,以下的内容均基于win32系统,尚未在Linux下尝试过。

 

首先我们需要下载libsvm,最新版是11月17日刚推出的libsvm2.83,可以在libsvm的主页http://www.csie.ntu.edu.tw/~cjlin/libsvm/上下载得到,建议同时下载一个libsvm的初学者guide,写得很不错,浅显易懂,适合初学者使用,基本的使用只需要libsvm这一个软件即可,但如果需要使用它自带的python脚本的话,还需要安装python,最新版是2.5,可以在python的主页http://www.python.org上下载。另外,libsvm自带的两个脚本grid.py和easy.py中均用到了绘图工具gnuplot,因此还需要下载一个gnuplot软件,下载地址:[url=ftp://ftp.gnuplot.info/pub/gnuplot/]ftp://ftp.gnuplot.info/pub/gnuplot/[/url],注意要下载win32版本的,比如win32的4.0版本对应的文件应为gp400win32.zip。

 

 

下载完成后,接下来就是安装。其中只有python2.5需要安装(一般默认安装到c:\python25下),将libsvm解压到c:\libsvm下,将gnuplot解压到c:\gnuplot下。将c:\python25,c:\libsvm\windows,c:\gnuplot\bin三个文件夹添加到系统路径里面,方便日后使用。

 

安装完毕后,进入c:\libsvm\tools目录下,用文本编辑器(记事本,edit都可以)修改grid.py和easy.py两个文件,找到其中关于gnuplot路径的那项,根据实际路径进行修改,并保存。然后我们可以下载guide文章里提到的那三个数据集作为实验数据集,也将其放在tools目录下,在libsvm\tools下执行以下命令检验效果:

 

python easy.py train.1 test.1

 

如果弹出了gnuplot的窗口并可以看到动态的绘制图形的过程,那么恭喜你,实验成功!最后输出的结果应该和guide文章里提到的结果类似(当然c和g的值有可能并不和文章里的相同,但最后在测试集上的错误率应该相差不大)。执行的过程中可能防病毒软件会弹出提示说rootshell之类的警告,不必理会。

 

接下来我们研究一下libsvm和python的接口的问题,这个问题我自己也困扰了很久。首先,按照libsvm\python目录下的readme文件所说,在win32环境下,我们要编译得到svmc.dll这个文件(细心的人会发现,libsvm已经在\libsvm\windows\python目录下自带了这个文件,但它可能是为其它的python版本编译的,为保险起见,我们尝试重新编译它),在libsvm目录下键入如下命令(以vs.net2003为例,其它版本的c++编译器可能需要略微修改):

 

 

vcvars32

 

这个文件在C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\下,请确保这个路径在你的系统路径里面。此命令设置了VC++的环境变量。

 

键入以下命令:

 

nmake -f Makefile.win python

 

并将生成的libsvm\windows\python\svmc.dll文件复制到libsvm\python目录下,并改名svmc.pyd(非常重要!)。

在libsvm\python目录下键入以下命令以检验效果:

 

python svm_test.py

 

如果能看到程序执行结果,说明libsvm和python之间的接口已经配置完成,以后就可以直接在python程序里调用libsvm的函数了!

 

转自:http://yaowt.spaces.live.com/blog/cns!7280d7d3cc41a4ab!564.entry

╰㊣Lonely '

Libsvm软件的使用

软件安装:

1.解压缩libsvm-2.8.zip

2.安装Python(双击“python-2.4.2.msi”开始安装)

3.编辑.\libsvm-2.8\tools\grid.py

用UltraEdit打开,修改svmtrain_exe的路径

eg:

修改前:

 

修改后:

训练与测试:

\windows目录下有四个.exe文件,其中

svmscale.exe——用于输入数据的尺度化(Scaling)

svmtrain.exe——用于样本训练

svmpredict.exe——用于样本测试 Scaling一般在自己的程序里头直接处理,常用的是svmtrain和svmpredict。svmtrain和svmpredict都在命令行方式下运行。 Usage:svmtrain [options] training_set_file [model_file]

options:

-s svm_type:set type of SVM (default 0)

0 -- C-SVC

1 -- nu-SVC

2 -- one-class SVM

3 -- epsilon-SVR

4 -- nu-SVR

-t kernel_type:set type of kernel function (default 2)

0 – linear:u'*v

1 – polynomial:(gamma*u'*v + coef0)^degree

2 -- radial basis function:exp(-gamma*|u-v|^2)

3 – sigmoid:tanh(gamma*u'*v + coef0)

-d degree:set degree in kernel function (default 3)

-g gamma:set gamma in kernel function (default 1/k)

-r coef0:set coef0 in kernel function (default 0)

-c cost:set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)

-n nu:set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5)

-p epsilon:set the epsilon in loss function of epsilon-SVR (default 0.1)

-m cachesize:set cache memory size in MB (default 40)

-e epsilon:set tolerance of termination criterion (default 0.001)

-h shrinking:whether to use the shrinking heuristics, 0 or 1 (default 1)

-b probability_estimates:whether to train an SVC or SVR model for probability estimates, 0 or 1 (default 0)

-wi weight:set the parameter C of class i to weight*C in C-SVC (default 1)

-v n:n-fold cross validation mode 常用的是C-SVC(RBF kernel function) 比较常用的几个参数:

-c// 惩罚因子

 

-g// 核函数参数

-v// n-fold Cross Validation

-wi// 分别设置两类样本的惩罚因子

 

此例中,设置正例样本(分类结果是+1)惩罚因子为5*20=100,负例样本惩罚因子为1*20=20。样本训练完,得到一个模型文件(hs.model)。 Usage:svm-predict [options] test_file model_file output_file

options:

-b probability_estimates:whether to predict probability estimates, 0 or 1 (default 0); one-class SVM not supported yet

此例中,待检验样本(heart_scale)根据已建立的模型(hs.model)产生一个输出(hs.out)。 libsvm使用的数据格式:

该软件使用的训练数据和检验数据文件格式如下:

<label> <index1>:<value1> <index2>:<value2> ...

其中<label>是训练数据集的目标值,对于分类,它是标识某类的整数(支持多个类)。<index>是以1开始的整数,可以是不连续的;<value>为实数,也就是我们常说的自变量。检验数据文件中的label只用于计算准确度或误差,如果它是未知的,只需用一个数填写这一栏,也可以空着不填。在程序包中,包括有一个训练数据实例:heart_scale,方便参考数据文件格式以及练习使用软件。 grid.py的使用:

利用log2c、log2g的組合值來找參數 比较常用的几个参数:

-v// 指定cross validation的方式,预设是5。

-log2c// C的值:[起始值,终止值,步长]

-log2g// g的值

╰㊣Lonely '

Main features of LIBSVM include:

 

[ul]

[li]Different SVM formulations

 

[li]Efficient multi-class classification

 

[li]Cross validation for model selection

 

[li]Probability estimates

 

[li]Weighted SVM for unbalanced data

 

[li]Both C++ and Java sources

 

[li]GUI demonstrating SVM classification and regression

 

[li]Python, R (also Splus), MATLAB, Perl, Ruby, Weka, CLISP and LabVIEW interfaces. C# .NET code is available.

It's also included in some learning environments: YALE and PCP.

 

[li]Automatic model selection which can generate contour of cross valiation accuracy.

 

[/li][/ul]

╰㊣Lonely '

使用Libsvm一个报错信息该如何处理?

Microsoft Windows XP [版本 5.1.2600]

(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\Administrator>cd /d c:\python25

C:\Python25>python E:\libsvm\python\easy.py E:\libsvm\python\heart_scale //命令

Scaling training data... ----------------------------------运行信息

Cross validation...

Traceback (most recent call last):

File "E:\libsvm\python\easy.py", line 62, in <module>

c,g,rate = map(float,last_line.split())

ValueError: need more than 0 values to unpack

 

C:\Python25>python E:\libsvm\python\easy.py E:\libsvm\python\train.txt E:\libsvm\python\test.txt //命令

Scaling training data... ----------------------------------运行信息

 

Cross validation...

Traceback (most recent call last):

File "E:\libsvm\python\easy.py", line 61, in <module>

c,g,rate = map(float,last_line.split())

ValueError: need more than 0 values to unpack

C:\Python25>

 

 

 

目前我对于该问题是将.py的文件要修改打开方式为都是用Python,而不能用word或者pad这类的打开

╰㊣Lonely '

用LIBSVM做回归和预测的步骤

 

首先说明,我学习SVM才几天,对基本理论还不了解,只是想利用这一工具做自己想做的事情。摸索着做了几个实验,试着把过程写下来,请大家指点。

<1> 下载Libsvm、Python和Gnuplot。我用的版本分别是:Libsvm(2.8.1),Python(2.4),Gnuplot(3.7.3)。注意:Gnuplot一定要用3.7.3版,3.7.1版的有bug.

 

<2> 修改训练和测试数据的格式(可以自己用perl编个小程序):

目标值 第一维特征编号:第一维特征值 第二维特征编号:第二维特征值 ...

...

例如:

2.3 1:5.6 2:3.2

表示训练用的特征有两维,第一维是5.6,第二维是3.2,目标值是2.3

 

注意:训练和测试数据的格式必须相同,都如上所示。测试数据中的目标值是为了计算误差用

 

<3> 分别使用Libsvm中的Windows版本的工具svmscale.exe进行训练和测试数据的归一化,svmtrain.exe进行模型训练,svmpredict.exe进行预测

(1)svmscale.exe的用法:svmscale.exe feature.txt feature.scaled

默认的归一化范围是[-1,1],可以用参数-l和-u分别调整上界和下届,feature.txt是输入特征文件名

输出的归一化特征名为feature.scaled

(2)svmtrtrain.exe训练模型

我习惯写个批处理小程序,处理起来比较方便。例如svm_train.bat中训练语句为:

svmtrain.exe -s 3 -p 0.0001 -t 2 -g 32 -c 0.53125 -n 0.99 feature.scaled

训练得到的模型为feature.scaled.model

 

具体的参数含义可以参考帮助文档。这里-s是选择SVM的类型。对于回归来说,只能选3或者4,3表示epsilon-support vector regression, 4表示nu-support vector regression。-t是选择核函数,通常选用RBF核函数,原因在“A Practical Guide support vector classification”中已经简单介绍过了。-p尽量选个比较小的数字。需要仔细调整的重要参数是-c和-g。除非用gridregression.py来搜索最优参数,否则只能自己慢慢试了。

 

用gridregression.py搜索最优参数的方法如下:

python.exe gridregression.py -svmtrain H:\SVM\libsvm-2.81\windows\svmtrain.exe -gnuplot C:\gp373w32\pgnuplot.exe -log2c -10,10,1 -log2g -10,10,1 -log2p -10,10,1 -v 10 -s 3 -t 2 H:\SVM\libsvm-2.81\windows\feature.scaled > gridregression_feature.parameter

 

注意:-svmtrain是给出svmtrain.exe所在路径,一定要是完整的全路径

-gnuplot是给出pgnuplot.exe所在路径。这里要用pgnuplot.exe这种命令行形式的,不要用wgnupl32.exe,这个是图形界面的。

-log2c是给出参数c的范围和步长

-log2g是给出参数g的范围和步长

-log2p是给出参数p的范围和步长

上面三个参数可以用默认范围和步长

-s选择SVM类型,也是只能选3或者4

-t是选择核函数

-v 10 将训练数据分成10份做交叉验证。默认为5

最后给出归一化后训练数据的全路径

搜索最优参数的过程写入文件gridregression_feature.parameter(注意别少了这个>符号啊)

 

根据搜索到的最优参数修改feature.scaled.model中的参数

(3)用svmpredict.exe进行预测

svmpredict.exe feature_test.scaled feature.scaled.model feature_test.predicted

其中feature_test.scaled是归一化后的测试特征文件名,feature.scaled.model是训练好的模型,SVM预测的值在feature_test.predicted中。

╰㊣Lonely '

关于svm现有工具包的比较

 

HeroSVM -- 商业软件,需要米

SVMLights -- 速度快

LIBSVM -- 台湾,属于国产,速度慢

我也没有全部用过这些软件,感觉比较应该主要是以下几个方面吧(个人观点):

处理类型:分类、回归

 

 

速度:这个和编写语言以及所采用的算法有关

优化算法:原始的sVM回归或是分类都是求一个不等式约束的二次规划问题,

不同的优化算法的所得到的结果不同。不同的软件应该也是在这有区别吧?

看过邵惠鹤写的《支持向量机理论及其应用》综述,介绍了四个:

(1) 分块算法(Chunking)(Cortes and Vapnik,1995)

(2) 子集选择算法( Subset Selection algorithms )

( Osuna,1997;Joachims,1998 SVmlight所采用的方法)

(3) 序列最小优化算法(SMO,Sequential Minimal

Optimization)(Platt,1998)

(4) 增量式算法(Cauwenberghs,2001)

╰㊣Lonely '

The WEKA wiki provides unclear information about how to install LibSVM wrapper (libsvm.jar). The author of the wrapper just mention something related to programming in Java but using libSVM.

Finally, I figured out how to use LibSVM in WEKA. On windows, you have to change the CLASSPATH to add libsvm.jar and wlsvm.jar there.

Meanwhile, you should turn off -classpath . option in weka.bat.

However, libSVM cannot tolerate missing values and this makes it hard to face some real problems.

╰㊣Lonely '

 

先提供一个 libsvm 2.6 的程序源码注释http://www.pami.sjtu.edu.cn/people/gpliu/document/libsvm_src.pdf,大家先看看,具体的算法分析以后再写,最近比较忙!

 

本文中提到的算法是 Platt 在1998年提出、由 Fan 等人于2005年改进的序列最小最优化(Sequential Minimal Optimization,SMO)分解方法,程序源码参考libsvm-2.8.3 (http://www.csie.ntu.edu.tw/~cjlin/libsvm/)。

 

参考文献

1 J. C. Platt. Fast training of support vector machines using sequential minimal optimization.

In B. Sch¨olkopf, C. J. C. Burges, and A. J. Smola, editors, Advances in

Kernel Methods - Support Vector Learning, Cambridge, MA, 1998. MIT Press.

 

2 R.-E. Fan, P.-H. Chen, and C.-J. Lin. Working set selection using second order

information for training SVM. Journal of Machine Learning Research, 6:1889–1918,

2005. URL http://www.csie.ntu.edu.tw/cjlin/papers/quadworkset.pdf.3 姬水旺,姬旺田,支持向量机训练算法综述[J],微机发展,14(1),2004。4 刘江华,程君实,陈佳品,支持向量机训练算法综述[J],信息与控制,31(1),2002。

 

以下是网上现有的几个中文版的支持向量机软件libsvm使用的网址:

1.黄波的个人主页 http://huangbo929.blog.edu.cn

2.陆振波的个人主页http://luzhenbo.88uu.com.cn/

3.piaip's Using (lib)SVM Tutorial(piaip 的 (lib)SVM 簡易入門)http://ntu.csie.org/~piaip/svm/svm_tutorial.html3、Libsvm学习笔记(http://mirrorlake.bokee.com/5133582.html)


免责申明:网友评论不代表本站立场! 客服EMAIL:lunwenpaihang@126.com