5

testlabel と trainlabel を取得した後、libsvm に SVM を実装したところ、97.4359% の精度が得られました。( c= 1 および g = 0.00375)

model = svmtrain(TrainLabel, TrainVec, '-c 1 -g 0.00375');
[predict_label, accuracy, dec_values] = svmpredict(TestLabel, TestVec, model);

最適な c と g を見つけた後、

bestcv = 0;
for log2c = -1:3,
  for log2g = -4:1,
    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('%g %g %g (best c=%g, g=%g, rate=%g)\n', log2c, log2g, cv, bestc, bestg, bestcv);
  end
end

c = 8 および g = 0.125

モデルを再度実装します。

 model = svmtrain(TrainLabel, TrainVec, '-c 8 -g 0.125');
[predict_label, accuracy, dec_values] = svmpredict(TestLabel, TestVec, model);

82.0513% の精度が得られます

どのように精度が低下する可能性がありますか? 増えてはいけない?それとも私は間違いを犯していますか?

4

2 に答える 2

4

パラメーターの調整中に得られた精度は、トレーニングしていたのと同じデータを予測していたため、上方に偏っています。これは、多くの場合、パラメーターの調整には問題ありません。

ただし、これらの精度を最終的なテスト セットの真の汎化誤差の正確な推定値にしたい場合は、交差検証または他のリサンプリング スキームのラップを追加する必要があります。

これは、一般的な問題を概説する非常に明確な論文です (ただし、機能選択の同様のコンテキストで): http://www.pnas.org/content/99/10/6562.abstract

編集

私は通常、次のような相互検証を追加します。

n     = 95 % total number of observations
nfold = 10 % desired number of folds

% Set up CV folds
inds = repmat(1:nfold, 1, mod(nfold, n))
inds = inds(randperm(n))

% Loop over folds
for i = 1:nfold
  datapart = data(inds ~= i, :)

  % do some stuff

  % save results
end

% combine results
于 2012-01-20T17:46:22.730 に答える
1

相互検証を行うには、トレーニング データを分割する必要があります。ここでは、トレーニング データをテストして、最適なパラメーター セットを見つけます。それは良い尺度ではありません。次の疑似コードを使用する必要があります。

for param = set of parameter to test
  [trainTrain,trainVal] = randomly split (trainSet); %%% you can repeat that several times and take the mean accuracy
  model = svmtrain(trainTrain, param);
  acc = svmpredict(trainVal, model);
  if accuracy is the best
     bestPAram = param
  end
end
于 2012-01-20T17:46:28.797 に答える