python - 用于多类分类的 SVM(一对多)置信度估计

标签 python machine-learning scikit-learn svm multiclass-classification

当使用 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 是一种将这些多个分类器的输出转换为类的概率分布的算法。

由以下公式给出:

enter image description here

其中 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 使用 libsvm为此目的,它是用 C 编写的。

关于python - 用于多类分类的 SVM(一对多)置信度估计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64985698/

相关文章:

python - 无法导入包含 .pyc 文件的包

python - 将整数列表转换为十六进制表示的函数

machine-learning - 仅使用一个类的示例构建分类器

python - 矩阵维度在反向传播中不匹配

c# - 使用ID3算法、Accord.Net框架进行预测

python - scikit-learn 或 statsmodels 中线性回归调整参数的限制范围

python - 如何向 Selenium RC TestSuite 输入参数?

python - 值错误: non-string names in Numpy dtype unpickling only on AWS Lambda

python-3.x - 如何绘制 scikit 的 t-sne 输出数组?

Python 将命令及其输出写入文件