如何使用多个 SVM 分类器 - 每个分类器都有一个特定的内核 - 作为 "one vs rest classification" 方案?

How to use multiple SVM classifiers -each with a specific kernel- as a "one vs rest classification" scheme?

假设我们有 5 个不同的 class 样本,例如 A、B、C、D 和 E。在我的例子中,要使用 "one vs rest classification" 方法,必须有 5 个一对一-rest SVM classifiers,如下所示:

SVM1:A 与其余

SVM2:B 与其余

SVM3:C 与其余

SVM4:D 与休息

SVM5:E 与休息

这 5 个 classifier 使用训练样本进行训练,每个 classifier 使用不同的内核。新的传入样本被传递给 5 个 class 化器中的每一个以进行 class 化。然后考虑这样一种情况:实际上属于类别 "A" 的新样本被 SVM1 class 化为 "A" 的记忆(这是正确的),同时它是 class被 SVM4 确定为 "D" 的成员(这是不正确的),问题是如何找出这两个 SVM 中哪一个预测正确。我知道必须有某种标准来比较这两者的预测置信度。 我正在使用 opencv 2.4.8 并通过下面的语法可以预测新样本所属的 class 的标签:

float Response = SVM.predict(new_test_sample,false);

我也知道有一个选项可以通过以下语法找出新样本与 SVM 决策边界的距离:

float Distanc = SVM.predict(test, true);

因为我使用了不同的内核以及每个 SVM classifier 的不同参数(所以我知道我不能通过简单地比较距离和决策边际来比较预测置信度...),我的问题是如何比较 classifier 的预测置信度,以便我最终知道新样本属于哪个 class? 谢谢大家

在这种情况下,您通常会使用 Platt 缩放。有效地,它只是将逻辑回归拟合到您的决策函数之上,与您估计的 "calibrate" 相符,因此它们具有可比性。结果,您获得了每个分类器的概率估计 P(y|x),现在可以在多个模型之间进行比较。

OpenCV 通常是非常糟糕的分类器来源,我会考虑改用实际的 ML 包,它可以让您访问此类标准工具。特别是 libsvm,OpenCV 环绕 - 具有此功能。