用libsvm进行回归预测

作者:kongmeng

http://www.cnblogs.com/hdu-2010/p

最近因工作需要,学习了台湾大学林智仁(Lin Chih-Jen)教授

http://www.ie.ntu.edu.tw/professors/%E5%90%88%E8%81%98%E5%B0%88%E4%BB%BB%E5%B8%AB%E8%B3%87/cjlin/

等人开发的SVM算法开源算法包。

为了以后方便查阅,特把环境配置及参数设置等方面的信息记录下来。

SVM属于十大挖掘算法之一,主要用于分类和回归。本文主要介绍怎么使用LIBSVM的回归进行数值预测。

LIBSVM内置了多种编程语言的接口,本文选择Python。

1 LIBSVM官方网址

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

可在这里下载LIBSVM的开源包,特别推荐初学者阅读文章A practical guide to SVM classification 和开源包自带的readme文件。可解决你的很多疑问。

一份简单易懂的LibSVM的学习资料。 http://pan.baidu.com/s/1bnfNmv9

2 安装环境

开源包版本 LIBSVM-3.20

操作系统 Win7 64bit

Python版本:python2.7.9

下载链接 https://www.python.org/downloads/

gnuplot: Gnuplot Version 5.0 (Jan 2015)

下载链接 http://sourceforge.net/projects/gnuplot/files/

3 回归预测

http://101.96.10.63/www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf

A practical guide to SVM classification推荐的方法流程是这样的。

需要说明的是,回归预测需要gridsearch三个参数 gamma 、cost和epsilon;具体意义见下图红框。

开源包自带的grid.py 文件是针对分类用的,回归需要用gridregression.py文件。该文件需要另外下载。另外附带一份介绍LIBSVM使用的材料。

下载链接http://pan.baidu.com/s/1bnfNmv9

下载完成后,把gridregression.py文件中的svm-train和gnuplot的安装路径修改为自己主机的安装路径。一定要认真,笔者在这里浪费好多时间。

3.1 数据格式整理

3.2 归一化

回归预测需要对训练集trainset进行归一化,并对测试集testset进行同样的归一化。

$ svm-scale -y -1 1 -s scale train.txt > trainScale.txt

$ svm-scale -r scale test.txt > testScale.txt

-y 参数表示要对label进行归一化。可在cmd输入svm-scale 回车, 查看各参数的意义。

3.3 gridsearch 寻找最优参数

python gridregression.py -log2c -10,10,1 -log2g -10,10,1 -log2p -10,10,1 -v 10 -s 3 -t 2 trainScale.txt > trainrs.txt

-s 3 表示进行回归 -t 2 表示使用径向基核函数

后查看trainrs.txt

红框中的三个数字对应最好的cost 、gamma和epsilon;

3.4 训练trainScale

svm-train -s 3 -t 2 -c 64 -g 0.03125 -p 0.125 trainScale.txt

会生成trainScale.txt.model 文件

3.5 预测testScale

svm-predict testScale trainScale.txt.model predict-result.txt

查看predict-result.txt内容

3.6 对结果反归一化

比如x属于原来的测试集, 范围是[min, max], 而scale后的范围是[m, n]

那么x对应归一化的值y是什么?y = (x-min)/(max-min) *(n-m) + m

那如果已知y, x又是多少呢?

x = (y-m)/(n-m) * (max-min) + min

可按照x = (y-m)/(n-m) * (max-min) + min 对predict-result.txt内容进行反归一化,从而得到最终的预测值。

4 model参数说明

其中, #iter 为迭代次数;

nu 是选择的核函数类型的参数;

obj 为SVM文件转换为的二次规划求解得到的最小值;

rho 为判决函数的偏置项b;

nSV 为标准支持向量个数(0<a[i]<c);

nBSV 为边界上的支持向量个数(a[i]=c);

Total nSV为支持向量总个数(对于两类来说, 因为只有一个分类模型Total nSV = nSV

但是对于多类, 这个是各个分类模型的nSV之和).

在目录下, 还可以看到产生了一个train.model文件, 可以用记事本打开, 记录了训练后的结果.

  1. svm_type c_svc //所选择的svm类型, 默认为c_svc
  2. kernel_type rbf //训练采用的核函数类型, 此处为RBF核
  3. gamma 0.0769231 //RBF核的参数γ
  4. nr_class 2 //类别数, 此处为两分类问题
  5. total_sv 132 //支持向量总个数
  6. rho 0.424462 //判决函数的偏置项b
  7. label 1 -1 //原始文件中的类别标识
  8. nr_sv 64 68 //每个类的支持向量机的个数
  9. SV //以下为各个类的权系数及相应的支持向量
  10. 1 1:0.166667 2:1 3:-0.333333 … 10:-0.903226 11:-1 12:-1 13:1
  11. 0.5104832128985164 1:0.125 2:1 3:0.333333 … 10:-0.806452 12:-0.333333 13:0.5
  12. ………
  13. -1 1:-0.375 2:1 3:-0.333333…. 10:-1 11:-1 12:-1 13:1
  14. -1 1:0.166667 2:1 3:1 …. 10:-0.870968 12:-1 13:0.5

这里注意, 第二行出现的权系数为小数(0.5104832128985164)是因为这个点属于非边界上的支持向量, 即: (0<a[i]<c).

其他的两个(svm-predict, svm-scale)的使用过程类似.

5 SVM优缺点

SVM有如下主要几个特点:

(1)非线性映射是SVM方法的理论基础,SVM利用内积核函数代替向高维空间的非线性映射;
(2)对特征空间划分的最优超平面是SVM的目标,最大化分类边际的思想是SVM方法的核心;
(3)支持向量是SVM的训练结果,在SVM分类决策中起决定作用的是支持向量;
(4)SVM 是一种有坚实理论基础的新颖的小样本学习方法。
它基本上不涉及概率测度及大数定律等,因此不同于现有的统计方法。
从本质上看,它避开了从归纳到演绎的传统过程,实现了高效的从训练样本到预报样本的“转导推理”,
大大简化了通常的分类和回归等问题;

(5)SVM 的最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,
而不是样本空间的维数,这在某种意义上避免了“维数灾难”。
(6)少数支持向量决定了最终结果,这不但可以帮助我们抓住关键样本、“剔除”大量冗余样本,
而且注定了该方法不但算法简单,而且具有较好的“鲁棒”性。
这种“鲁棒”性主要体现在:
①增、删非支持向量样本对模型没有影响;

②支持向量样本集具有一定的鲁棒性;
③有些成功的应用中,SVM 方法对核的选取不敏感
两个不足:
(1) SVM算法对大规模训练样本难以实施
由于SVM是借助二次规划来求解支持向量,
而求解二次规划将涉及m阶矩阵的计算(m为样本的个数),当m数目很大时该矩阵的存储和计算
将耗费大量的机器内存和运算时间。
针对以上问题的主要改进有
J.Platt的SMO算法、
T.Joachims的SVM、
C.J.C.Burges等的PCGC、
张学工的CSVM
以及O.L.Mangasarian等的SOR算法
(2) 用SVM解决多分类问题存在困难
经典的支持向量机算法只给出了二类分类的算法,
而在数据挖掘的实际应用中,一般要解决多类的分类问题。
可以通过多个二类支持向量机的组合来解决。
主要有
一对多组合模式、一对一组合模式和SVM决策树;
再就是通过构造多个分类器的组合来解决。
主要原理是克服SVM固有的缺点,结合其他算法的优势,解决多类问题的分类精度。
如:
与粗集理论结合,形成一种优势互补的多类问题的组合分类器。

6 总结

说明:上述流程中sacle 过程不一定要使用,具体问题具体分析。还是要多试验,多看效果。笔者在上述流程中犯了好多错误,希望读者尽量避免。

其实最难的部分在于特征信号的选取,即哪些因子作为feature去拟合label?

7 附录

官网gridregression.py下载地址 http://ntucsu.csie.ntu.edu.tw/~cjlin/libsvmtools/#grid_parameter_search_for_regression

原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2016-09-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CSDN技术头条

使用GPU和Theano加速深度学习

【编者按】GPU因其浮点计算和矩阵运算能力有助于加速深度学习是业界的共识,Theano是主流的深度学习Python库之一,亦支持GPU,然而Theano入门较难...

2045
来自专栏ATYUN订阅号

词序:神经网络能按正确的顺序排列单词吗?

当学习第二语言时,最困难的挑战之一可能是熟悉单词顺序。词序在机器翻译中也很重要,因为翻译大致上是一种处理目标语言词汇的过程,它与源语言是对等的。也许你已经做过一...

3234
来自专栏新智元

猫狗大战识别准确率直冲 Kaggle Top 2%,手把手教你在 Keras 搭建深度 CNN

猫狗大战 数据集来自 kaggle 上的一个竞赛:Dogs vs. Cats,训练集有25000张,猫狗各占一半。测试集12500张,没有标定是猫还是狗。 ?...

5727
来自专栏ATYUN订阅号

适合开发者的深度学习:第一天就能使用的编码神经网络工具

当前的深度学习浪潮在五年前就开始了。深度学习是驱动汽车的技术,也可以在Atari游戏中击败人类,甚至能够诊断癌症。 深度学习是机器学习的一个分支。它被证明是一种...

3366
来自专栏人工智能头条

iOS 10 和macOS中的神经网络

1163
来自专栏ATYUN订阅号

深度实践:如何用神经网络给黑白照片着色

现如今,将图片彩色化是通常用Photoshop处理的。一幅作品有时候需要用一个月的时间来着色。可能单单一张脸就需要20层的粉色、绿色和蓝色阴影才能让它看起来恰到...

2767
来自专栏机器之心

教程 | 初学文本分析:用Python和scikit-learn实现垃圾邮件过滤器

选自kdnuggets 机器之心编译 参与:王宇欣、吴攀 本文介绍了如何通过 Python 和 scikit-learn 实现垃圾邮件过滤的。对比和分析了两个分...

2907
来自专栏量子位

GitHub超过2600星的TensorFlow教程,简洁清晰还不太难丨资源

最近,弗吉尼亚理工博士Amirsina Torfi在GitHub上贡献了一个新的教程,教程清晰简单,喜提2600颗星~

833
来自专栏机器学习、深度学习

人群密度估计--CrowdNet: A Deep Convolutional Network for Dense Crowd Counting

CrowdNet: A Deep Convolutional Network for Dense Crowd Counting published in ...

2338
来自专栏GAN&CV

tensorflow 实现wgan-gp mnist图片生成

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25737169/article/d...

962

扫码关注云+社区