我想要执行交叉验证,以选择最佳参数Gamma和C的RBF内核的SVR (支持向量回归)。我用的是LIBSVM。我有一个数据库,其中包含4组3D网格。我的问题是:我使用的这个方法可以用于四重交叉验证吗?我认为,在选择径向基核的参数C和Gamma时,必须尽量减小预测值与groud_truth_values之间的误差。
我还有另一个问题,我得到一个NAN值,而交叉验证(平方相关系数= nan (回归))
下面是我写的代码:
[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);发布于 2016-06-01 13:21:59
根据您的描述,如果不阅读您的代码,听起来您并没有进行交叉验证。交叉验证要求您选择一个参数集(即C和gamma的值),并保持这些参数不变--使用k-1折叠来训练,使用1折叠进行测试,并执行这个k时间,这样就可以将每个折叠作为测试集使用一次。然后聚合这些k测试的误差/准确性度量,这是您用于对所有数据进行培训的模型的参数排序的度量。将此称为您所使用的参数集的交叉验证错误。然后,对一系列不同的参数重复此过程,并选择具有最佳精度/最低CV误差的参数集。您的最终模型是根据您的所有数据进行培训的。
你的代码对我没什么意义。看着这段片段
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
endcv_acc包含了什么?对我来说,它包含了实际的支持向量机模型(如果使用MATLAB工具箱,则是一个SVMStruct,如果使用LIBSVM,则包含其他的支持向量机)。如果您使用循环来更改哪些折叠被用作训练集,这将是可以的。但是,您已经使用它们来更改gamma和C参数的值,这是不正确的。但是,您稍后调用了min(cv_acc);,所以我现在猜测您认为对smvtrain的调用实际上返回了训练错误?我不知道如何在这样的结构数组上有意义地调用min,但我可能错了。但即使如此,您实际上并不感兴趣最小化您的培训错误,您希望最小化您的交叉验证错误,这是您的k运行的测试错误的总和,并与您的培训错误无关。
现在不可能真正知道您是否做错了,因为您没有向我们展示gamma和C的向量,但是只有一个循环而不是一个嵌套循环来迭代这些向量是很奇怪的(除非您把它们安排得像真值表一样,但我对此表示怀疑)。您需要测试C的每个潜在值以及gamma的每个值。目前看来,对于gamma中的每个值,您只尝试了一个不同的值。
看看this answer,看看与支持向量机一起使用的交叉验证示例。
https://stackoverflow.com/questions/37568528
复制相似问题