[英]Accuracy of LibSVM decreases
得到我的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%
精度如何降低? 不應該增加嗎? 還是我有任何錯誤?
由於您預測的是與訓練相同的數據,因此在參數調整期間獲得的精度會產生偏差。 這通常適合參數調整。
但是,如果您希望這些精度是最終測試集上真實泛化誤差的准確估計,則必須添加交叉驗證或其他重采樣方案的附加包裝。
這是一篇非常清晰的論文,概述了一般性問題(但在功能選擇的相似上下文中): 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
要進行交叉驗證,您應該拆分訓練數據。 在這里,您可以對訓練數據進行測試,以找到最佳的參數集。 這不是一個好辦法。 您應該使用以下偽代碼:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.