当使用 SVM-OVR (Ove-Vs-Rest) 进行多类分类时,会训练 n 个分类器,其中 n 等于类的数量。 i-th 分类器基本上计算类 i 和包含所有其他类的类之间的二元分类。
然后,为了预测新的数据样本,测试所有 n 个分类器,并根据每个分类器估计的置信度,返回最可能的类别。例如,class1 = 0.59、class2 = 0.61,依此类推,具有最大相关概率的类别将对应于输出类别。
我想知道每个分类器的置信度是如何准确计算的。我尝试阅读 SVC 中的文档,但我看不到 predict
函数如何评估每个分类器。换句话说,如果class1 = 0.59,那么0.59是如何计算的呢?它产生的原始值(value)是什么?是样本到超平面的欧式距离吗?
最佳答案
这是通过普拉特缩放(也称为普拉特校准)实现的。
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 公式中参数 A
和 B
的选择而可能发生的过度拟合(因此,它的计算成本可能会更高)。另请注意,Scikit-learn 使用 libsvm为此目的,它是用 C 编写的。
关于python - 用于多类分类的 SVM(一对多)置信度估计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64985698/