libsvm:使用留一法评估 SVM

Posted

技术标签:

【中文标题】libsvm:使用留一法评估 SVM【英文标题】:libsvm: Evaluating an SVM using leave-one-out 【发布时间】:2014-03-03 04:39:53 【问题描述】:

我正在尝试将 libsvm 与 MATLAB 一起使用来评估一对多 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

【问题讨论】:

你在使用来自csie.ntu.edu.tw/~cjlin/libsvm/#matlab的libsvm吗? 是的,我确实在使用 libSVM。 【参考方案1】:

我正在尝试提供一些您可能感兴趣的模块,您可以将它们合并到您的函数中。希望对您有所帮助。

留一法:

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

网格搜索(双类案例):

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-vs-all(用于多类案例):

model = cell(NumofClass,1);
for k = 1:NumofClass
    modelk = 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, modelk, '-b 1');
    pr(:,k) = p(:,modelk.Label==1);    %# probability of class==k
end

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

[~,predctedLabel] = max(pr,[],2);

【讨论】:

以上是关于libsvm:使用留一法评估 SVM的主要内容,如果未能解决你的问题,请参考以下文章

sklearn中留一法交叉验证的混淆矩阵

Python为给定模型执行留一法交叉验证实战LOOCV(leave-one-out cross-validation)

留出法K折交叉验证留一法进行数据集划分

留一法交叉验证 Leave-One-Out Cross Validation

留一法交叉验证 Leave-One-Out Cross Validation

机器学习 | 机器学习评估方法