LIBSVM做回归预测

看了网上很多帖子和博客,自己琢磨了很久到现在才弄明白怎么用libsvm来做预测。因为网上的帖子一般都是转来转去的,所以第一个人感觉这样写详细了,之后的人不管懂不懂照搬不误,这就苦了我们笨的人啦。不过我研究了一天,终于有点眉目,写点体会,应该会比较详细吧,至少是过来人碰到的问题。

 

p.s.这里暂且不讨论分类问题,其实分类比预测简单,下载下来的libsvm-2.88早已有easy.py可以直接拿来做,所以简单,一步到位,之后如果有空就写写!

 

用libsvm做回归的人有的疑惑大致有这些:

1,怎么把数据整理成规定格式,我以前的帖子写了,只要用一个带有宏的excel就能搞定,话不多说。

2,有人会说svm就打几条命令就能得出结果

svm-train -s 3 -t 2 -c 1024.0 -g 0.0009765625 -p 0.0009765625 data.txt
svm-predict test.txt data.txt.model out.txt

),干嘛还要下载python和gnuplot呢,其实了解svm理论的知道最核心的问题就是参数的选择,你不可能每次都很狗屎的猜到很好的参数,做出很好的预测,所以只能用这两个软件来寻参。

3,怎么寻参?核心的语句就这么一句,把dos框的路径调到C:\Python26,再键入

(python C:\libsvm-2.88\python\gridregression.py -svmtrain C:\libsvm-2.88\windows\svm-train.exe -gnuplot C:\gnuplot\bin\pgnuplot.exe -log2c -10,10,1 -log2g -10,10,1 -log2p -10,10,1 -v 10 -s 3 -t 2 C:\libsvm-2.88\python\data.txt > gridregression_data.parameter)能把这句执行下去,就算等老半天也是值得的。(下载的三个软件的路径调整问题下面补充,我是全部放在C盘的,省事。。。)

4,有人会问含有gridregression.py的以上语句不能执行老是出错,这是什么原因呢?我也闷了半天,后来才知道gridregression.py 文件在台湾人的libsvm-2.88包里面是没有的,所以要自己去下载,要来后放在C:\libsvm-2.88\python里面就可以了。

5,回归会像分类那样调用easy.py(连grid.py都不需)一步到位麽?不是的这是有区别的,当你做完步骤四时,到C:\Python26中打开文件 gridregression_data.parameter,里面有你要的参数c,g,p还有一个mse是没有用的,不用管他。

6,最后把dos框的路径调到C:\libsvm-2.88\windows,再执行

svm-train -s 3 -t 2 -c 1024.0 -g 0.0009765625 -p 0.0009765625 data.txt
svm-predict test.txt data.txt.model out.txt

搞定了,结果在C:\libsvm-2.88\windows的out.txt中!

7,忘了,三个软件长什么样和住哪里没有和你们说清楚,操之过急了哈。分别在

C:\libsvm-2.88

C:\Python26

C:\gnuplot

这样应该详细了吧。。。

 

 

最后附上步骤3中的补充,其实还是想自己写,因为这样清楚,不过没力气了,转一下吧,网上帖子稍有不同,不过我选了一篇很清楚的:

首先我们需要下载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软件,下载地址:ftp://ftp.gnuplot.info/pub/gnuplot/,注意要下载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路径的那项,根据实际路径进行修改,并保存。
用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
http://old.blog.edu.cn/user2/huangbo929/archives/2007/1714763.shtml

如何使用libsvm进行分类【by faruto】
http://www.matlabsky.com/forum-v ... -fromuid-18677.html
这里将这个帖子记为(帖子*)
其实我个人感觉分类和回归本质一样的,分类搞清楚了的话,回归也就应该会的了。但有好多朋友对于使用libsvm进行分类会了,但使用libsvm进行回归就行不明白,我也搞不懂,道理都一样的啊,我最开始接触libsvm的时候就是弄明白分类然后回归自然而然就明白了的啊!

好吧,不管了,还是在这里把使用libsvm进行回归预测也说说吧~。

回归和分类本质都是一样,就是有一个输入(属性矩阵或者自变量)然后有输出(分类是分类标签,回归是因变量),也就是相当于一个函数:
                Y = f(x)
利用训练集合已知的x,y来建立回归模型model,然后用这个model去预测。
这里面的x就相当于帖子*中的那个属性矩阵data,y相当于帖子*中的label,这样理解就很简单了。我们看下面一个简单的利用libsvm进行回归的例子:
  1. %% HowToRegressUsingLibsvm
  2. % by faruto @ faruto's Studio~
  3. % http://blog.sina.com.cn/faruto
  4. % Email:faruto@163.com
  5. % http://www.matlabsky.com
  6. % http://www.mfun.la
  7. % http://video.ourmatlab.com
  8. % last modified by 2010.12.28
  9. %% a litte clean work
  10. tic;
  11. close all;
  12. clear;
  13. clc;
  14. format compact;
  15. %%

  16. % 生成待回归的数据
  17. x = (-1:0.1:1)';
  18. y = -x.^2;

  19. % 建模回归模型
  20. model = svmtrain(y,x,'-s 3 -t 2 -c 2.2 -g 2.8 -p 0.01');

  21. % 利用建立的模型看其在训练集合上的回归效果
  22. [py,mse] = svmpredict(y,x,model);
  23. figure;
  24. plot(x,y,'o');
  25. hold on;
  26. plot(x,py,'r*');
  27. legend('原始数据','回归数据');
  28. grid on;

  29. % 进行预测
  30. testx = 1.1;
  31. display('真实数据')
  32. testy = -testx.^2

  33. [ptesty,tmse] = svmpredict(testy,testx,model);
  34. display('预测数据');
  35. ptesty

  36. %%
  37. toc
复制代码
运行结果:
  1. Mean squared error = 9.52768e-005 (regression)
  2. Squared correlation coefficient = 0.999184 (regression)
  3. 真实数据
  4. testy =
  5.    -1.2100
  6. Mean squared error = 0.0102555 (regression)
  7. Squared correlation coefficient = -1.#IND (regression)
  8. 预测数据
  9. ptesty =
  10.    -1.1087
  11. Elapsed time is 0.133552 seconds.
复制代码
上面的代码是对于二次函数y = x^2在[-1,1]上进行回归,并对于testx=1.1进行预测,这里面由于我们知道真实的因变量testy = -1.21,按道理说做预测是不知道待预测的目标量是什么的,否则还预测什么?这里就有好多朋友产生疑惑,说如果不知道待预测的目标量是什么怎么办?答曰:那就随便写一个就行啊!然后又有的朋友会说,那这样生成的回归指标(mse均方根误差,和平方回归系数很不理想啊),操~本身真实的因变量都不知道,这些参考指标在真实的因变量不知道的情况下是没有参考价值的。以前我看到这样的问题,真的抓狂,就不能自己动脑子稍微想一下吗!?

上面使用的参数说明:
 -s svm类型:SVM设置类型(默认0)
  0 -- C-SVC
  1 --v-SVC
  2 – 一类SVM
  3 -- e -SVR
  4 -- v-SVR
  -t 核函数类型:核函数设置类型(默认2)
  0 – 线性:u'v
  1 – 多项式:(r*u'v + coef0)^degree
  2 – RBF函数:exp(-r|u-v|^2)
  3 –sigmoid:tanh(r*u'v + coef0)

-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)

-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)

-p p:设置e -SVR 中损失函数p的值(默认0.1)


更多关于libsvm 参数的说明请看
libsvm 参数说明【中英文双语版本】
http://www.matlabsky.com/forum-v ... -fromuid-18677.html

如果对于标签设置问题您还没有搞懂可以再看看这个:
【转】Matlab中使用libsvm进行分类预测时的标签问题再次说明
http://www.matlabsky.com/forum-v ... -fromuid-18677.html


更多关于SVM的东西请看:
关于SVM的那点破事[长期更新整理 by faruto]

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值