【问题标题】:Performing additional validation in LIBSVM matlab在 LIBSVM matlab 中执行附加验证
【发布时间】:2013-12-21 16:54:20
【问题描述】:

我正在研究 MATLAB LIBSVM 一段时间以进行预测。我有一个数据集,其中 75% 用于训练,15% 用于寻找最佳参数,其余用于测试。代码如下。

trainX and trainY are the input and output training instances
testValX and testValY are the validation dataset I use
for j = 1:100
    for jj = 1:10
        model(j,jj) = svmtrain(trainY,trainX,...
        ['-s 3 -t 2 -c ' num2str(j) ' -p 0.001 -g ' num2str(jj) '-v 5']);
        [predicted_label, ~, ~]=svmpredict(testValY,...
        testValX,model(j,jj));
        MSE(j,jj) = sum(((predicted_label-testValY).^2)/2);
    end
end
[min_val,min_indi] = min(MSE(:));
best_predicted_model_rbf(i) = model(min_indi);

我的问题是这是否正确。我正在创建具有不同 c 和 g 值的模型矩阵。我使用 -v 选项,这是这里的关键。从预测模型中,我使用验证数据集进行预测,然后计算均方误差。使用这个 MSE,我选择了最好的 c 和 g。由于我使用 -v 返回交叉验证的输出,所以我遵循的过程是否正确?

【问题讨论】:

    标签: matlab machine-learning svm libsvm cross-validation


    【解决方案1】:

    首先,我认为显示的代码有一个小问题,即num2str(jj) '-v 5']); 在-v 之前没有空格。这可能会导致该标志不被读取。在另一个问题中,您说这“有时会返回一个模型”,如果未读取该标志会发生这种情况。如果读取该标志,则在使用“-v”标志时,您应该只得到一个数字,而不是模型。

    其次,您似乎在这里做了两件不同的事情,其中​​任何一件本身都是合理的。使用“-v”调用 svmtrain 在训练集上运行交叉验证。那不应该返回一个模型,它应该只返回一个 mse 估计。您可以使用这些估计值来确定最佳参数设置,然后在所有训练数据上使用该设置训练一个模型。

    无论如何,接下来您在保留验证集 testValX 上调用 svmpredict(y,x,model),但是在使用“-v”调用 svmtrain 之后,此时模型应该只是一个标量。为了让这个调用正确运行,你必须从没有'-v'的svmtrain获取模型,这样它就是一个结构。在这种情况下,您正在做的其他事情是有意义的,在这种情况下,您正在使用 testValX 进行保持验证。

    【讨论】:

    • 这是一个很好的收获@Dthal。我想如果 -v 之前没有空格,则不考虑该标志。谢谢
    猜你喜欢
    • 2015-06-01
    • 2013-08-08
    • 2013-05-09
    • 2015-01-08
    • 2012-11-01
    • 2011-07-14
    • 2014-04-28
    • 2013-03-11
    • 1970-01-01
    相关资源
    最近更新 更多