2012-01-20 55 views
5

得到我的測試標籤和訓練標籤後,我在libsvm上實現了SVM,得到了97.4359%的準確度。 (C = 1和g = 0.00375)LibSVM的準確性下降

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

i之後找到最好的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%的精度

精度如何降低?它不應該增加?或者我犯了什麼錯誤?

+0

我不熟悉的LIBSVM的Matlab的API,但你肯定'CV = svmtrain去(TrainLabel,TrainVec,CMD);'會給你的準確度? –

+0

這是他們在LIBSVM常見問題解答中提供的內容:http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html下我如何使用MATLAB界面進行參數選擇? – lakesh

回答

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 
+0

如何添加交叉驗證的附加包裝? – lakesh

+0

@lakesh請參閱編輯。祝你好運! –

+0

只是爲了澄清:不LIBSVM做到這一點嗎?所有你需要鍵入的是「-v n」,其中n是摺疊數。 – lakesh

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 
+0

我的代碼有什麼問題?它確實重複尋找最佳的c和伽瑪... – lakesh

+0

這是他們在LIBSVM常見問題解答中提供的內容:csie.ntu.edu.tw/~cjlin/libsvm/faq.html下面我如何使用MATLAB界面進行參數選擇? – lakesh

+0

我已經在我的代碼中進行交叉驗證了。 – lakesh