libsvm的使用(Python、gnuplot的下载安装)

来源:互联网 发布:2017淘宝互刷群 编辑:程序博客网 时间:2024/05/28 09:33

Pythonhttps://www.python.org/downloads/ 
Gnuplot: 
https://sourceforge.net/projects/gnuplot/files/gnuplot/ 
LIBSVM: 
http://www.csie.ntu.edu.tw/~cjlin/ 
测试数据集:http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/


1、libSVM的数据格式转换:

数据有很多存储格式,txt格式,xls格式,data格式,csv格式等等,这些数据格式之间都可以互相转换,在此介绍一下xls如何生成libsvm格式的数据。

生成libsvm数据有两种方法,在此介绍使用FormatDatalibsvm工具,因为这种方法直观简单,效率高,方便易行。其实只是利用了excel的宏。

一、.xls格式——>svm格式的转换

①    下载FormatDatalibsvm.xls  地址如下:

http://download.csdn.net/detail/smilehehe110/9702456

准备好Excel数据集

如果是csv格式的可以先通过Excel转换成.xls格式,具体方法见下面。

打开FormatDatalibsvm.xls

注意上方会出现一个框框提醒你宏已经被禁用,一定要点击更改,启用宏

加载data

可以直接将数据复制到topleft单元格,注意复制的时候复制数据区域相关的属性,要复制属性名称,否则会崩溃。

转换

Excel界面点击

“工具”—>”宏”—>”宏”—>FormatDatatoLibsvm>执行

“视图”—>”宏”—>”查看宏”——>FormatDatatoLibsvm>执行

可以看到数据在进行转换和移动,稍等一下就可以看到数据变成了libsvm格式。

等数据转换完成后,将该文件保存为.txt文件。这时数据转换的问题就解决了。

csvxls转换

有时候一开始拿到的数据时csv格式的,想把它转换成Excel原始格式,可以按照以下方式进行:

②   打开Excel,新建一空白文档。

②   在界面中单击“数据”—>“自文本”。找到并选中csv文件“源文件.csv”,单击“导入”。

操作会弹出一个窗口,不用做任何操作,点击下一步。

③在下一个界面根据分隔符类型选择相应符号,如逗号、分号等,选择后点击下一步

③   接着点击下一步,如果需要更改数据格式可做调整。

④   点击完成,弹出一个窗口,选择数据的存放位置,完成操作,可以看到数据变成了最原始的xls格式。 

 

二、.txt格式——>svm格式的转换

        首先说明的是,这里所提的.txt文本数据是指数据文件带有逗号、空格、顿号、分号等数据分离符号的数据文件。因为其用符号来分离,导致所有数据项都归类为一个属性,无法实现上面2步骤的格式输入,也就无法实现正确结果格式的输出了。

      为了解决该问题,转换该过程与上面过程的最大不同就在于:

在打开该.txt文件的时候根据文本数据本身的数据特点将其所包含的逗号、分号、制表符等数据分离的符号去掉;

具体的做法是:转换运行FormatDataLibsvm.xls文件”->“打开”->选择要打开的data.txt文件,接着在文本导入向导中根据data.txt文件本身的数据特点选择原始数据类型(分隔符号);接着选择分隔符号的类型(目的是使得该数据分成独立的一列列数据,分离成功的话,在数据预览中将可以看到一列列分离独立的数据) :选择列数据格式常规->完成;

这时候只要调整上面过程的数据格式,重复其后面的步骤23操作即可。

总结:数据最终要从.xlslibSVM进行格式转换

2、(Subset.py的用法)样本子集的选择:

1、定位到tools目录下

cd  C:\libsvm-3.21\tools

2、>python subset.py  heart_scale 200  heart_train  heart_test

结果:tools目录下多出2个文件夹heart_train和heart_test文件,数据集大小分别为200和70(原数据集heart_scale有270条数据)

 

Python:

Usage:  subset.py  [options]  dataset number  [output1] [output2]

options:

-s method : method of selection (default 0)

     0 -- stratifiedselection (classification only)

     1 -- randomselection

 

output1 : the subset (optional)

output2 : the rest of data (optional)

Example:

>python  subset.py  heart_scale  100  file1  file2

3、grid.py的用法)参数选择:

     Python:

Usage:  grid.py  [grid_options]  [svm_options] dataset

  grid_options :

-log2c {begin,end,step| "null"} : set the range of c (default -5,15,2)

    begin,end,step --c_range = 2^{begin,...,begin+k*step,...,end}

   "null"         -- do notgrid with c

-log2g {begin,end,step| "null"} : set the range of g (default 3,-15,-2)

    begin,end,step --g_range = 2^{begin,...,begin+k*step,...,end}

   "null"         -- do notgrid with g

-v n : n-fold crossvalidation (default 5)

-svmtrain {pathname} : setsvm executable path and name

-gnuplot {pathname |"null"} :

    pathname -- setgnuplot executable path and name

   "null"   -- do not plot

-out {pathname |"null"} : (default dataset.out)

    pathname -- setoutput file path and name

   "null"   -- do notoutput file

-png pathname : setgraphic output file path and name (default dataset.png)

-resume [pathname] :resume the grid task using an existing output file (default pathname isdataset.out)

 

svm_options : additionaloptions for svm-train

example:

>python  grid.py -log2c -5,5,1-log2g -4,0,1 -v 5 -m 300  heart_scale

>python grid.py -log2c -5,5,1 -svmtrain "c:\ProgramFiles\libsvm\windows\svm-train.exe" -gnuplotc:\tmp\gnuplot\binary\pgnuplot.exe -v 10 heart_scale

Output: two files

dataset.png: the CV accuracy contour plot generated bygnuplot

dataset.out: the CV accuracy at each (log2(C),log2(gamma))

 

The following example saves running time by loading theoutput file of a previous run.

> python grid.py -log2c -7,7,1 -log2g -5,2,1 -v 5 -resumeheart_scale.out heart_scale

选择最佳参数cg

通常而言,比较重要的参数是 gamma(-g) 跟 cost(-c) 。而 crossvalidation (-v)的参数常用5。

       那么如何去选取最优的参数cg呢? 

Windows用户,需要安装gnuplot,非解压

      libsvm 的 tools目录下的 grid.py 可以帮助我们。 此时,其中需要安装python3.5(一般默认安装到c:/python35-32下),安装成功之后修改环境变量,将Python的安装路径添加到计算机的环境变量path中去;安装gnuplot(我安装到了c:/gnuplot504)

        安装完毕后,进入/libsvm/tools目录下,用文本编辑器(最好是IDLE)修改grid.py文件,找到其中关于gnuplot路径(c:/gnuplot504/bin)的那项(其默认路径为gnuplot_exe=r"c:/tmp/gnuplot/bin/pgnuplot.exe"),根据实际路径进行修改,本例即用"c:/gnuplot504/bin/gnnuplot.exe"代替"c:/tmp/gnuplot/bin/pgnuplot.exe",并保存。

   (注意看清楚bin目录下的exe文件名称,新版旧版有所差别

然后,将grid.py和样本文件(heart_scale)文件置于同一目录下。

打开cmd,先定位到grid.py所在文件夹的位置:

cmd窗口中键入:cd C:\libsvm-3.21\tools

python  grid.py heart-scale 执行后,即可得到最优参数c和g。

注意grid.Py文件中关于gnuplot路径的那项路径一定要根据实际路径修改

不修改路径的话,需要执行程序的时候给出详细路径信息:

>grid.py  -log2c -5,5,1  -svmtrain"C:\libsvm-3.21\windows\svm-train.exe"  -gnuplot C:\gnuplot504\bin\gnuplot.exe  -v  10  heart_scale

如果能看到程序执行结果,说明libsvm和python之间的接口已经配置完成,以后就可以直接在python程序里调用libsvm的函数了!

1、修改gnuplot的路径

C:\gnuplot504\bin\gnuplot.exe

2、定位到tools目录下

cd  C:\libsvm-3.21\tools

3、>python  grid.py heart-scale

     结果输出:  grid.py输出两个文件 

    1. dataset.png: the CV accuracy contourplot generated by gnuplot,测试heart_scale,输出heart_scale.png图像在tools目录下,该图像显示了数据集名称以及最优(c,g)和best_rate。

   2. dataset.out:  the CV accuracy ateach (log2(C),log2(gamma)),输出每一个(c,g)组以及交叉验证结果。

   以下为中间执行结果:

   

使用grid.py是默认的取值范围,可以根据实际情况进行修改。

关于SVM参数的优化选取,国际上并没有公认统一的最好的方法,现在目前常用的方法就是让cg在一定的范围内取值,对于取定的c和g对于把训练集作为原始数据集利用K-CV方法得到在此组c和g下训练集验证分类准确率,最终取使得训练集验证分类准确率最高的那组c和g做为最佳的参数。

但有一个问题就是可能会有多组的c和g对应于最高的验证分类准确率,这种情况怎么处理?

这里采用的手段是选取能够达到最高验证分类准确率中参数c最小的那组c和g做为最佳的参数,如果对应最小的c有多组g,就选取搜索到的第一组c和g做为最佳的参数。

这样做的理由是:过高的c会导致过学习状态发生,即训练集分类准确率很高而测试集分类准确率很低(分类器的泛化能力降低),所以在能够达到最高验证分类准确率中的所有的成对的c和g中认为较小的惩罚参数c是更佳的选择对象。

4、(checkdata.py的用法)LibSVM格式检查:

  Usage:  checkdata.py  dataset

  > cat bad_data

1 3:1 2:4

> python  checkdata.py  bad_data

line 1: feature indices must be in an ascending order,previous/current features 3:1 2:4

Found 1 lines with error.

 

1、定位到tools目录下

cd  C:\libsvm-3.21\tools

2、>python checkdata.pyheart_scale


5、Easy.py的用法)一条龙服务:

文件easy.py对样本文件做了“一条龙服务”,从参数优选,到文件预测。因此,其对grid.pysvm-trainsvm-scalesvm-predict都进行了调用(当然还有必须的pythongnuplot)。因此,运行easy.py需要保证这些文件的路径都要正确。当然还需要样本文件和预测文件,这里样本文件还是用heart_scale,预测文件我们复制一份然后改名heart_test

(注意:easy.py和样本文件(heart_scale)、测试文件(heart_test)位于同一目录tools下)

1、修改gnuplot的路径

    C:\gnuplot504\bin\gnuplot.exe

2、定位到tools目录下

cd  C:\libsvm-3.21\tools

3> python easy.py  heart_scale heart_test


参数解读:

Scaling training data...归一化数据

Cross validation...在训练集上做交叉验证

Best c=2048.0,g=0.0001220703125  CV rate=84.0741

(通过网格搜索法对每个参数对做交叉验证,选择交叉验证精度最高所对应的参数.)

Training... ( 将上面得到的参数对在训练集合上做模型训练)

Output model:  heart_scale.model  (保存模型到文件)

Scaling testingdata...  (归一化数据)

Testing... (用训练得出的模型对测试集进行测试)

Accuracy = 87.8049%(36/41) (classification)(测试的精度)

Output prediction: heart_test.predict(输出预测结果)

(在交叉验证过程中,会有一个图形界面显示参数选择的情况,这就是gnuplot.exe的作用了)

SVM-scale操作:

用法:svmscale [-l  lower] [-u  upper] [-y  y_lower y_upper] 

[-s  save_filename] [-r restore_filename]  filename 

(缺省值: lower = -1,upper = 1,没有对y进行缩放) 其中, 

-l:数据下限标记;lower:缩放后数据下限; -u:数据上限标记;upper:缩放后数据上限; 

-y:是否对目标值同时进行缩放;y_lower为下限值,y_upper为上限值; 

-s save_filename:表示将缩放的规则保存为文件save_filename; 

-r restore_filename:表示将缩放规则文件restore_filename载入后按此缩放; filename:待缩放的数据文件(要求满足前面所述的格式)。

数据集的缩放结果在此情况下通过DOS窗口输出,当然也可以通过DOS的文件重定向符号“>”将结果另存为指定的文件。

使用实例: 

    1)svm-scale –s  train3.range  train3> train3.scale  

表示采用缺省值(即对属性值缩放到[1,1]−的范围,对目标值不进行缩放)对数据集train3进行缩放操作,其结果缩放规则文件保存为train3.range,缩放集的缩放结果保存为train3.scale。 

    2)svm-scale  -r train3.range  test3> test3.scale 

表示载入缩放规则train3.range后按照其上下限对应的特征值和上下限值线性的地对数据集test3进行缩放,结果保存为test3.scale。

    3)svm-scale  tran4>train4_scale  (默认缩放范围[-1,1]

SVM-train操作

svmtrain实现对训练数据集的训练,获得SVM模型。 

用法: svmtrain  [options] training_set_file  [model_file] 

options(操作参数):可用的选项即表示的涵义如下所示 

-s svm类型:设置SVM类型,默认值为0

-t 核函数类型:设置核函数类型,默认值为2

-d degree:核函数中的degree设置,默认值为3;

-g γ:设置核函数中的γ,默认值为1/k; -r 0coef:设置核函数中的0coef,默认值为0;  

-c cost:设置CSVC−、SVRε−、SVRν−中从惩罚系数C,默认值为1; -n ν:设置SVCν−、oneclassSVM−−与SVRν− 中参数ν,默认值0.5;

 -p ε:设置SVRν−的损失函数中的ε,默认值为0.1; 

-m cachesize:设置cache内存大小,以MB为单位,默认值为40;

 -e  ε:设置终止准则中的可容忍偏差,默认值为0.001;

 -h shrinking:是否使用启发式,可选值为0或1,默认值为1; 

-b 概率估计:是否计算SVC或SVR的概率估计,可选值0或1,默认0; -wi weight:对各类样本的惩罚系数C加权,默认值为1;

 -v n:n折交叉验证模式。  

其中-g选项中的k是指输入数据中的属性数。操作参数 -v 随机地将数据剖分为n部分并计算交叉检验准确度和均方根误差。以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;

如果应有的参数设置不正确,参数将采用默认值。

training_set_file是要进行训练的数据集;model_file是训练结束后产生的模型文件,该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名。

使用实例: 

1)svmtrain  train3.scale  train3.model 

训练train3.scale,将模型保存于文件train3.model,并在dos窗口中输出如下结果: 

optimization finished, #iter = 1756 nu = 0.464223 

obj = -551.002342, rho = -0.337784 nSV = 604, nBSV = 557 Total nSV = 604

SVM-predict操作

svmpredict是根据训练获得的模型,对数据集合进行预测。 

用法:svmpredict  [options] test_file  model_file output_file 

options(操作参数): 

-b probability_estimates:是否需要进行概率估计预测,可选值为0或者1,默认值为0。 

model_file是由svmtrain产生的模型文件;

test_file是要进行预测的数据文件;即使不知道label的值,也要任意填一个

output_file是svmpredict的输出文件,表示预测的结果值。

  

(注:Windows文件夹下有*.exe文件,tools文件夹下有*.py,为了方便运行测试,可以把所有的*.py都移到Windows下,然后一直在windows下运行,不用更换路径;  新旧版某些*.exe文件名所有差别,以windows文件夹下命名方式为准)

 

0 0
原创粉丝点击