假设我正在研究多类分类问题(有 N
类),并且我想使用 SVM 作为分类方法。
我可以采用两种策略:一对一(OVO)和一对多(OVA)。在第一种情况下,我需要训练 N(N-1)/2
个分类器,即 class1 vs class2, ..., class1 vs classN, ..., class(N -1) 与 classN
,而在第二种情况下只是 N
,即 class1 与其余部分,...,N 类与其余部分
。
据我所知,这两种场景的典型(和通用)代码(包括超参数的调整)如下:
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)
OVA
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()), params_grid)
clf.fit(X, y)
我的疑问如下:上面报告的代码搜索所有 N(N-1)/2
或 N
分类器之间共享的最佳超参数,基于关于策略。换句话说,网格搜索在所有分类器之间平均找到“最佳”参数。
所以,我的问题是:为什么不搜索最佳的超参数集,每个 N(N-1)/2
或 N
分类器都有一个?我找不到关于这个主题的任何引用,所以我不知道为每个分类器单独找到最佳参数在概念上是否错误,或者是否有其他解释。
最佳答案
I can adopt two strategies: One-Vs-One (OVO) and One-Vs-All (OVA)
您可以选择您喜欢的任何超参数调整策略 - Leave-One-Out
、K-fold
、Randomized K-fold
- - 给定可用的计算资源和时间。归根结底,机器学习模型良好泛化的能力才是最重要的。当涉及到模型的学习和泛化能力时,最好将时间投入到特征工程上,而不是梳理所有可能的参数组合。说实话,您永远无法穷尽所有可能的组合,因为它们是以实数给出的。
why not searching the best hyper-parameters set, one for each of the N(N-1)/2or N classifiers
我们对我们拥有的每个 𝑀 候选者执行此操作,这是由超参数搜索空间的基数定义的
我们对我们拥有的每组验证子文件夹重复此操作,这是由您的交叉验证策略定义的。
编辑
关于您的多类预测策略。是的,OVO 和 OVA (OVR) 确实存在,尽管现在预测多类软概率更为传统。通过 OVR,您将获得另一个维度𝐾,即类别数量。是的,从概念上讲,您可以分别调整每个 OVR 模型的超参数。您的计算结果将变为 𝑂(𝑀×𝑁×𝐾)。
关于python - 调整 SVM OVO 和 OVA 中的超参数以进行多类分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65580809/