2014-02-06 4 views
1

Я пытаюсь использовать libsvm с MATLAB для оценки SVM с одним vs-only, единственная проблема заключается в том, что мой набор данных не достаточно велик, чтобы гарантировать выбор определенного набора тестов , Таким образом, я хочу оценить свои классификаторы, используя метод off-one-out.libsvm: Оценка SVM с использованием одинарного выхода

Я не особенно разбираюсь в использовании SVM, так что простите меня, если я немного смущен относительно того, что делать. Мне нужно генерировать точность против кривых отзыва и матрицы смешения для моих классификаторов, но я не знаю, с чего начать.

Я дал ему уйти и придумал следующее, как грубое начало, чтобы пройти отпуск, но я не уверен, как сделать оценку.

function model = do_leave_one_out(labels, data) 
      acc = []; 
      bestC = []; 
      bestG = []; 
      for ii = 1:length(data) 
        % Training data for this iteration 
        trainData = data; 
        trainData(ii) = []; 
        looLabel = labels(ii); 
        trainLabels = labels; 
        trainLabels(ii) = []; 

        % Do grid search to find the best parameters? 

        acc(ii) = bestReportedAccuracy; 
        bestC(ii) = bestValueForC; 
        bestG(ii) = bestValueForG; 
      end 
      % After this I am not sure how to train and evaluate the final model 
end 
+0

Вы используете libsvm от http://www.csie.ntu.edu.tw/~cjlin/libsvm/#matlab? – lennon310

+0

Да, я действительно использую libSVM. – NOP

ответ

4

Я пытаюсь предоставить некоторые модули, которые могут вас заинтересовать, и вы можете включить их в свою функцию. Надеюсь, поможет.

Несмываемый один выход:

scrambledList = randperm(totalNumberOfData); 
trainingData = Data(scrambledList(1:end-1),:); 
trainingLabel = Label(scrambledList(1:end-1)); 
testData = Data(scrambledList(end),:); 
testLabel = Label(scrambledList(end)); 

Сетка поиска (Dual-класс случай):

acc = 0; 
for log2c = -1:3, 
    for log2g = -4:1, 
    cmd = ['-v 5 -c ', num2str(2^log2c), ' -g ', num2str(2^log2g)]; 
    cv = svmtrain(trainingLabel, trainingData, cmd); 
    if (cv >= acc), 
     acc = cv; bestC = 2^log2c; bestG = 2^log2g; 
    end  
    end 
end 

One-против-всех (Используется для Multi-класса случае):

model = cell(NumofClass,1); 
for k = 1:NumofClass 
    model{k} = svmtrain(double(trainingLabel==k), trainingData, '-c 1 -g 0.2 -b 1'); 
end 

%% calculate the probability of different labels 

pr = zeros(1,NumofClass); 
for k = 1:NumofClass 
    [~,~,p] = svmpredict(double(testLabel==k), testData, model{k}, '-b 1'); 
    pr(:,k) = p(:,model{k}.Label==1); %# probability of class==k 
end 

%% your label prediction will be the one with highest probability: 

[~,predctedLabel] = max(pr,[],2); 
Смежные вопросы