【问题标题】:Find confidence of prediction in SVM在 SVM 中找到预测的置信度
【发布时间】:2015-02-28 14:20:36
【问题描述】:

我正在使用 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);

【问题讨论】:

    标签: c++ opencv machine-learning svm


    【解决方案1】:

    SVM 在训练期间试图找到一个分离的超平面,使训练集示例位于不同的侧面。可能有许多这样的超平面(或没有),因此为了选择“最佳”,我们寻找与所有类的总距离最大化的那个。事实上,离超平面点越远——我们对这个决定就越有信心。所以我们感兴趣的是到超平面的距离。

    根据 OpenCV documentationCvSVM::predict 有一个默认的第二个参数,用于指定返回的内容。默认返回分类标签,但你可以传入true,它会返回距离。

    距离本身还不错,但是如果您想在 (0, 1) 范围内获得置信度值,可以将sigmoidal 函数应用于结果。逻辑函数是此类函数之一。

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

    【讨论】:

    • 但是当我提供与测试数据相同的用于训练的特征时,它返回一个非常低的置信度值(0.268941),但对于其他人它返回一个高值(0.741124)。当训练和测试数据相同时,为什么不给出更高的置信度?
    • @deepak,好吧,实际上它是正类的置信度(假设二进制分类)。为了获得负类的信心,您应该从 1 中提取它。此外,SVM 不会记住您的训练集,它会尝试在您的数据中找到“内部结构”,尝试拟合模型。该模型不必完美地解释你的训练集——否则它会过度拟合。此外,有时您的数据中会出现噪音和异常值——您不想太认真地对待每个示例。
    • 使用 RVM 分类进行正确的置信度计算。
    • 参见 Bishop 的书“模式识别和机器学习”第 ​​353 页。 amazon.com/Pattern-Recognition-Learning-Information-Statistics/…
    • 摘自 Bishop 的书“SVM 是一种决策机器,因此不提供后验概率。我们已经在 1.5.4 节中讨论了确定概率的一些好处。另一种稀疏核技术,已知作为相关向量第 7.2 节机器 (RVM),它基于贝叶斯公式并提供后验概率输出,并且通常具有比 SVM 更稀疏的解决方案。”我认为这也与远离训练数据点的测试点的置信度较低有关。
    猜你喜欢
    • 1970-01-01
    • 2015-10-01
    • 2018-11-01
    • 2023-03-04
    • 2015-10-10
    • 2019-07-06
    • 1970-01-01
    • 2013-04-02
    • 2014-07-09
    相关资源
    最近更新 更多