2016-06-01 15 views
0

クロスバリデーションを実行して、SVRのRBFカーネル(サポートベクター回帰)の最良のパラメータガンマとCを選択します。私はLIBSVMを使用しています。私は3Dメッシュの4つのグループを含むデータベースを持っています。 私の質問は: 私が使用しているこのアプローチは、4倍のクロスバリデーションでOKですか?私は、RBF KernalのパラメータCとGammaを選択するために、予測値とgroud_truth_valuesの間の誤差を最小限に抑えなければならないと思います。SVM回帰のクロスバリデーション

私はまた別の問題を抱えている、私はクロスバリデーション(二乗相関係数=ナン(回帰))しながら、この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); 

答えて

1

ベースは、あなたの説明では、あなたのコードを読まずに、あなたは相互認証をしていないように思えます。クロスバリデーションでは、パラメータセット(すなわち、Cgammaの値)を選択し、これらのパラメータを保持するために、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 
end 

cv_accにはそれが含まれていますか?私には実際のSVMモデルが含まれています(MATLABツールボックスを使用する場合はSVMStruct、LIBSVMを使用する場合は別のもの)。ループを使用して、どの折り目がトレーニングセットとして使用されているかを変更していれば、これは問題ありません。しかし、それらを使用してgammaCパラメータの値を変更しましたが、これは間違っています。しかし、後でmin(cv_acc);と呼ぶので、smvtrainへの電話が実際にトレーニングエラーを返すと思い込んでいると思いますか?私はどのように意味のあるような構造の配列にminを呼び出すことができますが表示されませんが、私は間違っている可能性があります。しかし、実際にはトレーニングのエラーを最小限に抑えることに実際には興味がありません。テストエラーの集計であるクロスバリデーションのエラーを最小限に抑えたい場合は、kの実行中にエラーが発生し、トレーニングエラー。

は今、それはあなたが私たちにgammaCのベクトルを示していないので、これは間違っているBTやった場合、実際に知ることは不可能だが、唯一の(しない限り、1つのループではなく、これらを反復処理するために、ネストされたループを持っているそれは奇妙ですあなたはそれらを真理表のように配置しましたが、私はそれを疑っています)。それぞれの潜在的な値Cと、値gammaを組み合わせてテストする必要があります。現在のところ、の各値に対して1つの異なる値gammaを試しているようです。

this answerをご覧になり、SVMで使用される相互検証の例をご覧ください。

+0

こんにちは1)SVMTRAINの呼び出しで、構造モデルではなく、平均平方誤差が返されることを指定しました(オプション-Vを指定してSVTMTRAINを呼び出すことに注意してください)。ですから、ベクトルcv_accには各ペア(C、ガンマ)に関連するエラーが含まれているので、min(cv_acc)の使用は正しいと思います。 2)折り畳みを変更するためにネストループを使用する必要があります。私は編集します。 3)後で最良のパラメータを選択するために交差検証のエラーを最小限に抑えなければならないと思いましたか? – Anass

+0

@Anassそれはまだ間違っているトレーニングエラーの場合は、どのパラメータセットがあなたに最高のトレーニングエラーを与えるか気にしない、あなたはクロス検証エラーが気になります。したがって、3回折り畳んで訓練し、SVMモデルを返し、そのモデルを使用して4倍に予測し、MSEを計算し、4回行い、エラーを集計し、その集計はそのパラメータセットの*クロスバリデーション*エラーです。次に、テストするすべてのパラメータの組み合わせに対して繰り返し、各パラメータの組み合わせの相互検証エラーの最小値のみを考慮します。 – Dan

+1

okありがとうございます。私はこれを試し、私の投稿を編集して結果を表示します – Anass

関連する問題