采用One-Vs-One策略的多类SVC投票平局时如何预测?
假设我有一组带有4个标签[A, B, C, D]的多类数据集,希望使用One-Vs-One(OVO)策略的SVC分类器进行预测。我知道训练完成后会得到6个OVO模型,可通过svc.decision_function()查看决策函数输出集合,这些函数的组织形式如下:
[AB, AC, AD, BC, BD, CD]
其中第一个字母为正例,第二个字母为负例。据我理解,预测过程会将这些决策函数分数转化为一组“投票”,最终预测结果为投票的众数。例如:
[AB, AC, AD, BC, BD, CD] # 模型顺序 [1.4, 0.2, 0.6, 3, -2.2, -0.4] # 决策函数输出 [A, A, A, B, D, D] # 各模型的预测结果
众数为A,因此svc.predict()函数输出A。
我的问题是,如果决策函数输出变为如下形式(仅翻转第二个条目的符号):
[AB, AC, AD, BC, BD, CD] # 模型顺序 [1.4, -0.2, 0.5, 3, -2.2, -0.4] # 决策函数输出 [A, C, A, B, D, D] # 各模型的预测结果
此时A和D均为众数(各2票),那么SVC会如何打破平局并做出预测?我推测会对每个标签对应的决策函数输出值(结合标签方向)求和,因为距离决策面的距离可体现模型对该标签预测的置信度,按此计算本例中结果为D。但我也考虑过直接使用“AD”模型的特定分数,不过不确定SVC实际采用哪种方式。
在Scikit-learn的sklearn.svm.SVC实现中,OVO策略下的平局处理不是单纯依赖投票数,而是通过计算每个类别的总置信度得分来决定最终预测结果:
对每个OVO模型的决策函数得分,根据模型的正负例方向调整符号:
- 若模型是
XY(X为正例,Y为负例),得分大于0时,X获得该得分,Y获得负的该得分; - 得分小于0时,Y获得该得分的绝对值(即负的得分值),X获得负的该得分绝对值。
- 若模型是
将所有涉及某一类别的调整后得分相加,得到该类别的总置信度得分。
最终预测总得分最高的类别。
针对你给出的平局案例,我们可以逐一计算每个类别的总得分:
- AB模型(得分1.4):A得+1.4,B得-1.4
- AC模型(得分-0.2):A得-0.2,C得+0.2
- AD模型(得分0.5):A得+0.5,D得-0.5
- BC模型(得分3):B得+3,C得-3
- BD模型(得分-2.2):B得-2.2,D得+2.2
- CD模型(得分-0.4):C得-0.4,D得+0.4
各类别总得分:
- A:1.4 - 0.2 + 0.5 = 1.7
- B:-1.4 + 3 - 2.2 = -0.6
- C:0.2 - 3 - 0.4 = -3.2
- D:-0.5 + 2.2 + 0.4 = 2.1
D的总得分最高,因此svc.predict()会输出D,和你的推测一致。
需要注意的是,这种方式不是单独依赖某一对模型(比如AD)的得分,而是综合了所有涉及该类别的模型的置信度,能更全面地反映模型对该类别的偏好程度。
内容的提问来源于stack exchange,提问作者mhershey3

