假设我们有5个不同类别的样本,如A、B、C、D和E。在我的情况下,为了使用“一对多分类”方法,必须有5个一对多SVM分类器,类似于下面的设置:
SVM1: A 对抗其他
SVM2: B 对抗其他
SVM3: C 对抗其他
SVM4: D 对抗其他
SVM5: E 对抗其他
这5个分类器使用训练样本进行训练,并且每个分类器使用不同的核函数。当有新的样本输入时,会被传递给这5个分类器进行分类。假设一个实际属于类别“A”的新样本被SVM1正确地分类为“A”,但同时被SVM4错误地分类为“D”,问题在于如何确定这两个SVM中的哪一个预测是正确的。我知道必须有一些标准来比较这两个预测的置信度。我使用的是OpenCV 2.4.8,通过以下语法可以预测新样本所属的类别标签:
float Response = SVM.predict(new_test_sample,false);
我还知道可以通过以下语法来确定新样本与SVM决策边界的距离:
float Distanc = SVM.predict(test, true);
由于我对每个SVM分类器使用了不同的核函数和参数(因此我知道不能简单地通过比较决策边界的距离来比较预测置信度…),我的问题是如何比较这些分类器的预测置信度,以便最终确定新样本属于哪个类别?谢谢大家
回答:
在这种情况下,通常的做法是使用Platt的缩放方法。有效地讲,这只是在你的决策函数之上拟合一个逻辑回归,以“校准”你的估计,使它们可以比较。结果,你会得到每个分类器的概率估计P(y|x),现在可以跨多个模型进行比较。
一般来说,OpenCV作为分类器的来源相当不好,我会考虑使用实际的机器学习包,这样你可以访问这些标准工具。特别是OpenCV包装的libsvm – 具有这个功能。