用于多类分类的 SVM(one-vs-all)中的置信度估计

Posted

技术标签:

【中文标题】用于多类分类的 SVM(one-vs-all)中的置信度估计【英文标题】:Confidence estimation in SVM (one-vs-all) for multiclass-classification 【发布时间】:2021-03-07 04:31:08 【问题描述】:

当使用 SVM-OVR (Ove-Vs-Rest) 进行多类分类时,训练了 n 个分类器,其中 n 等于类的数量。 i-th 分类器基本上计算类 i 和包含所有其他类的二元分类。

然后,为了预测一个新的数据样本,对所有的 n 个分类器进行测试,并根据每个分类器估计的置信度,返回最可能的类别。例如,class1 = 0.59,class2 = 0.61,以此类推,关联概率最大的将对应输出类。

我想知道如何准确计算每个分类器的置信度。我试图阅读SVC 中的文档,但我看不到predict 函数如何评估每个分类器。也就是说,如果class1 = 0.59,那么0.59是怎么计算出来的呢?生成它的原始值是什么?是样本到超平面的欧式距离吗?

【问题讨论】:

【参考方案1】:

这是通过 Platt Scaling(也称为 Platt Calibration)实现的。

Platt Scaling 是一种算法,可将这些多个分类器的输出转换为类的概率分布。

它是由:

其中 f(x) 是 SVM 输出,A 和 B 只是算法学习到的标量。

当然,Scikit-learn 可能会使用这个的变体,但是,这是主要的想法。

更多详情,我推荐你original paper。


更新

根据您在下面的评论,f(x) 只是分类器分数,即决策函数输出,对于 SVC,它是:f(x) = θᵀg(x) + b(权重乘以一些映射函数 + 一些偏差),其中得到分类器f(x)的输出。

现在,来自每个分类器的这些分数被插入到 Platt Scaling 算法中,以根据上面给出的公式将它们转化为概率。

请注意,Platt Scaling 是通过交叉验证执行的,以避免由于在上述 Platt Scaling 公式中选择参数 AB 而可能发生的过度拟合(因此它的计算成本可能更高)。另请注意,Scikit-learn 为此使用了用 C 编写的 libsvm。

【讨论】:

谢谢。但是,我要问的基本上是如何计算 f(x)。 投票程序不是在OVO startegy中进行的吗? @Alessandro,你是对的。这个predict 甚至与您的问题无关。

以上是关于用于多类分类的 SVM(one-vs-all)中的置信度估计的主要内容,如果未能解决你的问题,请参考以下文章

Encog中的多类SVM分类

调整 SVM OVO 和 OVA 中的超参数以进行多类分类

在 python 中实现 SVM One-vs-all 时出现问题

求SVM多类分类问题的代码,最好是MATLAB的完整代码

如何在 R 中构建多类 SVM?

SVM 多类文本分类