首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >支持向量机回归的交叉验证

支持向量机回归的交叉验证
EN

Stack Overflow用户
提问于 2016-06-01 12:22:13
回答 1查看 981关注 0票数 0

我想要执行交叉验证,以选择最佳参数Gamma和C的RBF内核的SVR (支持向量回归)。我用的是LIBSVM。我有一个数据库,其中包含4组3D网格。我的问题是:我使用的这个方法可以用于四重交叉验证吗?我认为,在选择径向基核的参数C和Gamma时,必须尽量减小预测值与groud_truth_values之间的误差。

我还有另一个问题,我得到一个NAN值,而交叉验证(平方相关系数= nan (回归))

下面是我写的代码:

代码语言:javascript
运行
复制
[C,gamma] = meshgrid(-5:2:15, -15:2:3); %range of values for C and 
                                        %gamma

%# grid search, and cross-validation

for m=1:numel(C)

    for k=1:4 
        fid1 = fopen(sprintf('list_learning_%d.txt',k), 'rt'); 
        i=1;

        while feof(fid1) == 0 
            tline = fgetl(fid1); 
            v= load(tline);
            v=normalize(v);
            matrix_feature_tmp(i,:)=v;
            i=i+1;
        end  

        fclose(fid1);

        % I fill matrix_feature_train of size m by n via matrix_feature_tmp

        %%construction of the test matrix
       fid2 = fopen(sprintf('liste_features_test%d.txt',k), 'rt'); 
       i=1;

       while feof(fid2) == 0 
           tline = fgetl(fid2); 
           v= load(tline);
           v=normalize(v);
           matrice_feature_test_tmp(i,:)=v;
           i=i+1;
       end  

       fclose(fid2);

       %I fill matrix_feature_test of size m by k via matrix_feature_test_tmp

       mos_learning=load(sprintf('mos_learning_%d.txt',k));
       mos_wanted=load(sprintf('mos_test%d.txt',k));

       model = svmtrain(mos_learning, matrix_feature_train',sprintf('- 
       s %f -t %f -c %f -g %f -p %f  ',3,2 ,2^C(m),2^gamma(m),1 ));

       [y_hat, Acc, projection] = svmpredict(mos_wanted,
                                  matrix_feature_test', model);
       MSE_Test = mean((y_hat-mos_wanted).^2);
       vecc_error(k)=MSE_Test;

       end
       mean_vec_error_fold(m)=mean(vecc_error);
end

%select the best gamma and C 
[~,idx]=min(mean_vec_error_fold);

best_C = 2^C(idx);
best_gamma = 2^gamma(idx);

%training with best parameters
%for example
 model = svmtrain(mos_learning1, matrice_feature_train1',sprintf('-s   
          %f -t %f -c %f -g %f -p %f  ',3,2 ,best_C, best_gamma,1 ));

[y_hat_final, Acc, projection] = svmpredict(mos_test1,matrice_feature_test1', 
                           model);
EN

回答 1

Stack Overflow用户

发布于 2016-06-01 13:21:59

根据您的描述,如果不阅读您的代码,听起来您并没有进行交叉验证。交叉验证要求您选择一个参数集(即Cgamma的值),并保持这些参数不变--使用k-1折叠来训练,使用1折叠进行测试,并执行这个k时间,这样就可以将每个折叠作为测试集使用一次。然后聚合这些k测试的误差/准确性度量,这是您用于对所有数据进行培训的模型的参数排序的度量。将此称为您所使用的参数集的交叉验证错误。然后,对一系列不同的参数重复此过程,并选择具有最佳精度/最低CV误差的参数集。您的最终模型是根据您的所有数据进行培训的。

你的代码对我没什么意义。看着这段片段

代码语言:javascript
运行
复制
folds = 4; 
for i=1:numel(C)
    cv_acc(i) = svmtrain(ground_truth, matrice_feature_train', ...
                sprintf(' -s %d -t %d -c %f -g %f -p %d -v %d',3,2, 
                2^C(i), 2^gamma(i), 1, 4)); %Kernel RBF
end

cv_acc包含了什么?对我来说,它包含了实际的支持向量机模型(如果使用MATLAB工具箱,则是一个SVMStruct,如果使用LIBSVM,则包含其他的支持向量机)。如果您使用循环来更改哪些折叠被用作训练集,这将是可以的。但是,您已经使用它们来更改gammaC参数的值,这是不正确的。但是,您稍后调用了min(cv_acc);,所以我现在猜测您认为对smvtrain的调用实际上返回了训练错误?我不知道如何在这样的结构数组上有意义地调用min,但我可能错了。但即使如此,您实际上并不感兴趣最小化您的培训错误,您希望最小化您的交叉验证错误,这是您的k运行的测试错误的总和,并与您的培训错误无关。

现在不可能真正知道您是否做错了,因为您没有向我们展示gammaC的向量,但是只有一个循环而不是一个嵌套循环来迭代这些向量是很奇怪的(除非您把它们安排得像真值表一样,但我对此表示怀疑)。您需要测试C的每个潜在值以及gamma的每个值。目前看来,对于gamma中的每个值,您只尝试了一个不同的值。

看看this answer,看看与支持向量机一起使用的交叉验证示例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37568528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档