【问题标题】:Really low accuracy with SVM + matlab and libsvmSVM + matlab 和 libsvm 的准确度非常低
【发布时间】:2012-04-13 11:26:19
【问题描述】:

我无法计算在语音向量上运行 svm 所获得的低准确度。我已经交叉验证了数据没有错误,甚至在其上使用了朴素贝叶斯分类器以获得良好的结果。

首先我要提一下,我已经确认我没有使用相同的文件进行训练和测试。

我有一组用于训练的正负类数据

  pos = ones(size(PositiveTraining,1),1);
  neg = ones(size(NegativeTraining,1),1)*-1;



  Training = [ PositiveTraining ; NegativeTraining ];
  TrainingLabels = [pos;neg];

  model = svmtrain( TrainingLabels , Training, '-t 0' );

获得模型后,我正在使用以下代码测试向量

testing_label_vector = ones(size(mfcc,1),1); % where mfcc is my testing matrix
[predicted_label, a, b ] = svmpredict(testing_label_vector, File.mfcc, model );
edges = [-1,1];
hist = histc( predicted_label , edges )

但是,我发现最大精度范围为 0% 到 13%。

我做错了什么吗?

假设数据是正确的,有人可以建议我如何提高分类器的准确性吗?

【问题讨论】:

  • 如果您获得 0-13% 的准确率,只需翻转分类的意义,您将获得 87-100% 的准确率!

标签: matlab svm libsvm


【解决方案1】:

您需要进行参数选择 - 您只是使用默认参数。 SVM 对其参数非常敏感。线性核没有参数,但你仍然有惩罚参数 C。这个参数在更大的边距和错误分类的训练点之间进行权衡。较大的 C 将意味着分类器将尝试正确分类所有训练点,但这可能无法很好地概括。较小的 C 将允许某些点被错误分类,以提供对噪声不太敏感的模型。每个数据集的 C 值都不同,因为它在很大程度上取决于缩放和分布等。您的数据集也可能不是线性可分的,即使对于低 C 值,所以也许非线性内核会更好,比如流行的RBF内核。但是,请记住,这些内核具有更多参数,必须对其进行调整才能正常工作。

阅读 libsvm 的作者编写的指南,它讲述了如何进行参数选择,并提供了使用 SVM 进行分类的其他实用技巧。

A Practical Guide to Support Vector Classication by Chih-Wei Hsu、Chih-Chung Chang 和 Chih-Jen Lin

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 2018-04-23
    相关资源
    最近更新 更多