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

问题描述

假设我正在处理一个多类分类问题(具有 N 个类)并且我想使用 SVM 作为分类方法

我可以采用两种策略:一对一 (OVO) 和一对多 (OVA)。在第一种情况下,我需要训练 N(N-1)/2分类器,即 class1 vs class2,...,class1 vs classN,class(N-1) vs classN,而在第二种情况下,我只需要训练 N,即 class1 vs rest,class N vs rest

据我所知,这两个场景的典型(和一般)代码包括超参数的调整,应该是:

OVO

from sklearn import svm
from sklearn.model_selection import gridsearchcv
X = # features-set
y = # labels
params_grid = # whatever
clf = gridsearchcv(svm.SVC(),params_grid)
clf.fit(X,y)

卵子

from sklearn import svm
from sklearn.multiclass import OneVsRestClassifier
from sklearn.model_selection import gridsearchcv
X = # features-set
y = # labels
params_grid = # whatever
clf = gridsearchcv(OneVsRestClassifier(svm.SVC()),y)

我的疑问如下:上面报告的代码根据策略搜索所有 N(N-1)/2N 分类器之间共享的最佳超参数。换句话说,网格搜索在所有分类器之间平均找到“最佳”参数。

所以,我的问题是:为什么不搜索最佳超参数集,为每个 N(N-1)/2N 分类搜索一个?我找不到关于这个主题的任何参考,所以我不知道为每个分类器单独寻找最佳参数是否在概念上是错误的,或者是否有其他解释。

解决方法

我可以采用两种策略:一对一 (OVO) 和一对多 (OVA)

您可以选择任何您喜欢的超参数调整策略——Leave-One-OutK-foldRandomized K-fold——给定可用的计算资源和时间。在一天(一周?)结束时,您的 ML 模型能够很好地泛化才是最重要的。当谈到模型的学习和概括能力时,最好将时间投入到特征工程上,而不是梳理所有可能的参数组合。说实话,你永远不会穷尽所有可能的组合,因为它们是以实数给出的。

为什么不搜索最好的超参数集,一个用于 N(N-1)/2 或 N 个分类器中的每一个

  • 我们为我们拥有的每个 ? 候选者都这样做,这是由超参数搜索空间的基数定义的

  • 我们对我们拥有的每组 ? 验证子文件夹重复它,这些子文件夹由您的交叉验证策略定义。

编辑

关于您的多类预测策略。是的,OVO 和 OVA (OVR) 确实存在,尽管如今预测多类 softprobs 更为传统。使用 OVR,您将获得另一个维度 ?,即类的数量。是的,从概念上讲,您可以为每个 OVR 模型分别调整超参数。你的计算会变成?(?×?×?)。