因工作需要进行数据建模预测,预测的方法较多,后在一篇文章中看到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后如下图所示:
接着在MATLAB中添加路径,我的是MATLAB2014a(注意这个版本,下面会说),点设置路径,选择添加并包含子文件夹,选择刚才下载并解压好的libsvm-3.24这个文件夹,效果图如下:
点保存后关闭就行。当然,有的直接将libsvm-2.34zip解压在MATLAB的toolbox文件下也可以。
2、编译
接下来就编译下libsvm自带的函数,测试编译环境。在MATLAB中打开libsvm-2.34文件夹。在命令行输入: mex –setup –v(注意横杠前面有空格),查看编译器,接着测试自带函数 make。
结果我的出现了问题,因为我安装了vs2013,提示找到了vs2013这个编译器,然而无法使用。这是遇到的第一个问题,有点小挫折,哈哈。
还好,这个问题很常见,主要是编译器的问题,博客上有许多解决方案,比如下载windows sdk,我参考恭谦的博客:https://blog.csdn.net/github_35807147/article/details/80725642 ,下载TDM–GCC-64到C盘,跟着该博客走了一遍,发现还是没解决,有点烦躁,然而生命不息,学习还得继续啊,硬着头皮走下去。问了个软件方面的同学,他说估计是版本问题,MATLAB识别了两个编译器,不知道用哪个好?我也不懂,也不敢问啊,哈哈。那就干呗,二选一,卸载vs2013,让它独宠TDM-GCC应该可以吧,然而,没啥用,问题依旧,崩溃啊。凭着顽强的精神,强打精神,继续看博客,查资料,后灵光乍现,莫非是MATLAB的问题吧?于是重新安装了MATLAB 2016b版,重返步骤2,测试结果很惊喜,能运行了,开心!
小结,如果遇到编译问题,不妨先看自己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格式的.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中,大家可以更改参数,找到合适的参数和保存文件。
归一化后的数据。个人觉得数据不一定非要归一化处理,看情况而定。
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,里面有详细的讲解,这里贴上我测试程序的图片。
我是粗略的测试了自己的数据,选择的是RBF核的SVR,参数c和g是初选的700,0.008,这两个参数的优化这里没有涉及,下一步准备使用网格回归的方法优化。这就是我这个小白使用LIBSVM的过程,希望对大家有点帮助。虽然中间有挫折、沮丧甚至是崩溃,这何尝又不是我们接触新事物的历程呢,中间难免会有困难,可困难解决了就剩下开心了,望大家都开心。最后附上回归结果图,虽然效果不理想,可谁又能知道这不是离成功更进一步了呢。