zoukankan      html  css  js  c++  java
  • paper 36 :[教程] 基于GridSearch的svm参数寻优

    尊重原创~~~

    转载出处:http://www.matlabsky.com/thread-12411-1-1.html

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

    以下内容摘自《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。
    网格参数寻优函数(回归问题):SVMcgForRegress
    [bestCVmse,bestc,bestg]= 
    SVMcgForRegress(train_label,train,
    cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)
    其输入输出与SVMcgForClass类似,这里不再赘述。
    SVMcgForClass.m源代码:

    function [bestacc,bestc,bestg] = SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)
    %SVMcg cross validation by faruto

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

    %% 若转载请注明:
    % faruto and liyang , LIBSVM-farutoUltimateVersion
    % a toolbox with implements for support vector machines based on libsvm, 2009.
    %
    % Chih-Chung Chang and Chih-Jen Lin, LIBSVM : a library for
    % support vector machines, 2001. Software available at
    % http://www.csie.ntu.edu.tw/~cjlin/libsvm

    %% about the parameters of SVMcg
    if nargin < 10
    accstep = 4.5;
    end
    if nargin < 8
    cstep = 0.8;
    gstep = 0.8;
    end
    if nargin < 7
    v = 5;
    end
    if nargin < 5
    gmax = 8;
    gmin = -8;
    end
    if nargin < 3
    cmax = 8;
    cmin = -8;
    end
    %% X:c Y:g cg:CVaccuracy
    [X,Y] = meshgrid(cmin:cstep:cmax,gmin:gstep:gmax);
    [m,n] = size(X);
    cg = zeros(m,n);

    eps = 10^(-4);

    %% record acc with different c & g,and find the bestacc with the smallest c
    bestc = 1;
    bestg = 0.1;
    bestacc = 0;
    basenum = 2;
    for i = 1:m
    for j = 1:n
    cmd = ['-v ',num2str(v),' -c ',num2str( basenum^X(i,j) ),' -g ',num2str( basenum^Y(i,j) )];
    cg(i,j) = svmtrain(train_label, train, cmd);

    if cg(i,j) <= 55
    continue;
    end

    if cg(i,j) > bestacc
    bestacc = cg(i,j);
    bestc = basenum^X(i,j);
    bestg = basenum^Y(i,j);
    end

    if abs( cg(i,j)-bestacc )<=eps && bestc > basenum^X(i,j)
    bestacc = cg(i,j);
    bestc = basenum^X(i,j);
    bestg = basenum^Y(i,j);
    end

    end
    end
    %% to draw the acc with different c & g
    figure;
    [C,h] = contour(X,Y,cg,70:accstep:100);
    clabel(C,h,'Color','r');
    xlabel('log2c','FontSize',12);
    ylabel('log2g','FontSize',12);
    firstline = 'SVC参数选择结果图(等高线图)[GridSearchMethod]';
    secondline = ['Best c=',num2str(bestc),' g=',num2str(bestg), ...
    ' CVAccuracy=',num2str(bestacc),'%'];
    title({firstline;secondline},'Fontsize',12);
    grid on;

    figure;
    meshc(X,Y,cg);
    % mesh(X,Y,cg);
    % surf(X,Y,cg);
    axis([cmin,cmax,gmin,gmax,30,100]);
    xlabel('log2c','FontSize',12);
    ylabel('log2g','FontSize',12);
    zlabel('Accuracy(%)','FontSize',12);
    firstline = 'SVC参数选择结果图(3D视图)[GridSearchMethod]';
    secondline = ['Best c=',num2str(bestc),' g=',num2str(bestg), ...
    ' CVAccuracy=',num2str(bestacc),'%'];
    title({firstline;secondline},'Fontsize',12);

    您可以直接下载
    libsvm-mat-2.89-3[FarutoUltimate3.0]
    http://www.matlabsky.com/forum-v ... -fromuid-18677.html

    进行使用

    更多关于SVM的请看:
    关于SVM的那点破事[长期更新整理 by faruto]
    http://www.matlabsky.com/forum-v ... -fromuid-18677.html

  • 相关阅读:
    开启CTF大门
    关于windows下scapy出现log_runtime问题
    Python关于Threading暂停恢复解决办法
    angr入门之CLE
    Linux信号量
    IDApython 命令
    Array 数组对象
    随机数 random()
    四舍五入round()
    向下取整floor()
  • 原文地址:https://www.cnblogs.com/molakejin/p/5246603.html
Copyright © 2011-2022 走看看