您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > LibSVM笔记系列如何提升LibSVM分类效果
LibSVM笔记系列——如何提升LibSVM分类效果时间2013-07-1820:30:37CSDN博客原文===============================================================================1.'svm-scale'的使用===============================================================================[monkeyzx@CentOSlibsvm-3.14]$./svm-scaleUsage:svm-scale[options]data_filenameoptions:-llower:xscalinglowerlimit(default-1)-uupper:xscalingupperlimit(default+1)-yy_lowery_upper:yscalinglimits(default:noyscaling)-ssave_filename:savescalingparameterstosave_filename-rrestore_filename:restorescalingparametersfromrestore_filename自己使用matlab写的归一化函数为functionx=scale(x,bound,col)%bound::[bminbmax]%x::inputmatrixifnargin3col=0;endbmin=bound(1);bmax=bound(2);ifcol==0fori=1:size(x,1)xmin=min(x(i,:));xmax=max(x(i,:));x(i,:)=bmin+(bmax-bmin)*((x(i,:)-xmin)/(xmax-xmin));endelsefori=1:size(x,2)xmin=min(x(:,i));xmax=max(x(:,i));x(:,i)=bmin+(bmax-bmin)*((x(:,i)-xmin)/(xmax-xmin));endendend===============================================================================2.实际使用LibSVM的步骤===============================================================================为提高实际分类的精度和泛化能力,希望在使用LibSVM时至少按照以下步骤考虑:(1)对数据归一化,如果数据都为正数则一般归一到[0,1],否则一般归一到[-1,1](2)在没特殊要求前提下,考虑使用RBF核函数K(x,y)=exp{-gamma|x-y|^2}(3)在训练时使用交叉验证,并使用GirdSearch寻找最佳的参数C和gamma(4)尽量对训练集数据集整体训练(5)使用测试数据测试模型的分类效果===============================================================================3.关于交叉验证(CrossValidation,简称CV)===============================================================================CV是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(trainset),另一部分做为验证集(validationset),首先用训练集对分类器进行训练,在利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标.常见的交叉验证方法有:1).Hold-OutMethod将原始数据随机分为两组,一组做为训练集,一组做为验证集,利用训练集训练分类器,然后利用验证集验证模型,记录最后的分类准确率为此Hold-OutMethod下分类器的性能指标.此种方法的好处的处理简单,只需随机把原始数据分为两组即可,其实严格意义来说Hold-OutMethod并不能算是CV,因为这种方法没有达到交叉的思想,由于是随机的将原始数据分组,所以最后验证集分类准确率的高低与原始数据的分组有很大的关系,所以这种方法得到的结果其实并不具有说服性.2).K-foldCrossValidation(记为K-CV)将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为此K-CV下分类器的性能指标.K一般大于等于2,实际操作时一般从3开始取,只有在原始数据集合数据量小的时候才会尝试取2.K-CV可以有效的避免过学习以及欠学习状态的发生,最后得到的结果也比较具有说服性.3).Leave-One-OutCrossValidation(记为LOO-CV)如果设原始数据有N个样本,那么LOO-CV就是N-CV,即每个样本单独作为验证集,其余的N-1个样本作为训练集,所以LOO-CV会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此下LOO-CV分类器的性能指标.相比于前面的K-CV,LOO-CV有两个明显的优点:a.每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。b.实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。但LOO-CV的缺点则是计算成本高,因为需要建立的模型数量与原始数据样本数量相同,当原始数据样本数量相当多时,LOO-CV在实作上便有困难几乎就是不显示,除非每次训练分类器得到模型的速度很快,或是可以用并行化计算减少计算所需的时间.在LibSVM中,可以通过设置svm-train的-v参数设置交叉验证,-v表示交叉验证的分组数。===============================================================================4.关于GridSearch===============================================================================在使用RBF核函数的情况下,一般需要优化的参数有:C和gamma。C是惩罚系数,C太小,容易发生过拟合,C太大,拟合的结果和实际结果相差太大;gamma是RBF的系数,gamma的取值直接影响到能否找到一个能将多类数据分开的最优超平面。因此,建议在交叉验证过程中使用简单的GridSearch算法找到最佳的C和gamma。一般情况下不推荐使用遗传算法或粒子群优化算法,因为这些算法相对复杂,而且耗时又不一定能找到全局最优解,相对而言,GirdSearch简单也一般能找到一个恰当的解。在使用GridSearch时,一般使用对数格点。E.g.:v=5C=2^(−5),2^(−3),...,2^15,gamma=2^(−15),2^(−13),...,2^13一个在matlab上实现GridSearch的函数如下:function[bestaccbestcbestg]=svm_girdsearch(label,data,...cbound,gbound,cgstep,svm_cmd,v,opts_t,ker_func)%cmin:cstep:cmax::cost%gmin:gstep:gmax::gamma%v::crossvalidationn,default5%t::'-t'forsvmtrain%ker_func::functionhandle,usedonlyifopts_t==4%ker_func(tr_data,gamma)ifnargin8opts_t=2;elseifopts_t==4&&nargin9error('noneof@ker_func.\n');endifnargin7v=5;endifnargin6svm_cmd='';endifnargin5cstep=0.8;gstep=0.8;elsecstep=cgstep(1);gstep=cgstep(2);endifnargin4gmax=8;gmin=-8;elsegmax=gbound(2);gmin=gbound(1);endifnargin3cmax=8;cmin=-8;elsecmax=cbound(2);cmin=cbound(1);end[C,G]=meshgrid(cmin:cstep:cmax,gmin:gstep:gmax);[mn]=size(C);acc=zeros(m,n);eps=10^(-2);basenum=2;bestacc=0;bestc=1;bestg=0.1;fori=1:mforj=1:ntmp_gamma=basenum^G(i,j);tmp_C=basenum^C(i,j);cmd=[svm_cmd,'-c',num2str(tmp_C),'-g',...num2str(tmp_gamma),'-t',num2str(opts_t),'-q'];ifopts_t~=4acc(i,j)=cross_validation(label,data,cmd,v,'svmtrain');//交叉验证函数(自己写的)elseker=ker_func(data,basenum^G(i,j));//自定义核函数时,这里不用太关注acc(i,j)=cross_validation(label,ker,cmd,v,'svmtrain');endifacc(i,j)bestaccbestacc=acc(i,j);bestg=tmp_gamma;bestc=tmp_C;end%当精度差别不大时,选择C值小的一组参数值ifabs(bestacc-acc(i,j))eps&&tmp_Cbestcbestacc=acc(i,j);bestg=tmp_gamma;bestc=tmp_C;endfprintf('crossvalidation(g=%s,C=%s)finished%d%%.\n',...num2str(tmp_gamma),num2str(tmp_C),floor(100*(i*n+j)/(m*n)));endend%plotrelationshipbwtweeng/candaccfigure;meshc(C,G,acc);axis([cmin,cmax,gmin,gmax,30,100]);xlabel('log2c','FontSize',10);ylabel('log2g','FontSize',10);zlabel('Accuracy(%)','FontSize',10);firstline='[GridSearchMethod]';secondline=['Bestc=',num2str(bestc),'g=',num2str(bestg),...'CVAccuracy=',num2str(bestacc),'%'];title({firstline;secondline},'Fontsize',10);end===============================================================================5.非平衡数据===============================================================================按照支持向量机使用超平面分类的原理,不平衡数据不会对
本文标题:LibSVM笔记系列如何提升LibSVM分类效果
链接地址:https://www.777doc.com/doc-2884561 .html