调整 SVM OVO 和 OVA 中的超参数以进行多类分类
Posted
技术标签:
【中文标题】调整 SVM OVO 和 OVA 中的超参数以进行多类分类【英文标题】:Tuning hyper-parameters in SVM OVO and OVA for multiclass classification 【发布时间】:2021-04-11 07:35:34 【问题描述】:假设我正在处理一个多类分类问题(使用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)
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
分类器一个?我找不到关于这个主题的任何参考资料,所以我不知道分别为每个分类器找到最佳参数是否在概念上是错误的,或者是否有其他解释。
【问题讨论】:
【参考方案1】:我可以采用两种策略:One-Vs-One (OVO) 和 One-Vs-All (OVA)
你可以选择任何你喜欢的超参数调整策略——Leave-One-Out
、K-fold
、Randomized K-fold
——给定可用的计算资源和时间。归根结底(一周?)你的机器学习模型的泛化能力是最重要的。当谈到模型的学习和泛化能力时,最好将时间投入到特征工程上,而不是梳理所有可能的参数组合。说实话,你永远不会穷尽所有可能的组合,因为它们是以实数给出的。
为什么不搜索最好的超参数集,每个 N(N-1)/2 或 N 个分类器一个
我们为我们拥有的每个 ? 候选者都这样做,这是由超参数搜索空间的基数定义的
我们对我们拥有的每 ? 组验证子文件夹重复此操作,这些子文件夹由您的交叉验证策略定义。
编辑
关于您的多类预测策略。是的,OVO 和 OVA (OVR) 确实存在,尽管如今预测多类 softprobs 更为传统。使用 OVR,您将获得另一个维度 ?,即类数。是的,从概念上讲,您可以分别为每个 OVR 模型调整超参数。你的计算会变成?(?×?×?)。
【讨论】:
以上是关于调整 SVM OVO 和 OVA 中的超参数以进行多类分类的主要内容,如果未能解决你的问题,请参考以下文章
实现 GridSearchCV 和 Pipelines 以执行 KNN 算法的超参数调整