问题
decision_function_shape
参数似乎对sklearn.svm.SVC
对象的输出本身没有决定性影响,仅是重塑了每个分类器得分的数组。但是,有没有办法理解在对象的基本实现中(OvO策略和decision_function_shape
的默认参数ovr
)数组是如何转换的?
观察
用于多类分类的SVC实现使用了一个对一个(One vs One)策略。因此,对于n个类别,我们得到n选择2个分类器。总结如下:
ovo = SVC() # (n选择2)个分类器ovo_bis = SVC(decision_function_shape='ovo') # (n选择2)个分类器ovr = OneVsRestClassifier(SVC()) # n个分类器ovo.decision_function([one_instance]) # 返回长度为n的数组ovo_bis.decision_function([one_instance]) # 返回长度为(n选择2)的数组ovr.decision_function([one_instance]) # 返回长度为n的数组
回答:
从OvO分类器集合到OvR决策函数的转换发生在_ovr_decision_function
函数中,源码在此。简而言之,每个涉及类i
的OvO分类器都会对每个样本是否属于类i
进行投票,这些投票会被统计,获得最多票的类获胜;为了打破平局,会纳入置信水平(OvO决策函数),再次在OvO分类器中总计,并现在调整到适用于仅打破平局的范围内。