libsvm学习记录(三)svm参数寻优

基于GridSearch的svm参数寻优

http://www.matlabsky.com/thread-12411-1-1.html

交叉验证(Cross Validation)方法思想简介
http://www.matlabsky.com/forum-v ... -fromuid-18677.html

还有以下两种 没有解释 只有代码 直接见原链接

基于GA的svm参数寻优
http://www.matlabsky.com/thread-12412-1-1.html

基于PSO的svm参数寻优
http://www.matlabsky.com/thread-12414-1-1.html


交叉验证(CrossValidation)方法思想简介

以下简称交叉验证(Cross Validation)为CV.CV是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set),首先用训练集对分类器进行训练,在利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标.常见CV的方法如下:

1).Hold-Out Method

将原始数据随机分为两组,一组做为训练集,一组做为验证集,利用训练集训练分类器,然后利用验证集验证模型,记录最后的分类准确率为此Hold-OutMethod下分类器的性能指标.此种方法的好处的处理简单,只需随机把原始数据分为两组即可,其实严格意义来说Hold-Out Method并不能算是CV,因为这种方法没有达到交叉的思想,由于是随机的将原始数据分组,所以最后验证集分类准确率的高低与原始数据的分组有很大的关系,所以这种方法得到的结果其实并不具有说服性.

2).K-fold Cross Validation(记为K-CV)

将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为此K-CV下分类器的性能指标.K一般大于等于2,实际操作时一般从3开始取,只有在原始数据集合数据量小的时候才会尝试取2.K-CV可以有效的避免过学习以及欠学习状态的发生,最后得到的结果也比较具有说服性.

3).Leave-One-Out Cross Validation(记为LOO-CV)

如果设原始数据有N个样本,那么LOO-CV就是N-CV,即每个样本单独作为验证集,其余的N-1个样本作为训练集,所以LOO-CV会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此下LOO-CV分类器的性能指标.相比于前面的K-CV,LOO-CV有两个明显的优点:

每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。
实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。

但LOO-CV的缺点则是计算成本高,因为需要建立的模型数量与原始数据样本数量相同,当原始数据样本数量相当多时,LOO-CV在实作上便有困难几乎就是不显示,除非每次训练分类器得到模型的速度很快,或是可以用并行化计算减少计算所需的时间.


SVM参数寻优

以下内容摘自《MATLAB 神经网络30个案例分析》第13章:

关于SVM参数的优化选取,国际上并没有公认统一的最好的方法,现在目前常用的方法就是让c和g在一定的范围内取值,对于取定的c和g对于把训练集作为原始数据集利用K-CV方法得到在此组c和g下训练集验证分类准确率,最终取使得训练集验证分类准确率最高的那组c和g做为最佳的参数,但有一个问题就是可能会有多组的c和g对应于最高的验证分类准确率,这种情况怎么处理?这里采用的手段是选取能够达到最高验证分类准确率中参数c最小的那组c和g做为最佳的参数,如果对应最小的c有多组g,就选取搜索到的第一组c和g做为最佳的参数。这样做的理由是:过高的c会导致过学习状态发生,即训练集分类准确率很高而测试集分类准确率很低(分类器的泛化能力降低),所以在能够达到最高验证分类准确率中的所有的成对的c和g中认为较小的惩罚参数c是更佳的选择对象。


以上的寻参思想在libsvm-mat-2.89-3[FarutoUltimate3.0]工具箱中已经实现SVMcgForClass.m (分类问题寻优)、SVMcgForRegress.m (回归问题参数寻优):

函数使用接口介绍如下:
网格参数寻优函数(分类问题):SVMcgForClass

[bestCVaccuracy,bestc,bestg]= SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)
输入:
train_label:训练集的标签,格式要求与svmtrain相同。
train:训练集,格式要求与svmtrain相同。
cmin,cmax:惩罚参数c的变化范围,即在[2^cmin,2^cmax]范围内寻找最佳的参数c,默认值为cmin=-8,cmax=8,即默认惩罚参数c的范围是[2^(-8),2^8]。
gmin,gmax:RBF核参数g的变化范围,即在[2^gmin,2^gmax]范围内寻找最佳的RBF核参数g,默认值为gmin=-8,gmax=8,即默认RBF核参数g的范围是[2^(-8),2^8]。
v:进行Cross Validation过程中的参数,即对训练集进行v-fold Cross Validation,默认为3,即默认进行3折CV过程。
cstep,gstep:进行参数寻优是c和g的步进大小,即c的取值为2^cmin,2^(cmin+cstep),…,2^cmax,,g的取值为2^gmin,2^(gmin+gstep),…,2^gmax,默认取值为cstep=1,gstep=1。
accstep:最后参数选择结果图中准确率离散化显示的步进间隔大小([0,100]之间的一个数),默认为4.5。
输出:
bestCVaccuracy:最终CV意义下的最佳分类准确率。
bestc:最佳的参数c。
bestg:最佳的参数g。

SVMcgForClass.m源代码:
  1. function [bestacc,bestc,bestg] = SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)
  2. %SVMcg cross validation by faruto

  3. %%
  4. % by faruto
  5. %Email:patrick.lee@foxmail.com QQ:516667408 http://blog.sina.com.cn/faruto BNU
  6. %last modified 2010.01.17

  7. %% 若转载请注明:
  8. % faruto and liyang , LIBSVM-farutoUltimateVersion 
  9. % a toolbox with implements for support vector machines based on libsvm, 2009. 

  10. % Chih-Chung Chang and Chih-Jen Lin, LIBSVM : a library for
  11. % support vector machines, 2001. Software available at
  12. % http://www.csie.ntu.edu.tw/~cjlin/libsvm

  13. %% about the parameters of SVMcg 
  14. if nargin < 10
  15.     accstep = 4.5;
  16. end
  17. if nargin < 8
  18.     cstep = 0.8;
  19.     gstep = 0.8;
  20. end
  21. if nargin < 7
  22.     v = 5;
  23. end
  24. if nargin < 5
  25.     gmax = 8;
  26.     gmin = -8;
  27. end
  28. if nargin < 3
  29.     cmax = 8;
  30.     cmin = -8;
  31. end
  32. %% X:c Y:g cg:CVaccuracy
  33. [X,Y] = meshgrid(cmin:cstep:cmax,gmin:gstep:gmax);
  34. [m,n] = size(X);
  35. cg = zeros(m,n);

  36. eps = 10^(-4);

  37. %% record acc with different c & g,and find the bestacc with the smallest c
  38. bestc = 1;
  39. bestg = 0.1;
  40. bestacc = 0;
  41. basenum = 2;
  42. for i = 1:m
  43.     for j = 1:n
  44.         cmd = ['-v ',num2str(v),' -c ',num2str( basenum^X(i,j) ),' -g ',num2str( basenum^Y(i,j) )];
  45.         cg(i,j) = svmtrain(train_label, train, cmd);
  46.         
  47.         if cg(i,j) <= 55
  48.             continue;
  49.         end
  50.         
  51.         if cg(i,j) > bestacc
  52.             bestacc = cg(i,j);
  53.             bestc = basenum^X(i,j);
  54.             bestg = basenum^Y(i,j);
  55.         end        
  56.         
  57.         if abs( cg(i,j)-bestacc )<=eps && bestc > basenum^X(i,j) 
  58.             bestacc = cg(i,j);
  59.             bestc = basenum^X(i,j);
  60.             bestg = basenum^Y(i,j);
  61.         end        
  62.         
  63.     end
  64. end
  1. %% to draw the acc with different c & g
  2. figure;
  3. [C,h] = contour(X,Y,cg,70:accstep:100);
  4. clabel(C,h,'Color','r');
  5. xlabel('log2c','FontSize',12);
  6. ylabel('log2g','FontSize',12);
  7. firstline = 'SVC参数选择结果图(等高线图)[GridSearchMethod]'; 
  8. secondline = ['Best c=',num2str(bestc),' g=',num2str(bestg), ...
  9.     ' CVAccuracy=',num2str(bestacc),'%'];
  10. title({firstline;secondline},'Fontsize',12);
  11. grid on; 

  12. figure;
  13. meshc(X,Y,cg);
  14. % mesh(X,Y,cg);
  15. % surf(X,Y,cg);
  16. axis([cmin,cmax,gmin,gmax,30,100]);
  17. xlabel('log2c','FontSize',12);
  18. ylabel('log2g','FontSize',12);
  19. zlabel('Accuracy(%)','FontSize',12);
  20. firstline = 'SVC参数选择结果图(3D视图)[GridSearchMethod]'; 
  21. secondline = ['Best c=',num2str(bestc),' g=',num2str(bestg), ...
  22.     ' CVAccuracy=',num2str(bestacc),'%'];
  23. title({firstline;secondline},'Fontsize',12);
复制代码
格式有点断截……

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值