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)。
因篇幅问题不能全部显示,请点此查看更多更全内容