【问题标题】:Grid search error in LIBSVM while optimizing C, g parameters优化 C、g 参数时 LIBSVM 中的网格搜索错误
【发布时间】:2015-02-17 11:01:47
【问题描述】:

我正在使用 libsvm 来解决一类分类问题。我正在尝试为不同的内核(多项式、线性和 rbf)选择理想的 C 和 gamma 参数 我正在使用建议的 matlab 代码,该代码通过 v-fold 验证技术找到最佳参数。

bestcv = 0;
for log2c = -1:3,
  for log2g = -4:1,
    cmd = ['-v 5 -c ', num2str(2^log2c), ' -g ', num2str(2^log2g)];
    cv = svmtrain(Target_train, train, cmd);
    if (cv >= bestcv),
      bestcv = cv; bestc = 2^log2c; bestg = 2^log2g;
    end
    fprintf('%g %g %g (bestc=%g, g=%g, rate=%g)\n', log2c, log2g, cv, bestc, bestg, bestcv);
  end
end

在 v-fold 交叉验证中,我们首先将训练集划分为 v 个相等的子集 尺寸。依次使用在其余子集上训练的分类器测试一个子集 v - 1 个子集。因此,整个训练集的每个实例都被预测一次,因此 交叉验证准确率是正确分类的数据的百分比。

在此代码中,C 和 gamma 取值范围为 (2^-1, 2^3) 和 (2^-4, 2^1)

我注意到,当调用 svmtrain 函数时,没有为 -s 指定参数来控制 svm 的类型。 libsvm 中 -s 的默认参数是 0,用于 C-SVC。我有一个类分类问题,所以我应该根据 svmtrain 选项使用 -s 2 。但是,当我将上述代码的第 4 行修改为

cmd = ['-s 2 -v 5 -c ', num2str(2^log2c), ' -g ', num2str(2^log2g)];

我收到此错误:

“struct”类型的输入参数的未定义函数“ge”。

ergasia 中的错误(第 37 行) 如果 (cv >= bestcv),

据我所知,svm 返回一个 struct 类型的模型。我的问题是,我使用的代码是否适合一类分类问题中的参数选择?

另一个问题:除此之外,还有更好的方法来定义最佳 C 和 gamma 吗? 我在这里找到了这个方法: http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf

我真的需要一些帮助,所以提前谢谢你。

【问题讨论】:

    标签: matlab machine-learning svm libsvm


    【解决方案1】:

    这些天我只是在做一些关于 LibSvm 的事情。而且我还使用 gridSearch 来获得最好的 c,g,它确实有效。 首先,我用 -s 2 -v 5 -c -g 12 运行了一个小测试

    traindata=getData(1,1,12);
    testdata=getData(1,0,12);
    trainLabel=getLabel(1);
    trainLabel(trainLabel>1)=0;
    testLabel=getLabel(0);
    testLabel(testLabel>1)=0;
    v=5;
    c=4;
    g=12;
    cmd = ['-s 2 -t 2  -v ',num2str(v),' -c ',num2str( c ),' -g ',num2str( g ),'    -q '];
    cg = svmtrain(trainLabel,traindata,cmd);  
    

    我得到一个结果 cg,它只是一个 数字

    >> littletest
    Cross Validation Accuracy = 4.53333%
    
    >> cg
    
    cg =
    
        4.5333
    

    'if (cv >= bestcv)' 所以它会起作用。

    我还想告诉你的是,如果你不为-s指定参数,它也可以工作。

    traindata=getData(1,1,12);
    testdata=getData(1,0,12);
    trainLabel=getLabel(1);
    trainLabel(trainLabel>1)=0;
    testLabel=getLabel(0);
    testLabel(testLabel>1)=0;
    v=5;
    c=4;
    g=12;
    cmd = [' -t 2  -v ',num2str(v),' -c ',num2str( c ),' -g ',num2str( g ),' -q '];
    cg = svmtrain(trainLabel,traindata,cmd);  
    >> littletest
    Cross Validation Accuracy = 99.0667%
    >> cg
    
    cg =
    
       99.0667
    

    第二个,我把我用的gridSearch代码贴在这里,希望对你有帮助。

    [X,Y] = meshgrid(cmin:cstep:cmax,gmin:gstep:gmax);
    [m,n] = size(X);
    cg = zeros(m,n);
    %% record acc with different c & g,and find the bestacc with the smallest c
    bestc = 0;
    bestg = 0;
    bestacc = 0;
    basenum = 2;
    for i = 1:m
        for j = 1:n
            cmd = ['-t 2  -v ',num2str(v),' -c ',num2str( basenum^X(i,j) ),' -g ',num2str( basenum^Y(i,j) ),' -q '];
            cg(i,j) = svmtrain(train_label, train, cmd);
    
            if cg(i,j) > bestacc
                bestacc = cg(i,j);
                bestc = basenum^X(i,j);
                bestg = basenum^Y(i,j);
            end
            if ( cg(i,j) == bestacc && bestc > basenum^X(i,j) )
                bestacc = cg(i,j);
                bestc = basenum^X(i,j);
                bestg = basenum^Y(i,j);
            end
    
        end
    end
    

    【讨论】:

      【解决方案2】:

      在一类 svm 中没有 gamma 参数。有成本 (-c) 和 nu (-n)。 您可以在 libsvm 发行版的 matlab 文件夹内的 svmtrain.c 文件中看到所有选项。

      【讨论】:

        猜你喜欢
        • 2013-12-05
        • 2021-08-24
        • 2019-12-06
        • 1970-01-01
        • 2017-09-28
        • 2018-05-12
        • 2014-12-04
        • 2019-03-25
        • 1970-01-01
        相关资源
        最近更新 更多