在libsvm(python)中更倾向于一个类别

1 投票
2 回答
2308 浏览
提问于 2025-04-16 10:22

我刚开始在Python中玩libsvm,做了一些简单的分类工作。

现在的问题是,我正在构建一个人脸检测系统,我希望有一个非常低的误拒率。而svm似乎是为了让误拒率和误接受率保持一致而优化的。我在这方面有什么选择呢?

另外,正如我之前说的,我对libsvm还很陌生,所以请多多包涵。;)

2 个回答

1

我一直在使用libSVM的Python封装,发现可以通过边际来计算一个置信度。下面的“predict_values_raw”函数就是用来做这个的。它会返回一个真实的数值,数值越大越正,表示它很有信心这个东西属于某个类别;数值越大越负,表示它很有信心这个东西不属于这个类别;而接近零的数值则表示它对这个分类没有信心。所以,不要直接调用'predict',而是调用'predict_values_raw',并设置一个较低的阈值(比如-2),这样可以确保不会错过任何真实的面孔。

# Begin pseudo-code
import svm as svmlib

prob = svmlib.svm_problem(labels, data)
param = svmlib.svm_parameter(svm_type=svmlib.C_SVC, kernel_type = svmlib.RBF)
model = svmlib.svm_model(prob, param)

# get confidence
self.model.predict_values_raw(sample_to_classify)
2

SVM(支持向量机)通常不是被看作一种概率模型,而是一个最大区分度模型。所以我很难用我对SVM的了解来理解你的问题。

另外,libSVM自带的Python接口性能不是很好,而且没有展示libSVM的所有选项。

不过,如果你愿意尝试其他接口,scikit-learn的SVM接口功能更丰富,提供了一些可能会用得上的参数,比如加权类别加权样本。这样你可以更加重视那些你不希望被错误分类的类别。

此外,scikit的接口还提供了后验分类概率,但在SVM的情况下,我认为这依赖于libSVM的一种技巧(因为SVM本身不是概率模型),通过重新采样分类来给预测结果提供一个置信区间。

撰写回答