LIBSVM回归之初体验

   因工作需要进行数据建模预测,预测的方法较多,后在一篇文章中看到LIBSVM做回归预测,因此想用学习使用LIBSVM来回归预测,此为背景。本人第一次使用LIBSVM,还多亏了网上的一些帖子和博客,跟着这些帖子博客走了一遍,虽然中间有许多弯路,还差点放弃,还好最后调试成功了,因此想分享下经历。(ps :本人win7,64位系统,大家在下载和学习中要看注意版本,选择合适的)在此感谢博客:https://blog.csdn.net/qq_31781741/article/details/82666861和

https://blog.csdn.net/github_35807147/article/details/80725642,两篇博客很清楚的写出了LIBSVM的使用步骤及下载资源(初学者建议先通读这两篇博客)。

  1、libsvm下载及MATLAB中添加路径

libsvm下载在上面两博客的链接中有,我下载的是64位的libsvm-3.24zip,下载后放在E盘中,解压zip后如下图所示:LIBSVM回归之初体验_第1张图片

接着在MATLAB中添加路径,我的是MATLAB2014a(注意这个版本,下面会说),点设置路径,选择添加并包含子文件夹,选择刚才下载并解压好的libsvm-3.24这个文件夹,效果图如下:

 

LIBSVM回归之初体验_第2张图片

点保存后关闭就行。当然,有的直接将libsvm-2.34zip解压在MATLAB的toolbox文件下也可以。

2、编译

接下来就编译下libsvm自带的函数,测试编译环境。在MATLAB中打开libsvm-2.34文件夹。在命令行输入: mex –setup –v(注意横杠前面有空格),查看编译器,接着测试自带函数 make。 

LIBSVM回归之初体验_第3张图片

结果我的出现了问题,因为我安装了vs2013,提示找到了vs2013这个编译器,然而无法使用。这是遇到的第一个问题,有点小挫折,哈哈。

LIBSVM回归之初体验_第4张图片

 

LIBSVM回归之初体验_第5张图片

 还好,这个问题很常见,主要是编译器的问题,博客上有许多解决方案,比如下载windows sdk,我参考恭谦的博客:https://blog.csdn.net/github_35807147/article/details/80725642 ,下载TDM–GCC-64到C盘,跟着该博客走了一遍,发现还是没解决,有点烦躁,然而生命不息,学习还得继续啊,硬着头皮走下去。问了个软件方面的同学,他说估计是版本问题,MATLAB识别了两个编译器,不知道用哪个好?我也不懂,也不敢问啊,哈哈。那就干呗,二选一,卸载vs2013,让它独宠TDM-GCC应该可以吧,然而,没啥用,问题依旧,崩溃啊。凭着顽强的精神,强打精神,继续看博客,查资料,后灵光乍现,莫非是MATLAB的问题吧?于是重新安装了MATLAB 2016b版,重返步骤2,测试结果很惊喜,能运行了,开心!

LIBSVM回归之初体验_第6张图片

小结,如果遇到编译问题,不妨先看自己MATLAB的版本,貌似MATLAB2014a 与vs2013这个组合不合适(仅供参考),可以尝试MATLAB2016b与TDM-GCC编译器这个组合。

3、测试

将文件夹中的数据 heart_scale复制到当前工作区来,在命令行输入以下程序:

[heart_scale_label,heart_scale_inst]=libsvmread('heart_scale');

model = svmtrain(heart_scale_label,heart_scale_inst) ;

[predict_label,accuracy,dec_values]=svmpredict(heart_scale_label,heart_scale_inst,model)

运行该程序后,就能显示结果,至此,libsvm的安装使用基本算是完成了。

4、使用

以上的测试数据heart_scale是libsvm自带的数据,是设置好格式的数据,如果我们用自己的数据该是怎么个流程呢,毕竟我们是要自己的数据来回归预测的。步骤主要有数据转换成libsvm的格式、数据归一化、模型训练(中间还有参数优化问题)、回归预测等四个步骤。

4.1 数据格式转换

我的数据是以Excel表格形式保存的,即是.xls格式的,行是样本,列是样本特征。下面是我的一部分数据,最后一列是label。(这点特别要注意,数据标签label要放最后,切记切记,不然格式转换的时候会出问题。)

 

而libsvm的格式是:

[Label]  [index1]:[value1]  [index2]:[value2]  [index3]:[value3] ...

   目标值  特征编号1:特征值1 特征编号2:特征值2 特征编号3:特征值3 …

如 5.1  1::13  2:32.5  3:4.5  4:17

我采用的方法是使用Formatdatalibsvm.xls的方法,下载FormatDataLibsvm.xls请参考博客:

https://blog.csdn.net/kobesdu/article/details/8944851,里面有下载链接。打开Formatdatalibsvm.xls,接着将数据复制粘贴到sheet1的topleft(左上角第一个单元格)单元,点击视图—>宏-->执行选项FormatDatatoLibsvm—>执行。然后保存成文本文档格式。

 

LIBSVM回归之初体验_第7张图片

 

用记事本打开已保存成Libsvm格式的.txt文件,如下图:

在这里,我遇到个小问题,就是转成libsvm 格式的后,数据的有效数字好像会发生改变,原始数据是小数点后四位有效数字,转换后不止四位有效数字了,不过这貌似影响不大。

4.2 归一化

这里是用 svm-scale.exe对数据归一化,在下载的libsvm-3.24文件夹中有这个函数,不过好像在MATLAB中没有接口,因此是在dos命令下执行: svm-scale.exe [-l lower] [-u upper]

[-y y_lower y_upper] [-s save_name] [-r store_name] filename。-I(注意是字母I,不是数字1,我这里入坑过,哈哈),-u 分别是数据下限上限标记,lower、upper分别是归一化后数据下限和上限值;-y是对目标值同时归一化,参数性质类似;最后两个参数是需要归一化的文件和保存文件。我这里将数据归一化到[0 1]这个范围,目标值不参与归一化,归一化前数据是存在train_set.txt中,归一化后保存在train_scale.txt中,大家可以更改参数,找到合适的参数和保存文件。

LIBSVM回归之初体验_第8张图片

归一化后的数据。个人觉得数据不一定非要归一化处理,看情况而定。

4.3、训练与预测

这里我直接将训练与预测放一起,是因为在程序中可以放一起运行,因此简化了。在MATLAB中主要是用到Libsvmread、svmtrain、svmpredict三个函数,第一个函数用来读入转化成Libsvm格式的数据,后两个函数用来训练回归模型和对数据进行回归预测。

用法:

  Libsvmread  filename

 svmtrain [options] training_set_file [model_file]

 svmpredict [options] test_file model_file output_file

这三个函数用法较简单,其中 options为操作参数,具体含义可以查看下载文件中的README,里面有详细的讲解,这里贴上我测试程序的图片。

LIBSVM回归之初体验_第9张图片

我是粗略的测试了自己的数据,选择的是RBF核的SVR,参数c和g是初选的700,0.008,这两个参数的优化这里没有涉及,下一步准备使用网格回归的方法优化。这就是我这个小白使用LIBSVM的过程,希望对大家有点帮助。虽然中间有挫折、沮丧甚至是崩溃,这何尝又不是我们接触新事物的历程呢,中间难免会有困难,可困难解决了就剩下开心了,望大家都开心。最后附上回归结果图,虽然效果不理想,可谁又能知道这不是离成功更进一步了呢。

LIBSVM回归之初体验_第10张图片

 

你可能感兴趣的:(回归)