Libsvm使用过程

      纯26K金小白一枚,一路下来看了很多大神的帖子,但还是弄的很坎坷Libsvm使用过程~所以想着做点笔记自己以后参考,同时也能给有需要的童鞋们一点点小帮助Libsvm使用过程

      

一、悲剧的Python安装经历

      https://blog.****.net/flydreamgg/article/details/4470477是我参考的原贴,写的很详细,说到底还是自己太菜,安装python的时候错误地以为安装PyCharm就可以了,于是很自然地遇到了下面的问题:

Libsvm使用过程

       苦恼啊~~~开始以为是自己跟原贴的安装路径不一样,所以导致运行出错,一遍遍看路径都没弄好;百度后觉得肯定是自己环境变量没配置,然后努力地把PyCharm的安装路径添加到了path中(虽然人家可能并不需要),依然没解决好的我觉得自己应该编个“hello world”来看看是不是软件没装好,也是在PyChram的使用教程里我发现自己找不到python解释器,从而本小白终于知道了一个常识:      

PyCharm !=  Python

简直是蠢到可怕!!!

      好吧,发现自己需要python后我又去找python,嗯,官网下载最可靠了,我要去官网Libsvm使用过程官网说:“我在这里”。打开网页,直接点击Dowmload必须没毛病,下完exe文件,我就哼哧哼哧地照着教程开始安装了~

      咦!什么鬼???机智如我,一眼就看到了“32-bit”,哼,我们64位系统才不受这种气呢Libsvm使用过程(其实是当时自己不知道64位的系统到底能不能装32位的软件,现在知道了,一般的应用程序都可以兼容。PS:截图是复制的,自己忘了)

Libsvm使用过程

天呐,官网为什么也不把32-bit和64-bit写在最显眼的地方呢?小白一不小心就搞错了Libsvm使用过程(自己不用心还怪别人系列)于是我又去找,但是,这神马情况?64-bit在哪儿??为什么最新版还有两个???我是谁?我在哪里?我经历了什么?Libsvm使用过程

Libsvm使用过程

     哦~原来python小哥哥还有两副互相不太看得惯的面孔,哈哈哈,不明觉厉,不过好像选哪个我都只能拎酱油瓶Libsvm使用过程那好吧,就选python2了,毕竟原贴是python26呢,我要紧紧保住大神的腿~

     但是略为不幸,我连安装个小软件都会报错Libsvm使用过程(教程第5步),当时忘记截屏了,也没看太仔细,大概或许是说跟什么地方冲突了,让我解决一下,我草草点击了OK,匆忙中只觉得里边的32-bit很扎眼。行吧,我不装64位可以了吧?(其实是不会解决出现的错误)我要重新下载python3.6.5Libsvm使用过程阿甘大叔讲的没错,人生真是盒巧克力,渣渣网速终于重新下完了python3,python2就说它安装完成了,出现了步骤6的画面Libsvm使用过程Libsvm使用过程Libsvm使用过程好吧,你是大爷,你说啥是啥,只是这样耍人或许有点不太合适:

Libsvm使用过程

果然,它是骗我的,根本就没装好:

Libsvm使用过程

哈哈哈,其实应该是Python2说它完成了回滚操作,我没好好看就finish了,毕竟安装路径下也没有bin文件夹。实力甩锅Libsvm使用过程

      python3的安装很顺利,有点小小的提示:下面这个表示安装成功的界面不是DOS窗口,是打开安装好的python程序时自动出现的,并不需要输入任何指令。

Libsvm使用过程

     一时好奇的我想看看按照教程输入python会出现什么结果,于是......,一眼就提取到"%Error"字符串的我开始慌了,小小的我并不知道自己做错了什么,也不知道为什么要承受这无端的伤害,当真是无奈又委屈啊......Libsvm使用过程哈哈哈,其实下一秒我就看清楚只是没有定义而已,并不是安装失败。毕竟我是要优化核函数中的参数,并不是学习python编程,过得去就可以啦~~~

Libsvm使用过程

当然,因为在安装的过程中勾选了配置环境变量,所以DOS下面也是可以运行的~如果python安装的没毛病,而DOS窗口下又显示“python不是内部或外部指令”,那一定就是没有配置环境变量了。下面是DOS的运行情况,其实还是python下的运行结果,只是也能在DOS中运行了而已:

Libsvm使用过程


二、安装的逻辑千万不要混乱

     因为林教授的libsvm软件包里边本来就有tools文件夹,所以我把下面这段理解偏了,PyCharm、python、gnuplot全安装在了D:/libsvm-3.22/tools下面Libsvm使用过程

Libsvm使用过程

      

      其实libsvm-3.22应该独立于python、gnuplot之外,PyChram属于乱入的队伍,为了将来着想,我决定全部卸载了重新安装。python安装到D:/libsvm/optimize_tools/python36下,gnuplot安装到D:/libsvm/optimize_tools/gnuplot下,libsvm-3.22的路径为D:/libsvm/libsvm-3.22。从libsvm-3.22/tools里边的README文档中可以了解到gnuplot或许是需要安装滴~

Libsvm使用过程


三、体验Libsvm

     我是按照大神的帖子做的,可能是因为版本的原因,有点小问题,所以我重新写一遍~

     打开cmd,切换目录到libsvm-3.22软件包中的Windows子文件夹,然后输入 svm-train heart_scale train.model  指令,结果数据读取失败了,这是因为heart_scale文件在libsvm-3.22中,将其复制到Windows文件夹中即可,运行结果如下:

Libsvm使用过程

    在林教授提供的数据集里边找到了一个三分类的数据集iris.scale(heart_scale是二分类数据集),运行结果如下: 

Libsvm使用过程

   

四、Libsvm的使用

      根据林教授guide.pdf文档的指导,我们的操作流程大致如下:

Libsvm使用过程

     下面是具体的执行代码,可能是因为参数优化太重要了,所以单独拎了出来:

Libsvm使用过程


      1、数据集标准化

      我们的数据大多保存在Excel里边,在输入到svm-train.exe里边,需要先将其转化为标准的格式,具体操作参考https://blog.****.net/pangpang1239/article/details/7435842,里边提到的转换工具下载链接无效了,但是也没关系,****下载里边有好多,就是要C币,记得好像花了我朋友5个C币Libsvm使用过程讲真,有兴趣的可以自己编个程~

       2、数据集缩放

       关于数据的scaling问题,林教授官网的guide.pdf文档里边讲的很清楚(强烈推荐看一下这个文档,知其所以然才能有个全局的了解):

Libsvm使用过程

       缩放的标准指令一般是下图这样的~为了不丢失原始的数据文本,我们一般会新建一个文本文档来存放缩放后的数据集,命名的话就在原本的名字后面+“_out”(其实加_scale才是最好的),一一对应好,自己就不会弄混淆。然后再用svm-train来训练,用对应的.model文件来保存输出的结果。

Libsvm使用过程

      

       另外,这里还有一个很重要的原则需要注意:我们要用同样的方法去缩放训练集和测试集。看完下面这一段,我本以为是要注意缩放的范围一致,但看完真实的例子,我发现事情并不如想象中的这么简单Libsvm使用过程

Libsvm使用过程

例子中的训练集和测试集都缩放在[0,1]的范围内,但是因为缩放方法(method)的不同,导致了不小的差异,如果不知道我在说什么的话,可以看这里~

Libsvm使用过程

   

        3、选好核函数

        这是建模的关键,主要原则有二:

        a. 没啥特殊情况就是默认的RBF咯~因为:In general, the RBF kernel is a reasonable first choice. 接下来的参数优化也是针对RBF的,如果选了线性核函数参数选择就简单多啦Libsvm使用过程

        b. 那啥时候选线性核函数呢?大概就是样本的个数远远小于特征数的时候,因为这时候选RBF就会有种劳民伤财的感觉了,依据如下:

Libsvm使用过程

PS:关于svm函数的选择,如果是做二分类和多分类,默认的C-SCV就是合适的,不用考虑太多,哈哈哈,反正我是要做多分类的~


       4、参数优化

Libsvm使用过程

       好吧,其实参数优化并不能提高训练的精度,但它是预测分类精度有保障的核心啊~~~说到底,我们训练模型的目的不就是为了让它好好预测分类嘛!不然要它何用?Libsvm使用过程

       因为对C-SVC的参数优化用到的是grid.py文件,所以我们需要安装python;因为要以图片的形式展示优化过程,所以我们需要安装gnuplot。于是也就有了前面悲剧的安装经历,重复的工作不再赘述,这里的我们已经能在DOS下执行python程序啦!我这次没用heart_scale这个数据集,用的是上面提到的iris.scale ~

       哦,对了,这里还涉及一个路径修改的问题:

Libsvm使用过程

       简单来说呢就是右键grid.py文件,选择以“Edit with IDLE”的方式打开,然后修改下图所示倒数第1和第3行绿色部分,因为我找这个位置的时候看了好几遍,所以我把滚动条拉到最上面了截的图,其实它就在很靠前的地方,图中的路径是我已经修改过的,它们分别是svm-train.exe和gnuplot.exe所在的路径,红色的注释部分懒得改~

Libsvm使用过程


       如果稍微看下代码的话就会发现我们的修改是针对win32系统的,那如果不是win32呢?咋办?我私下以为可以把if部分给删掉,就像下图这样~哈哈,随口一说,不一定是对的Libsvm使用过程

   Libsvm使用过程

       

       还有一点小小的提示:DOS已经定位到了grid.py所在的文件夹tools,所以一定要先把数据集复制到tools里边!下面就是运行的情况,总共110条[local]记录,我们可以看到best后面有3个值,c、g、rate,这就是它辛苦寻找的参数以及交叉验证的精度了~然后它会在DOS输出的最后一行给出最优结果

Libsvm使用过程


      此外,在tools文件夹中还会多出两个文件,iris.scele.out用来存储110条[local]记录,iris.scale.png是结果图,就是下面咯~

Libsvm使用过程Libsvm使用过程


       使用easy.py的套路跟grid.py差不多,就是它还需要一个测试集,运行结果如下,最上面一行是grid.py出的结果,可以看到和easy.py的参数选择结果是一致的:

Libsvm使用过程

一下子多出7个文件,有种啥都搞定了的感觉~

Libsvm使用过程


是的,我也没感觉错~

Libsvm使用过程

easy.py就是针对纯小白的,你啥都不需要懂,准备好数据集,运行一行代码就OK了~

     此外,tools文件夹下有个subset.py程序,它可以将数据集分割为两部分,运行代码如下,100为第一个文件NewData1中保存的样本数,NewData2为剩下的样本:

Libsvm使用过程

默认的分割方法是分层抽样,还可以选择随机抽样:

Libsvm使用过程