您的位置:首页 > 编程语言 > Python开发

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

2016-11-28 10:06 393 查看
Python: https://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文件。这时数据转换的问题就解决了。

csv和xls转换

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

选择最佳参数c和g

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

那么如何去选取最优的参数c和g呢?

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.py、svm-train、svm-scale和svm-predict都进行了调用(当然还有必须的python和gnuplot)。因此,运行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文件夹下命名方式为准)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息