• libsvm参数选择


    • 以前接触过libsvm,现在算在实际的应用中学习

    • LIBSVM 使用的一般步骤是:

      • 1)按照LIBSVM软件包所要求的格式准备数据集;
      • 2)对数据进行简单的缩放操作;
      • 3)首要考虑选用RBF 核函数;
      • 4)采用交叉验证选择最佳参数C与g ;
      • 5)采用最佳参数C与g 对整个训练集进行训练获取支持向量机模型;
      • 6)利用获取的模型进行测试与预测。

    参数认识

    • LIBSVM使用的数据格式该软件使用的训练数据和检验数据文件格式如下:
    [label] [index1]:[value1] [index2]:[value2] ...
    [label] [index1]:[value1] [index2]:[value2] ...
    
    • 考虑选用RBF 核函数,训练数据形成模型(model),实质是算出了wx+b=0中的w,b. Svmtrain的用法:svmtrain [options] training_set_file [model_file];其中options涵义如下:
    -s svm类型:设置SVM 类型,默认值为0,可选类型有:
    0 -- C- SVC
    1 -- nu - SVC
    2 -- one-class-SVM
    3 -- e - SVR
    4 -- nu-SVR
    
    -t 核函数类型:设置核函数类型,默认值为2,可选类型有:
    0 -- 线性核:u'*v
    1 -- 多项式核:(g*u'*v+ coef0)degree
    2 -- RBF 核:exp(-||u-v||*||u-v||/g*g)
    3 -- sigmoid 核:tanh(g*u'*v+ coef 0)
    
    -d degree:核函数中的degree设置,默认值为3;
    -g r(gama):核函数中的函数设置(默认1/ k);
    -r coef 0:设置核函数中的coef0,默认值为0;
    -c cost:设置C- SVC、e - SVR、n - SVR中从惩罚系数C,默认值为1;
    -n nu :设置nu - SVC、one-class-SVM 与nu - SVR 中参数nu ,默认值0.5;
    -p e :核宽,设置e - SVR的损失函数中的e ,默认值为0.1;
    -m cachesize:设置cache内存大小,以MB为单位(默认40):
    -e e :设置终止准则中的可容忍偏差,默认值为0.001;
    -h shrinking:是否使用启发式,可选值为0 或1,默认值为1;
    -b 概率估计:是否计算SVC或SVR的概率估计,可选值0 或1,默认0;
    -wi weight:对各类样本的惩罚系数C加权,默认值为1;
    -v n:n折交叉验证模式。
    
    • 其中-g选项中的k是指输入数据中的属性数。操作参数 -v 随机地将数据剖分为n 部分并计算交叉检验准确度和均方根误差。以上这些参数设置可以按照SVM 的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM 类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。training_set_file是要进行训练的数据集;model_file是训练结束后产生的模型文件,该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名。

    • 举个例子如下:

    *
    optimization finished, #iter = 162
    nu = 0.431029
    obj = -100.877288, rho = 0.424462
    nSV = 132, nBSV = 107
    Total nSV = 132
    现简单对屏幕回显信息进行说明:
    #iter为迭代次数,
    nu 与前面的操作参数-n nu 相同,
    obj为SVM文件转换为的二次规划求解得到的最小值,
    rho 为判决函数的常数项b,
    nSV 为支持向量个数,
    nBSV为边界上的支持向量个数,
    Total nSV为支持向量总个数。
    训练后的模型保存为文件*.model,用记事本打开其内容如下:
    svm_type c_svc % 训练所采用的svm类型,此处为C- SVC
    kernel_type rbf %训练采用的核函数类型,此处为RBF核
    gamma 0.0769231 %设置核函数中的g ,默认值为1/ k
    nr_class 2 %分类时的类别数,此处为两分类问题
    total_sv 132 %总共的支持向量个数
    rho 0.424462 %决策函数中的常数项b
    label 1 -1%类别标签
    nr_sv 64 68 %各类别标签对应的支持向量个数
    SV %以下为支持向量
    1 1:0.166667 2:1 3:-0.333333 4:-0.433962 5:-0.383562 6:-1 7:-1 8:0.0687023 9:-1 10:-0.903226 11:-1 12:-1 13:1
    0.5104832128985164 1:0.125 2:1 3:0.333333 4:-0.320755 5:-0.406393 6:1 7:1 8:0.0839695 9:1 10:-0.806452 12:-0.333333 13:0.5
    1 1:0.333333 2:1 3:-1 4:-0.245283 5:-0.506849 6:-1 7:-1 8:0.129771 9:-1 10:-0.16129 12:0.333333 13:-1
    1 1:0.208333 2:1 3:0.333333 4:-0.660377 5:-0.525114 6:-1 7:1 8:0.435115 9:-1 10:-0.193548 12:-0.333333 13:1
    

    采用交叉验证选择最佳参数C与g

    • 通常而言,比较重要的参数是 gamma (-g) 跟 cost (-c) 。而 cross validation (-v)的参数常用5。那么如何去选取最优的参数c和g呢?libsvm 的 python 子目录下面的 grid.py 可以帮助我们。

    采用的方法

    • 网格参数寻优函数(分类问题):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类似,这里不再赘述。
    
    而当你训练完了model,在用它做classification或regression之前,应该知道model中的内容,以及其含义。
    用来训练的是libsvm自带的heart数据
    model =
        Parameters: [5x1 double]
          nr_class: 2
           totalSV: 259                   % 支持向量的数目
               rho: 0.0514               %  b
             Label: [2x1 double]     %  classification中标签的个数
             ProbA: []
             ProbB: []
               nSV: [2x1 double]     %  每类支持向量的个数
            sv_coef: [259x1 double]  %   支持向量对应的Wi
               SVs: [259x13 double]  %   装的是259个支持向量
    model.Parameters参数意义从上到下依次为:
    -s svm类型:SVM设置类型(默认0)
    -t 核函数类型:核函数设置类型(默认2)
    -d degree:核函数中的degree设置(针对多项式核函数)(默认3)
    -g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数)
    -r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
    
    function [mse,bestc,bestg] = SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)
    %SVMcg cross validation by faruto
    
    %% 若转载请注明:
    % faruto and liyang , LIBSVM-farutoUltimateVersion 
    % a toolbox with implements for support vector machines based on libsvm, 2009. 
    % Software available at http://www.ilovematlab.cn
    % 
    % 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
        msestep = 0.06;
    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:acc
    [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 = 0;
    bestg = 0;
    mse = Inf;
    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) ),' -s 3 -p 0.1'];
            cg(i,j) = svmtrain(train_label, train, cmd);
            
            if cg(i,j) < mse
                mse = cg(i,j);
                bestc = basenum^X(i,j);
                bestg = basenum^Y(i,j);
            end
            
            if abs( cg(i,j)-mse )<=eps && bestc > basenum^X(i,j)
                mse = cg(i,j);
                bestc = basenum^X(i,j);
                bestg = basenum^Y(i,j);
            end
            
        end
    end
    %% to draw the acc with different c & g
    [cg,ps] = mapminmax(cg,0,1);
    figure;
    [C,h] = contour(X,Y,cg,0:msestep:0.5);
    clabel(C,h,'FontSize',10,'Color','r');
    xlabel('log2c','FontSize',12);
    ylabel('log2g','FontSize',12);
    firstline = 'SVR参数选择结果图(等高线图)[GridSearchMethod]'; 
    secondline = ['Best c=',num2str(bestc),' g=',num2str(bestg), ...
        ' CVmse=',num2str(mse)];
    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,0,1]);
    xlabel('log2c','FontSize',12);
    ylabel('log2g','FontSize',12);
    zlabel('MSE','FontSize',12);
    firstline = 'SVR参数选择结果图(3D视图)[GridSearchMethod]'; 
    secondline = ['Best c=',num2str(bestc),' g=',num2str(bestg), ...
        ' CVmse=',num2str(mse)];
    title({firstline;secondline},'Fontsize',12);
    
    
    • 分类问题,简单易用,且有可视化
    function [bestacc,bestc,bestg] = SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)
    %SVMcg cross validation by faruto
    
    %% 若转载请注明:
    % faruto and liyang , LIBSVM-farutoUltimateVersion 
    % a toolbox with implements for support vector machines based on libsvm, 2009. 
    % Software available at http://www.ilovematlab.cn
    % 
    % 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);
    
    
    

    Reference

  • 相关阅读:
    使用Android自定义格式的定义Button
    Java Binary Search
    非常成功的人会做的八件事
    Ubuntu12.04 安装java
    NetBeans 时事通讯(刊号 # 125 Nov 17, 2010)
    NetBeans IDE 7.0 Beta 发布
    关于 IPv6 你需要知道的 10 件事
    开始学习 Go
    开始学习 Go
    Quartz 1.8.4 发布
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/6869402.html
Copyright © 2020-2023  润新知