我试图根据这里的答案将GridSearchCV用于多类案例:
但我得到了价值错误multiclass format is not supported.
如何将此方法用于多类案例?
以下代码来自上述链接中的答案。
import numpy as np
from sklearn.datasets import make_classification
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
from sklearn.grid_search import GridSearchCV
from sklearn.metrics import accuracy_score, recall_score, f1_score, roc_auc_score, make_scorer
X, y = make_classification(n_samples=3000, n_features=5, weights=[0.1, 0.9, 0.3])
pipe = make_pipeline(StandardScaler(), SVC(kernel='rbf', class_weight='auto'))
param_space = dict(svc__C=np.logspace(-5,0,5), svc__gamma=np.logspace(-2, 2, 10))
accuracy_score, recall_score, roc_auc_score
my_scorer = make_scorer(roc_auc_score, greater_is_better=True)
gscv = GridSearchCV(pipe, param_space, scoring=my_scorer)
gscv.fit(X, y)
print gscv.best_params_
答案 0 :(得分:4)
来自roc_auc_score的文档:
注意:此实现仅限于标签指示符格式的二元分类任务或多标签分类任务。
通过"标签指示符格式",它们表示每个标签值表示为二进制列(而不是单个列中的唯一目标值)。您不希望为预测器执行此操作,因为它可能导致非互斥预测(即,对于案例p1预测标签2和4,或者预测案例p2没有标签)。
选择或自定义一个为多类问题定义明确的评分函数,例如F1 score。我个人认为informedness比F1得分更有说服力,而且比roc_auc_score更容易推广到多类问题。
答案 1 :(得分:1)
它支持多类
您可以设置scoring = f1.macro
的参数,例如:
gsearch1 = GridSearchCV(estimator = est1, param_grid=params_test1, scoring='f1_macro', cv=5, n_jobs=-1)
或得分= 'roc_auc_ovr'
答案 2 :(得分:0)
如果分类器默认为 y_true
和 y_pred
/y_score
提供正确的 API,它自然支持多类。
否则,必须使用诸如 make_scorer
之类的评分函数进行一些自定义。
对于common metrics,比如用于多类的 AUROC,sklearn 提供了 'roc_auc_ovr'
,它实际指的是
roc_auc_ovr_scorer = make_scorer(roc_auc_score, needs_proba=True,
multi_class='ovr')
如source file中一样。
用分类器处理多类问题,例如,LogisticRegression
,ovr
是必需的,y_true
是分类值的格式。以上设置直接生效。
二进制分类的一些其他指标也可以通过包装相应的函数来扩展。例如,average_precision_score
可以包装为
from sklearn.preprocessing import OneHotEncoder
def multi_auprc(y_true_cat, y_score):
y_true = OneHotEncoder().fit_transform(y_true_cat.reshape(-1, 1)).toarray()
return average_precision_score(y_true, y_score)
然后可以将 GridsearchCV 的度量定义为
{
'auprc': make_scorer(multi_auprc, needs_proba=True, greater_is_better=True)
}