在SVM中找到预测置信度

3

我正在使用opencv进行英文数字分类,使用SVM分类器。我能够使用predict()函数预测类别。但是,我想要得到0-1之间的预测置信度。有人能提供一种使用opencv实现的方法吗?

 //svm parameters used
 m_params.svm_type    = CvSVM::C_SVC;
 m_params.kernel_type = CvSVM::RBF;
 m_params.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER, 500, 1e-8);

 //for training
 svmob.train_auto(m_features, m_labels, cv::Mat(), cv::Mat(), m_params, 10);

 //for prediction
 predicted = svmob.predict(testData);
1个回答

10

SVM在训练过程中试图找到一个分离超平面,使得训练集示例位于不同的一侧。可能有许多这样的超平面(或者没有),因此为了选择“最佳”的超平面,我们寻找使所有类别的总距离最大化的超平面。实际上,点距离超平面越远,我们就越自信于决策。因此,我们关心的是到超平面的距离。

根据OpenCV 文档CvSVM::predict有一个默认的第二个参数指定返回什么。默认情况下,它返回分类标签,但您可以传递true,它将返回距离。

距离本身还不错,但如果您想获得(0,1)范围内的置信度值,则可以将S型函数应用于结果。其中一种函数是逻辑函数。

decision = svmob.predict(testData, true);
confidence = 1.0 / (1.0 + exp(-decision));

但是当我将用于训练的相同特征用作测试数据时,它返回非常低的置信度值(0.268941),但对于其他情况,它会返回高值(0.741124)。为什么在训练和测试数据相同时不会给出更高的置信度? - Deepak
@deepak,实际上这是正类的置信度(假设是二元分类)。为了得到负类的置信度,您应该从1中提取它。此外,SVM不会记忆您的训练集,它试图在数据中找到“内部结构”,并尝试拟合模型。该模型不必完美地解释您的训练集 - 否则它将过度拟合。此外,有时数据中会存在噪声和异常值 - 您不希望过于严肃地对待每个示例。 - Artem Sobolev
1
使用RVM分类来进行正确的置信度计算。 - Andrey Smorodov
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Andrey Smorodov
1
从Bishop的书中,“SVM是一个决策机器,因此不提供后验概率。我们已经在1.5.4节中讨论了确定概率的一些好处。另一种稀疏核技术,称为相关向量机(RVM),基于贝叶斯公式,并提供后验概率输出,同时通常具有比SVM更稀疏的解决方案。”我认为这也与测试点远离训练数据点的事实有关,导致置信度较低。 - Andrey Smorodov
显示剩余16条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接