【问题标题】:Matlab parameters selction using Balance Accuracy of LibsvmMatlab 参数选择使用 Libsvm 的平衡精度
【发布时间】:2014-04-19 18:11:51
【问题描述】:

我正在尝试合并这 2 位代码。我正在尝试使用平衡精度(BAC)而不是精度来选择参数。我已经下载了 libsvm 上的补码来处理平衡精度。

我用于参数选择的代码是:

prompt ='CROSS VALIDATION MAXIMUM STEP RANGE) ? ';
maxstep = input (prompt);
stepSize = 1;
log2c_list = -maxstep:stepSize:maxstep;
log2g_list = -maxstep:stepSize:maxstep;
maxc = max(log2c_list);
maxg = max(log2c_list);
numLog2c = length(log2c_list);
numLog2g = length(log2g_list);
cvMatrix = zeros(numLog2c,numLog2g);
bestcv = 0;
for i = 1:numLog2c
    log2c = log2c_list(i);
    for j = 1:numLog2g
        log2g = log2g_list(j);
        % -v 3 --> 3-fold cross validation
        param = ['-q -v 3 -c ', num2str(2^log2c), ' -g ', num2str(2^log2g)];
        cv = svmtrain(class_vector_train, predictors_matrix_train, param);
        cvMatrix(i,j) = cv;
        if (cv >= bestcv),
            bestcv = cv; bestLog2c = log2c; bestLog2g = log2g;
        end
        % fprintf('%g %g %g (best c=%g, g=%g, rate=%g)\n', log2c, log2g, cv, bestc, bestg, bestcv);
    end
end
disp(['CV scale1: best log2c:',num2str(bestLog2c),' best log2g:',num2str(bestLog2g),' accuracy:',num2str(bestcv),'%']);

要获得我正在使用的天平精度:

do_binary_cross_validation(class_vector_train, predictors_matrix_train,'-c 1 -g 2',5);
model = svmtrain(class_vector_train, predictors_matrix_train);
[predicted_class_test, evaluation_results, decision_values] = do_binary_predict(class_vector_test, predictors_matrix_test, model);

但我找不到平衡的准确度度量。

【问题讨论】:

    标签: matlab libsvm


    【解决方案1】:

    使用函数bac你的validation_function.m文件:

    function ret = bac(dec, label)
    tp = sum(label == 1 & dec >= 0);
    tn = sum(label == -1 & dec < 0);
    tp_fn = sum(label == 1);
    tn_fp = sum(label == -1);
    if tp_fn == 0;
      disp(sprintf('warning: No positive true label.'));
      sensitivity = 0;
    else
      sensitivity = tp / tp_fn;
    end
    if tn_fp == 0;
      disp(sprintf('warning: No negative true label.'));
      specificity = 0;
    else
      specificity = tn / tn_fp;
    end
    ret = (sensitivity + specificity) / 2;
    disp(sprintf('BAC = %g', ret));
    

    这计算BAC (Balanced ACcuracy) = (Sensitivity + Specificity) / 2Sensitivity = true_positive / (true_positive + false_negative)Specificity = true_negative / (true_negative + false_positive)

    【讨论】:

    • 非常感谢您的帮助 - 我得到了奇怪的结果,但也许没关系。底线我的标签是-1和+1。比,我想确保我定义标签向量的方式没有错误。考虑到我获得了 100% 的准确率,我想也许我在某个地方犯了错误。因此,我更改了可能测试集的 10 个标签(随机将 + 1 或 -1 替换为 444 或 777)。我运行完整的程序:(训练集和测试集之间的分离),支持向量机训练,支持向量机预测。然后我查看我的向量预测标签,发现 10 个中有 4 个
    • 我在测试集中更改的标签被准确预测。怎么能得到一个从未出现在训练集中的标签的准确预测?我希望这是有道理的 - 再次感谢您的帮助
    • ..对不起,我没有正确编辑...非常感谢您的帮助 - 我得到了奇怪的结果,但也许没关系。底线我的标签是-1和+1。比,我想确保我定义标签向量的方式没有错误。考虑到我获得了 100% 的准确率,我认为我可能在某个地方犯了错误。因此,我更改了可能测试集的 10 个标签(随机将 + 1 或 -1 替换为 444 或 777)。我运行完整的程序:(训练集和测试集之间的分离,支持向量机训练,支持向量机预测)。然后我查看我的向量预测标签,发现 10 个中有 4 个
    • 我在测试集中更改的标签被准确预测。为什么我可以对从未出现在训练集中的标签进行准确的预测?我希望这是有道理的 - 再次感谢您的帮助 - 大卫 12 分钟前
    猜你喜欢
    • 2014-06-29
    • 2016-09-23
    • 2013-10-06
    • 2012-07-09
    • 1970-01-01
    • 2012-05-25
    • 2015-11-26
    • 2013-06-11
    • 1970-01-01
    相关资源
    最近更新 更多