web-dev-qa-db-ja.com

libsvmとの相互検証後の再トレーニング

クロス検証が適切なパラメーターの選択に使用されることを私は知っています。それらを見つけた後、-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とガンマを取得するには、LIBSVMFAQで入手できるこのコードを使用します

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とガンマの値は何ですか?

グラフはこんな感じ enter image description here

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

17
lakesh

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

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

これを実装するのは難しいことではありません。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);
%# ...

contour_plot

31
Amro

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

1
karenu