17

適切なパラメーターを選択するためにクロス検証が使用されることを知っています。それらを見つけた後、-v オプションを使用せずにデータ全体を再トレーニングする必要があります。

しかし、私が直面している問題は、-v オプションでトレーニングした後、相互検証の精度 (例: 85%) が得られることです。モデルがなく、C とガンマの値が表示されません。その場合、どのように再訓練しますか?

ところで、私は10倍の交差検証を適用しています。例えば

optimization finished, #iter = 138
nu = 0.612233
obj = -90.291046, rho = -0.367013
nSV = 165, nBSV = 128
Total nSV = 165
Cross Validation Accuracy = 98.1273%

それについていくつかの助けが必要..

最高の C とガンマを得るために、LIBSVM FAQ で入手できるこのコードを使用します。

bestcv = 0;
for log2c = -6:10,
  for log2g = -6:3,
    cmd = ['-v 5 -c ', num2str(2^log2c), ' -g ', num2str(2^log2g)];
    cv = svmtrain(TrainLabel,TrainVec, cmd);
    if (cv >= bestcv),
      bestcv = cv; bestc = 2^log2c; bestg = 2^log2g;
    end
    fprintf('(best c=%g, g=%g, rate=%g)\n',bestc, bestg, bestcv);
  end
end

別の質問: -v オプションを使用せずにトレーニングし、そのモデルを使用して予測した場合と同様の -v オプションを使用した後の相互検証の精度はありますか? 2つの精度は似ていますか?

別の質問: 相互検証は基本的に、オーバーフィッティングを回避することでモデルの精度を向上させます。そのため、改善する前にモデルを配置する必要があります。私は正しいですか?それに加えて、モデルが異なる場合、クロス検証の精度は異なりますか? 私は正しいですか?

もう 1 つの質問: 交差検証の精度では、C とガンマの値はどのくらいですか?

グラフはこんな感じ ここに画像の説明を入力

この場合、C の値は 2 で、ガンマ = 0.0078125 です。しかし、新しいパラメーターでモデルを再トレーニングすると。この値は 99.63% と同じではありません。何か理由があるのでしょうか?前もって感謝します...

4

2 に答える 2

31

ここでの-vオプションは、オーバーフィッティングの問題を回避する方法として実際に使用されることを意図しています (トレーニングにデータ全体を使用する代わりに、フォールドで N フォールド交差検証トレーニングを実行N-1し、残りのフォールドで 1 つずつテストします)。時間、平均精度を報告します)。したがって、実際の SVM モデルではなく、スカラー数として交差検証の精度 (分類の問題がある場合、それ以外の場合は回帰の平均二乗誤差) のみが返されます。

モデル選択を実行する場合は、クロス検証 (ヘルパー Python スクリプトと同様)を使用してグリッド検索を実装し、 と の最適な値を見つける必要があります。grid.pyCgamma

これを実装するのは難しいことではありません: MESHGRID を使用して値のグリッドを作成し、すべてのペアを全体的に反復(C,gamma)して、たとえば 5 倍の交差検証で SVM モデルをトレーニングし、最高の CV 精度を持つ値を選択します...

例:

%# read some training data
[labels,data] = libsvmread('./heart_scale');

%# grid of parameters
folds = 5;
[C,gamma] = meshgrid(-5:2:15, -15:2:3);

%# grid search, and cross-validation
cv_acc = zeros(numel(C),1);
for i=1:numel(C)
    cv_acc(i) = svmtrain(labels, data, ...
                    sprintf('-c %f -g %f -v %d', 2^C(i), 2^gamma(i), folds));
end

%# pair (C,gamma) with best accuracy
[~,idx] = max(cv_acc);

%# contour plot of paramter selection
contour(C, gamma, reshape(cv_acc,size(C))), colorbar
hold on
plot(C(idx), gamma(idx), 'rx')
text(C(idx), gamma(idx), sprintf('Acc = %.2f %%',cv_acc(idx)), ...
    'HorizontalAlign','left', 'VerticalAlign','top')
hold off
xlabel('log_2(C)'), ylabel('log_2(\gamma)'), title('Cross-Validation Accuracy')

%# now you can train you model using best_C and best_gamma
best_C = 2^C(idx);
best_gamma = 2^gamma(idx);
%# ...

輪郭プロット

于 2012-01-28T22:34:32.687 に答える
1

データセット全体を使用してパラメーターを決定し、そのデータセットでトレーニングすると、データが過適合になります。理想的には、データセットを分割し、(CV を使用して) 一部でパラメーター検索を実行してから、他の部分を使用して CV でトレーニングとテストを行います。データセット全体を両方に使用すると、より良い結果が得られますか? もちろん、あなたのモデルはうまく一般化できない可能性があります。モデルの真のパフォーマンスを判断したい場合は、パラメーターの選択を個別に行う必要があります。

于 2012-02-27T08:22:19.840 に答える