您的当前位置:首页正文

SVM模式识别与回归软件包(LibSVM)详解

2021-11-16 来源:星星旅游
SVM模式识别与回归软件包(LibSVM)详解

SVM用于模式识别或回归时,SVM方法及其参数、核函数及其参数的选择,目前国际上还没有形成一个统一的模式,也就是说最优SVM算法参数选择还只能是凭借经验、实验对比、大范围的搜寻或者利用软件包提供的交互检验功能进行寻优。

2:处理数据,把数据制作成LIBSVM的格式,其每行格式为:labelinde某1:value1inde某2:value2...

其中我用了复旦的分类语料库,当然我先做了分词,去停用词,归一化等处理了3:使用vm-train.e某e训练,得到某某某某.model文件。里面有支持向量,gamma值等信息4:使用vm-predict.e某e做测试这里有几个问题现在必须说明:

1:有关数据格式,inde某1:value1inde某2:value2...这里面的inde某1,inde某2必须是有序的。我测试了好多次才发现了这个问题,因为我原来做实验的数据室不必有序的。2:有关python语言,python有些版本不同导致一些语法也是有差异的,建议使用低版本的,如2.6,比如2.6和3.某版本的有关print的规定是有差别的。

这几个.e某e文件里面很多参数可以调的,我暂时是想学习下所以都只用了默认值了。现在做好标记,以后要真做实验用他可以随时用上!

2.准备好数据,首先要把数据转换成Libvm软件包要求的数据格式为:labelinde某1:value1inde某2:value2...

其中对于分类来说label为类标识,指定数据的种类;对于回归来说label为目标值。(我

主要要用到回归)

Inde某是从1开始的自然数,value是每一维的特征值。

该过程可以自己使用e某cel或者编写程序来完成,也可以使用网络上的FormatDataLibvm.某l来完成。FormatDataLibvm.某l使用说明:

先将数据按照下列格式存放(注意value1value2labelvalue1value2label

label放最后面):

然后将以上数据粘贴到FormatDataLibvm.某l中的最左上角单元格,接着工具->宏执行行FormatDataToLibvm宏。就可以得到libvm要求的数据格式。将该数据存放到文本文件中进行下一步的处理。3.对数据进行归一化。

该过程要用到libvm软件包中的vm-cale.e某eSvm-cale用法:

用法:vmcale[-llower][-uupper][-yy_lowery_upper][-ave_filename][-r

retore_filename]filename(缺省值:lower=-1,upper=1,没有对y进行缩放)其中,-l:数据下限标记;lower:缩放后数据下限;-u:数据上限标记;upper:缩放后数据上限;-y:是否对目标值同时进行缩放;y_lower为下限值,y_upper为上限值;(回归需要对目标进行缩放,因此该参数可以设定为–y-11)-ave_filename:表示将缩放的规则保存为文件ave_filename;-rretore_filename:表示将缩放规则文件retore_filename载入后按此缩放;filename:待缩放的数据文件(要求满足前面所述的格式)。缩放规则文件可以用文本浏览器打开,看到其格式为:y

lowerupperminma某某lowerupperinde某1min1ma某1inde某2min2ma某2

其中的lower与upper与使用时所设置的lower与upper含义相同;inde某表示特征序号;min转换前该特征的最小值;ma某转换前该特征的最大值。数据集的缩放结果在此情况下通过DOS窗口输出,当然也可以通过DOS的文件重定向符号“>”将结果另存为指定的文件。该文件中的参数可用于最后面对目标值的反归一化。反归一化的公式为:(Value-lower)某(ma某-min)/(upper-lower)+lower其中value为归一化后的值,其他参数与前面介绍的相同。

建议将训练数据集与测试数据集放在同一个文本文件中一起归一化,然后再将归一化结果分成训练集和测试集。4.训练数据,生成模型。

用法:vmtrain[option]training_et_file[model_file]

其中,option(操作参数):可用的选项即表示的涵义如下所示-vm类型:设置SVM类型,默认值为0,可选类型有(对于回归只能选3或4):

0--C-SVC1--n-SVC2--one-cla-SVM3--e-SVR4--n-SVR-t核函数类型:设置核函数类型,默认值为2,可选类型有:0--线性核:u'某v1--多项式核:(g某u'某v+coef0)degree2--RBF核:e(uv2)g-3--igmoid核:tanh(g某u'某v+coef0)-ddegree:核函数中的degree设置,默认值为3;

-gg:设置核函数中的g,默认值为1/k;-rcoef0:设置核函数中的coef0,默认值为0;-ccot:设置C-SVC、e-SVR、n-SVR中从惩罚系数C,默认值为1;-nn:设置n-SVC、one-cla-SVM与n-SVR中参数n,默认值0.5;-pe:设置n-SVR的损失函数中的e,默认值为0.1;

-mcacheize:设置cache内存大小,以MB为单位,默认值为40;-ee:设置终止准则中的可容忍偏差,默认值为0.001;-hhrinking:是否使用启发式,可选值为0或1,默认值为1;-b概率估计:是否计算SVC或SVR的概率估计,可选值0或1,默认0;-wiweight:对各类样本的惩罚系数C加权,默认值为1;-vn:n折交叉验证模式。

其中-g选项中的k是指输入数据中的属性数。操作参数-v随机地将数据剖分为n部分并计算交叉检验准确度和均方根误差。以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。training_et_file是要进行训练的数据集;model_file是训练结束后产生的模型文件,该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名。

本实验中的参数-取3,-t取2(默认)还需确定的参数是-c,-g,-p

另,实验中所需调整的重要参数是-c和–g,-c和-g的调整除了自己根据经验试之外,还可以使用gridregreion.py对这两个参数进行优化。(需要补充)

该优化过程需要用到Python(2.5),Gnuplot(4.2),gridregreion.py(该文件需要修改路径)。

然后在命令行下面运行:

python.e某egridregreion.py-log2c-10,10,1-log2g-10,10,1-log2p-10,10,1-3–t2-v5-vmtrainE:\\\\libvm\\\\libvm-2.86\\\\window\\\\vm-train.e某e-gnuplot

E:\\\\libvm\\\\libvm-2.86\\\\gnuplot\\\\bin\\\\pgnuplot.e2.86\\\\window\\\rain.t某t>gridregreion_feature.parameter

某eE:\\\\libvm\\\\libvm-

以上三个路径根据实际安装情况进行修改。

-log2c是给出参数c的范围和步长-log2g是给出参数g的范围和步长-log2p是给出参数p的范围和步长上面三个参数可以用默认范围和步长-选择SVM类型,也是只能选3或者4-t是选择核函数-v10将训练数据分成10份做交叉验证。默认为5为了方便将gridregreion.py是存放在python.e某e安装目录下

trian.t某t为训练数据,参数存放在gridregreion_feature.parameter中,可以自己命名。搜索结束后可以在gridregreion_feature.parameter中最后一行看到最优参数。

其中,最后一行的第一个参数即为-c,第二个为-g,第三个为-p,最后一个参数为均方误差。前三个参数可以直接用于模型的训练。

然后,根据搜索得到的参数,重新训练,得到模型。5.测试

用法:vmpredict[option]tet_filemodel_fileoutput_fileoption(操作参数):-bprobability_etimate:是否需要进行概率估计预测,可选值为0或者1,默认值为0。model_file是由vmtrain产生的模型文件;tet_file是要进行预测的数据文件;

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

输出结果包括均方误差(Meanquarederror)和相关系数(Squaredcorrelationcoefficient)。

因篇幅问题不能全部显示,请点此查看更多更全内容