提高 SVM 的准确度性能

Posted

技术标签:

【中文标题】提高 SVM 的准确度性能【英文标题】:Improve the accuracy performance on SVM 【发布时间】:2014-08-05 19:33:27 【问题描述】:

我正在研究使用 HOG 和 LBP 两种不同功能进行检测的人。我使用 SVM 来训练正样本和负样本。在这里,我想问一下如何提高SVM本身的准确性?因为,每次我添加更多的正负样本时,准确性总是在下降。目前我的正样本是1500,负样本是700。

%extract features
[fpos,fneg] = features(pathPos, pathNeg);  
%train SVM
HOG_featV = loadingV(fpos,fneg);   % loading and labeling each training example
fprintf('Training SVM..\n');
%L = ones(length(SV),1);
T = cell2mat(HOG_featV(2,:));
HOGtP = HOG_featV(3,:)';
C = cell2mat(HOGtP); % each row of P correspond to a training example 


%extract features from LBP
[LBPpos,LBPneg] = LBPfeatures(pathPos, pathNeg);
LBP_featV = loadingV(LBPpos, LBPneg);
LBPlabel = cell2mat(LBP_featV(2,:));
LBPtP = LBP_featV(3,:);
M = cell2mat(LBPtP)'; % each row of P correspond to a training example

featureVector = [C M];
model = svmlearn(featureVector, T','-t 2 -g 0.3 -c 0.5');

有人知道如何找到最佳的 C 和 Gamma 值来提高 SVM 的准确性吗?

谢谢,

【问题讨论】:

【参考方案1】:

要找到提高 SVM 准确性的最佳 C 和 Gamma 值,您通常会执行交叉验证。总之,您可以保留一个(1 个样本)并使用不同的参数(2 个参数定义 2d 网格)测试该样本的 VBM。通常,您会在一定范围内测试每个十年的参数。例如:C = [0.01, 0.1, 1, ..., 10^9]; G= [1^-5, 1^-4, ..., 1000]。这还应该通过优化超参数来提高 SVM 的准确性。

通过再次查看您的问题,您似乎正在使用 Matlab 的机器学习工具箱(统计工具箱)的 svmlearn。因此,您已经有用于交叉验证的内置函数。给个看看:http://www.mathworks.co.uk/help/stats/support-vector-machines-svm.html

【讨论】:

【参考方案2】:

我之前按照ASantosRibeiro的方法优化了参数,效果很好。 此外,您可以尝试添加更多的负样本,直到负样本和正样本的比例达到2:1。原因是当你实现实时应用时,你应该逐步扫描整个图像,通常提取的负样本比包含人的样本要多得多。 因此,添加更多的负训练样本是提高整体准确率(包括假阳性和真阴性)的一种非常简单但有效的方法。

【讨论】:

你能给我你建议的方法的链接吗?我曾经尝试过添加更多的负样本,但是,它在训练数据集上的准确性甚至很差。 @欧文张

以上是关于提高 SVM 的准确度性能的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Matlab 中提高 SVM 训练和分类的准确性?

使用 libsvm 提高标准化准确性的建议

R语言 支持向量机(class.weights可以对类别的权重进行调整,提高准确度)

性能:提高朴素贝叶斯分类器的准确性

如何使用 Libsvm - SVM_Predict.exe 计算“准确度”

从预先训练的 SVM 中获得准确度以进行图像分类