使用 Gridsearch CV 执行多类分类时出错

机器算法验证 机器学习 支持向量机 scikit-学习 超参数 多级
2022-04-05 05:53:15

我正在尝试使用 SVC 作为基本估计器和 GridSearchCV 来调整我的结果来解决多类分类问题。下面提到的是代码和收到的错误:

svc_clf = SVC(C=0.7,tol=0.01,kernel='rbf',cache_size=500)
param_grid = {'C':np.linspace(0.1,1.0,10),'tol':[1e-7,1e-6,1e-5,1e-4,1e-3,1e-2,1e-1],'kernel':['rbf','poly'],'degree':[3,4,5,6,7]}

gs_svc = GridSearchCV(estimator=svc_clf,param_grid=param_grid,scoring='f1',cv=5)

gs_svc.fit(X_train,y_train)

以下是收到的错误:

ValueError: Target is multiclass but average='binary'. Please choose another average setting.

根据我的研究,我发现“f1-score”不适用于多类分类。请建议 GridSearchCV 应该使用哪个度量来解决多类分类问题?

2个回答

准确性可能看起来很诱人,但总的来说不是一个好的指标。在多标签分类中,对于每个类,我们将有f1分数、、precisionrecall等。您需要决定如何对它们进行平均,这就是错误的实际含义。选项是(binary是默认选项)、micromacroweightedsamplesbinary选项需要正类和负类,并且不适用于多标签问题。

重申sklearn上面链接的文档,micro选项TP,FP在全局范围内计算等,而macro它特定于每个类并对其进行平均。是考虑类不平衡weighted的平均加权版本。macro

并且,这个参数需要传入 scorer 函数,例如:

scorer = sklearn.metrics.make_scorer(sklearn.metrics.f1_score, average = 'weighted')
gs_svc = GridSearchCV(estimator=svc_clf,param_grid=param_grid,scoring=scorer,cv=5)

除了gunes的出色答案,您还可以使用几个评分功能:

scoring = {'accuracy': make_scorer(accuracy_score),
           'precision': make_scorer(precision_score, average = 'macro'),
           'recall': make_scorer(recall_score, average = 'macro'),
           'f1_macro': make_scorer(f1_score, average = 'macro',
           'f1_weighted': make_scorer(f1_score, average = 'weighted')}

gs_svc = GridSearchCV(estimator=svc_clf,param_grid=param_grid,scoring=scoring,cv=5)
gs_svc.fit(X_train,y_train)