说一说我对用LIBSVM进行回归预测的粗浅认识(整理完成于2012年5.11)
作者 : 师梦
吾本工程小硕一枚,前用matlab建模,已然完成。某日,正沾沾自喜之际,吾师曰:“汝已为之,甚好。然此法仅用于后期处理,若在线,数控之机床不识别之,汝改之,标准C即可”。吾大惊,标准C?难也,难也。然师命不可违。吾即度之,然度娘不甚给力,正愁苦之际,学长曰:“可尝试libsvm。”吾大喜,遂改之。吾本非程序员,故重重困难,可想而知。怎奈三周之调试,才得体验“程序虐我千百遍,我待程序如初恋”之精髓。%>_<%吾只三周,已然疲倦如此,况程序员之一生乎?
然吾终完成,做此文以记之,非炫耀之本,只为众人之便。此文仅吾一家之言,疏漏之处,在所难免,若能引得众人围观,共同探讨之,改之,则吾之荣幸。
嘿嘿,小小的“序”了一下哦~~O(∩_∩)O~~,由于只是用libsvm作为一种工具来服务自己的课题,所以不对libsvm本身做深入研究,鉴于自己开始做的时候遇到了很多的困难,也查了很多的资料,所以这篇文字就写的尽量详细一些,给大家以方便。好啦,一起来开始libsvm的奇妙之旅吧。(P.S:本人win7系统,本文所述步骤均为亲测正确。)
本文,将按照以下的顺序来说明libsvm的用法:
1.Libsvm之初相识
1)libsvm简介(略)
2)Libsvm、python、gnuplot下载
3)环境变量的设置以及如何在DOS下寻找路径
2.Libsvm之再体验(此阶段,你会真正体验到“若只如初见”的感觉。%>_<%)
1)将原始数据改为libsvm所规定的数据格式。2种方法:使用excel自带功能或者自己编程实现。
2)用svm-scale.exe对数据集进行归一化处理。
3)用gridregression.py搜索最优参数,主要是c和g。
4)用svm-train训练模型。
5)用svm-predict预测。
一、Libsvm之初相识
1、libsvm简介(略)
Libsvm主要是用来模式识别与回归,这部分可以自己上网去看,在此略。
2、Libsvm、python、gnuplot下载
会不会奇怪为什么还要下载python和gnuplot这两个软件很重要,是后面搜索最优参数要用到的,也是很关键的一步。
我用的版本:libsvm-3.12,Python2.4,对于gnuplot,我用的是gp400win32.zip,下面是下载地址:
Libsvm-3.12:http://www.csie.ntu.edu.tw/~cjlin/(libsvm创始人台湾大学林智仁副教授个人主页)
Python2.4:http://download.csdn.net/detail/linghu9990/3512232(这个是不要积分的)
gp400win32.zip:http://ishare.iask.sina.com.cn/f/14895214.html?from=like
Gridregression.py:http://download.csdn.net/detail/killa11/2225384
将其复制到libsvm下的python2.4文件夹下。
将Libsvm-3.12和gp400win32.zip解压,这两个都不用安装。Python2.4要安装。下面是它们的路径(个人习惯,可以重命名文件或者对文件夹进行整理,以便后续运行):
Libsvm:G:\shukong下面(这里我将libsvm-3.12重命名为libsvm)
Python:G:\shukong\libsvm下面(python2.4重命名为python)记得将python下面的python.exe复制到libsvm下的tools中
gp400win32.zip:G:\shukong\libsvm下面(只保留了gnuplot这个文件夹)
3、环境变量的设置以及如何在DOS下寻找路径
1)环境变量的设置(不明白为什么要设置环境变量@[email protected],但为了避免后续出了问题不知怎么解决,还是设置了)
添加环境变量到path:右击“计算机(我的电脑)”->属性->高级系统设置->高级->环境变量->系统变量列表里双击path在变量值最后添加“;G:\shukong\libsvm\windows”,这就对Libsvm环境变量设置好了,然后设置python环境变量,也和上面一样,在变量值最后添加“;G:\shukong\libsvm\tools”。如图1:
2)如何在DOS下寻找路径(这部分会的可以不用看,像我这种菜鸟,还是百度才知道的%>_<%)
点击“开始”按钮,进入“命令提示符”,默认路径是“C:\User\acer>”。这里有两种情况:一是像我是放在G盘的,所以要将路径改为G盘,方法是:直接在命令提示符里输入“G:”然后回车,就进入G盘的根目录了。如图2:
还有就是虽然在C盘,但是不在“C:\User\acer>”,这时就先要进入C盘的根目录,方法如下:在命令提示符下输入“cd\”然后回车即可。如图3:
以上两种情况,进入根目录以后,我们就可以进入libsvm的路径,在这里,我们先进入“G:\shukong\libsvm>”(只是我自己在G盘,你要根据自己实际路径进入),方法如下:
在命令提示符中输入“cd shukong”,然后回车,再输入“cd libsvm”然后回车即可。如图4:
二、Libsvm之再体验
怎么样,初相识还不是很难的吧,下面个人感觉就有点麻烦了。大家耐心哈。
1、将原始数据改为libsvm所规定的数据格式。
该软件使用的训练数据和检验数据文件格式如下:
[label] [index1]:[value1] [index2]:[value2] …
目标值 第一维特征编号:第一维特征值 第二维特征编号:第二维特征值…
例如:2.3 1:5.6 2:3.2
表示训练用的特征有两维,第一维是5.6,第二维是3.2,目标值是2.3
原始数据改为libsvm所规定的数据格式有2种方法:
1)使用网络上FormatDataLibsvm.xls来完成(我的excel版本不支持宏命令,所以此种方法没有用)。
FormatDataLibsvm.xls使用说明:
a. 先将数据按照下列格式存放(注意label放最后面):
value1 value2 … label
value1 value2 … label
…
value1 value2 … label
b. 然后将以上数据粘贴到FormatDataLibsvm.xls中的最左上角单元格,接着工具->宏->执行FormatDataToLibsvm宏。就可以得到libsvm要求的数据格式。
2)采用编程实现
a. 先将数据按照下列格式存放(注意label放最后面):
value1 value2 … label
value1 value2 … label
…
value1 value2 … label
b.本人使用的是简单的matlab编程来实现(以下是本人部分数据)
原数据(data1.txt)如图5:
转换之后的数据(svmdata1.txt)如图6:
用matlab进行数据转换之后,把svmdata1.txt复制到libsvm文件夹下的tools文件夹即可。
3)数据格式转换好了,那么在libsvm的tools文件夹下还有一个工具,可以用来检查你的数据格式是否正确,那就是checkdata.py。方法是:
打开"命令提示符",进入到libsvm中的tools文件夹下,(怎么样进入我已在上面介绍过),然后输入命令“checkdata.py svmdata1.txt”回车,若显示“No error”,则表示数据格式正确。我的数据结果如图7。(注:如果用这个matlab程序转换的话,一定是no error的。^_^)
这一步一般不会有太大的问题。
2、用svm-scale.exe对数据集进行归一化处理。
因为原始数据可能范围过大或过小, svmscale可以先将数据重新scale (縮放) 到适当范围使训练与预测速度更快。通常将数据缩放至[-1,1]或者[0,1]之间。
使用方法:svm-scale.exe [-l lower] [-u upper] [-y y_lower y_upper] [-s save_name] [-r store_name] filename;其中
-l:数据下限标记;
lower:缩放后数据下限 缺省值: lower = -1;
-u:数据上限标记;
upper:缺省值: upper = 1,代表着没有对y进行缩放;
-y:是否对目标值同时进行缩放;
y_lower:为下限值;
y_upper:为上限值;(回归需要对目标进行缩放,因此该参数可以设定为 –y -1 1 );
-s save_name:表示将缩放的规则保存为文件save_name;
-r store_name:表示将缩放规则文件store_name载入后按此缩放;
filename:待缩放的数据文件(要求满足前面所述的格式)。
在进行这一步的时候,我们要用到的数据是上一步已经改好格式的数据,即svmdata1.txt,所以要把svmdata1.txt复制到libsvm中的windows文件夹下。
具体操作,打开“命令提示符”,进入libsvm中的windows下,输入命令“svm-scale.exe -l 0 -u 1 svmdata1.txt>data.txt”。如图8。
这里,我们把svmdata1.txt里面的数据缩放为[0,1]之间,并另存为data.txt,这时,在windows下面会多出一个data.txt,里面就是你要的数据。我没有保存规则,就不用-s。这里也有几个问题:
a.请看下图9:
和上图对比,感觉输入的命令是一样的,但是却提示错误,打开data.txt却并没有数据,却是英文的svm-scale的用法,刚开始,一直这样,我痛苦死了,后来仔细一看才明白,原来那个是英文的‘l’而我写的是数字‘1’,这样一改就好了。图10:
归一化后的数据如图11:
可以看到前几行索引没有‘3’,这是因为索引为‘3’的value是0,所以为了节省内存,就不显示了,这并不是错误,不要担心。
3、用gridregression.py搜索最优参数,主要是c和g。
数据都准备好了之后,就可以用svm-train来训练模型了,然而,了解svm-train的都知道,训练的时候又很多的参数,而这些参数又不能随便选,会有最优的,但是人工去选的话,会很麻烦,我看好多人都说用libsvm自带的grid.py进行参数的搜索,但是我查了,也实践了,好像grid.py不支持回归的,于是我用gridregression.py来搜索最优参数。
有关gridregression.py的下载,在第一步已经说了,不在赘述。先打开gridregression.py,注意用Eidt with IDLE打开,然后里面有些参数要改一下。
改前如图12:
改后如图13:
其实要改的就这些,主要是把svmtain_exe和gnuplot_exe的路径改为自己的路径就行。
然后就可以进行寻优了。要先把路径调好,注意调到G:\shukong\libsvm\python2.4下。
然后输入下面的语句:python G:\shukong\libsvm\python2.4\gridregression.py -svmtain G:\shukong\libsvm\windows\svm-train.exe -gnuplot G:\shukong\libsvm\gnuplot\bin\pgnuplot.exe -log2c -10,10,1 -log2g -10,10,1 -log2p -10,10,1 -v 10 -s 3 -t 2 G:\shukong\libsvm\tools\data.txt如图14:
这个比较多字母,容易输错,我是在worrd文档里键入,然后复制到命令提示符中,回车,就开始跑了,在命令提示符窗口中看到运行过程。过程可能会比较长,我的数据少,很快就有结果了。
另:我在网上看的,如果输入python G:\shukong\libsvm\python2.4\gridregression.py -svmtain G:\shukong\libsvm\windows\svm-train.exe -gnuplot G:\shukong\libsvm\gnuplot\bin\pgnuplot.exe -log2c -10,10,1 -log2g -10,10,1 -log2p -10,10,1 -v 10 -s 3 -t 2 G:\shukong\libsvm\tools\data.txt>gridregression_data.parameter比上面的输入多了最后的“>gridregression_data.parameter”,表示将结果保存在gridregression_data.parameter中,会在python文件夹中多出一个gridregression_data.parameter文件,但是在命令提示符中不会看到运行过程,这种方法我也尝试了,但是时间会非常长,大概花了4个小时,而且网上用这个方法的人也是运行了大概24小时,还是没结束,所以,还是不要保存为好,用上面的输入就行。寻优结果如图15:
可以看到寻优的过程,只需关注最后一行即可。最后一行分别为c,g,p,mse,一般来说mse这个参数不是很重要,是越小越好吧(至于为什么是越小越好,我也不清楚哇~~)。
4、用svm-train训练模型。
svmtrain我们在前面已经接触过,他主要实现对训练数据集的训练,并可以获得SVM模型。
用法: svmtrain [options] training_set_file [model_file]
其中,options为操作参数,至于参数的可的选项及表示的涵义,大家可以在livbsvm中自带的readme里面看得到,很详细,不再赘述。这里只介绍我所选择的参数及其值。
打开命令提示符,进入G:\shukong\libsvm\windows然后输入“svm-train -s 3 -t 2 -c 1024.0 -g 4 .0 -p 0.0625 data.txt”,这里-s是选择SVM的类型。对于回归来说,只能选3或者4,3表示epsilon-support vector regression, 4表示nu-support vector regression。-t是选择核函数,通常选用RBF核函数。然后c,g,p我们已经寻出,直接运行即可。如图16:
#iter 为迭代次数, nu 与前面的操作参数 -n n 相同, obj 为 SVM 文件
转换为的二次规划求解得到的最小值, rho 为判决函数的常数项 b , nSV 为支持
向量个数, nBSV 为边界上的支持向量个数, Total nSV 为支持向量总个数。
这时在windows中会生成一个data.txt.model文件。可以用来进行下面的预测了。
5、用svm-predict预测。
vmpredict 是根据训练获得的模型,对数据集合进行预测。
用法:svmpredict [options] test_file model_file output_file
其中,options为操作参数,可用的选项即表示的涵义如下所示:
-b probability_estimates——是否需要进行概率估计预测,可选值为0 或者1,默认值为0。
model_file ——是由svmtrain 产生的模型文件;
test_file—— 是要进行预测的数据文件,格式也要符合libsvm格式,即使不知道label的值,也要任意填一个,svmpredict会在output_file中给出正确的label结果,如果知道label的值,就会输出正确率;
output_file ——是svmpredict 的输出文件,表示预测的结果值。
还是在命令提示符windows下输入“svm-predict test.txt data.txt.model out.txt”,如图17:
可以看到,第一行是均差,第二行是相关系数,预测结果还是不错的。如果预测结果不好,一可能是你的参数选择不当,还可能是你的特征值选择的有问题。
另外,在windows下会生成一个out.txt文件,可以打开看一下和test.txt文件的差别。
至此,用libsvm进行回归预测的大概步骤就是这个样子,只是个人总结,不妥之处,还希望大家讨论指出。